svn ファイルシステムのダンプ/リストアのフォーマットに関する提案 (Ben Collins-Sussman)

Original: http://svn.apache.org/viewvc/subversion/trunk/notes/fs_dumprestore.txt
Latest: http://svn.apache.org/repos/asf/subversion/trunk/notes/dump-load-format.txt
svn ファイルシステムのダンプ/リストアのフォーマットに関する提案。
解決したい二つの問題
====================
 1. node-id の形式を変更すると、すべてのデータを移行しなくてはならなく
 なってしまう(dump と restore によって)
 2. バックアップの形式を用意すること。いつかは別のソフトウェアツールに
 よって読めるようにすること。
設計の目標
==========
 A. svn_fs.h に新たに二つの関数を追加すること。新しい 'svnadmin' のサ
 ブコマンドによって起動されるように。
 B. ファイル形式は fs の時間に関係しない概念だけを使って設計されること。
 ダンプ形式は私たちが *理解している* 決して変更されることのないく
 らい十分一般的な概念だけを参照する必要がある。これらの概念は内部
 的ないかなる node-id の形式とも独立に存在する必要がある、あるいは
 バックエンドの DB 保存形式からも独立していなくてはならない。言い
 換えると2000年5月に考えた、われわれのもともとの基本的な "設計仕様
 " に基づいたものであること。
ファイル形式の意味
==================
私たちの fs の時間概念に依存しないような設計のセマンティクスは以下で
ある -- これが私たちのダンプ形式に保存されるものになるだろう。
 - ファイルシステムはツリーの並びである。
 それぞれのツリーは "リビジョン" と呼ばれ、バージョン化対象とはな
 らない属性が付随している。
 - リビジョンはそこにぶらさがっている "ノード" のツリーを持っている。
 実際にはファイルシステム中のノードは DAG を構成する。ひとつの
 リビジョンは常にある初期ノードを指している。これはあるツリーの
 'ルート' を表現したものである。
 
 - ツリーのノードの大部分はそれ以前に作られたツリーのノートに対する
 ハードリンク(参照) になる。
 - ノードは以下のものを含む 
 - バージョン化されたテキスト
 - バージョン化された属性
 - 先行するノードの履歴: "自分はどのノードから派生したものなのか?"
 - コピー履歴: "自分はどのノードのコピーなのか?"
 履歴は存在しない(これはそのノードが完全に新規に作られたことを意味
 する)か、{リビジョン, パス}の値を持つかのどちらかになる。
------------------------------------------------------------------------
Proposal #2 の詳細化: (グレッグスタインとの議論の後)
=====================
それぞれのノードは RFC822 形式のヘッダで始まる。最後のヘッダは
'Content-length:' であり、その後に内容が続くのでレコードの区切り位置を
推測することができる。
レコード内容の部分は二つに分割される: プロパティー情報のハッシュと完全
なテキストである。この二つのセクションの区切りは属性ハッシュの最後に
"PROPS-END\n" タグを置いて示す。ディレクトリのノードやリビジョンの場合
は属性ハッシュだけが存在する。
-----------------------------------------------------------------
SVN ダンプファイル、バージョン1 形式
この形式はダンプ形式のバージョン番号で始まり
("SVN-fs-dump-format-version: 1\n") リビジョンレコードの並びが続く。そ
れぞれのリビジョンレコードはリビジョンに関する情報で始まり、そのリビジョ
ンで変更のあったノードが可変個続く。[かどかっこ] でくくったフィールド
はオプションで、認識できないヘッダは常に無視される。これは下位互換性を
保つためである。
Revision-number: N
Prop-content-length: P
Content-length: L
 ...P バイトの属性データ。属性は作業コピー属性ファイルで利用されるの
 と同じ人間が読める形のハッシュダンプ形式で保存される。ただし最後は
 より見やすくするため "PROPS-END\n" で終わる。
Node-path: /absolute/path/to/node/in/filesystem
Node-kind: file | dir (1)
Node-action: change | add | delete | replace
[Node-copyfrom-rev: X]
[Node-copyfrom-path: /path ]
[Text-copy-source-md5: blob] (2)
[Text-content-md5: blob]
[Text-content-length: T]
[Prop-content-length: P]
Content-length: Y (3)
 ... Y バイトのデータ内容がくる。これは P バイトの "属性" データとT 
 バイトの "テキスト" データに分割される。属性が先にくる; その全体の
 長さ(書式を含めた)は Prop-content-length とNode-content-length にな
 る。"PROPS-END\n" 行は属性が存在する場合には常に属性セクションの最
 後にくる。Y バイトの残りは(これは Text-content-length と同じである
 だろうが)ノードの内容を表現している。
注意:
(1) ノードが削除を表現しているときにはこのフィールドはオプションとなる。
(2) これはコピー元のチェックサムになる。ローダーはこのチェックサムによっ
 てファイルシステム中にすでに存在するコピー元のパス/リビジョンが本
 当に *正しい* ものであるかどうかを判断する。
(3) Content-length ヘッダは技術的には不要である。この情報は(そしてそれ
 以上の情報が)Prop-content-length と Text-content-length のフィール
 ドにあるからである。Subversion 自身はダンプファイルを読み取るとき
 にこの情報を使うことはないが RFC822 パーサとの互換性を保つためこの
 フィールドも含める。
(4) 実際には 2 種類のバージョン 1 ダンプストリームが存在する。通常のも
 のは r2634(svn 0.14.0) から導入されたものである。フィルものもバー
 ジョン 1 であると言われるがブロックヘッダにProps-content-length と 
 Text-content-length のフィールドが存在しない。当時は *常に* 属性ブ
 ロックが存在していたのだ。
-----------------------------------------------------------------
例
リビジョン 1422 の例を以下に示す。ここで私は新しいディレクトリ "baz"
を追加し、新しいファイル "bop" をその中に追加し、さらに "foo.c" を
修正したものとする。
Revision-number: 1422
Prop-content-length: 80
Content-length: 80
K 6
author
V 7
sussman
K 3
log
V 17
Added two files, changed a third.
PROPS-END
Node-path: bar/baz
Node-kind: dir
Node-action: add
Prop-content-length: 35
Content-length: 35
K 10
svn:ignore
V 4
TAGS
PROPS-END
Node-path: bar/baz/bop
Node-kind: file
Node-action: add
Prop-content-length: 76
Text-content-length: 54
Content-length: 130
K 14
svn:executable
V 2
on
K 12
svn:keywords
V 15
LastChangedDate
PROPS-END
Here is the text of the newly added 'bop' file.
Whee.
Node-path: bar/foo.c
Node-kind: file
Node-action: change
Text-content-length: 102
Content-length: 102
Here is the fulltext of my change to an existing /bar/foo.c.
Notice that this file has no properties.
-------------------------------------
SVN ダンプファイル、バージョン2 形式
この書式は以下を除いて バージョン1 の書式とまったく同じです:
1.) フォーマットはダンプ形式の新しいバージョン番号で始まること
 ("SVN-fs-dump-format-version: 2\n").
2.) "リビジョンレコード" に加えて、別のレコードがサポートされたこと:
 つまり "UUID" レコードがそれで以下の形をしている:
UUID: 7bf7a5ef-cabf-0310-b7d4-93df341afa7e
 これは元のリポジトリの UUID 値を示すのに利用される。
-------------------------------------
SVN ダンプファイル、バージョン3 形式
この形式はバージョン 2 と以下を除いて同一です:
1.) フォーマットはダンプ形式の新しいバージョン番号で始まること
 ("SVN-fs-dump-format-version: 3\n").
2.) ノードの変化を示す二つの新しいオプションヘッダが追加されたこと:
[Text-delta: true|false]
[Prop-delta: true|false]
 この二つのヘッダのデフォルトの値は "false" です。"true" に設定
 するとテキストと属性の内容はノードの直前の内容との差分として扱われます。
 (直前のノードは追加の場合は履歴に対するコピー履歴、また修正の場合には
 直前のリビジョンの値によって決まります)。
属性の差分は以下の 2 点を除いて通常の属性リストと同じ書式です。例外は
(1) ノードの直前の内容と同じ値の属性は表示されないことと、(2) 削除された
属性は
D 

のように表示されることです。後の場合、表示内容自体は通常の属性表示と同
じですが、"K " の代わりに "D " になり、値の部分がありません。
テキスト差分は svndiff ウィンドウの並びとして出力されます。

AltStyle によって変換されたページ (->オリジナル) /