次: , 前: Repository storage, 上: Repository


2.3 リポジトリでのデータの保存方法

しばしば表面に現れてくるかもしれない cvs の内部についての話をして いる間に、cvs が作業ディレクトリの CVS ディレクトリに何を 入れるかも話した方が良いでしょう。リポジトリと同様に、cvs がこの 情報を扱い、普通は cvs のコマンドを通してだけそれを使用します。で も、ときにはそれを覗くのも良いでしょうし、グラフィカル・ユーザ・インター フェース の jCVS や emacs のための VC パッケージなどの他 のプログラムがそれを見る必要があるかもしれません。そのようなプログラム は、上で書いたプログラムやコマンド行 cvs クライアントの将来のバー ジョンを含む、そのファイルを使う他のプログラムと協調して動作しようと望 むなら、この節の推奨規格に従う必要があります。

CVS ディレクトリには複数のファイルがあります。このディレクトリ を読むプログラムは、将来の拡張の余地を残すために、ディレクトリには存在 するけれどここで説明されていないファイルは静かに無視するのが望ましいで す。

ファイルは使用しているシステムのテキストファイルの習慣に従って保存され ます。これはテキストファイルの保管の習慣が違うシステム間では作業ディレ クトリは可搬性が無いということです。これは意図的になされていて、おそら く CVS で管理されているファイル自体がそのようなシステム間では可搬性が ないであろう、という理由に基づいています。

Root
このファイルは Specifying a repository で説明されているように、 現在の cvs のルートを保持しています。


Repository
このファイルは現在のディレクトリが対応するリポジトリでのディレクトリを 保持しています。指定は絶対パス名と相対パス名のどちらでも可能です。 cvs は少なくともバージョン 1.3 くらいから両方の形式を読み込む能力 を備えています。相対パスはルートからの相対位置で、より賢い方法ですが、 絶対パス名は非常によく使われており、実装は両方を受け付けることが望まれ ます。例えば、以下のコマンドの後で
          cvs -d :local:/usr/local/cvsroot checkout yoyodyne/tc
     

Root は以下のようになり

          :local:/usr/local/cvsroot
     

Repository は

          /usr/local/cvsroot/yoyodyne/tc
     

か

          yoyodyne/tc
     

のどちらかになります。

特定の作業ディレクトリがリポジトリのディレクトリに対応しなければ、 Repository は CVSROOT/Emptydir になっているはずです。


Entries
このファイルは作業ディレクトリ中のファイルとディレクトリの一覧を挙げて います。 各行の最初の文字はそれがどんな行かを示します。将来の拡張ができるように、 文字を認識できない場合は、ファイルを読み込んでいるファイルは暗黙にその 行を飛ばすことが望まれます。

最初の文字が `/' であれば、様式は:

          /name/revision/timestamp[+conflict]/options/tagdate
     

で、`[' と `]' は登録の一部ではありませんが、その代わりに `+' と衝突の印は省略任意であることを示しています。name はディ レクトリ中のファイルの名前です。revision は作業中のファイルの元 のリビジョンで、`0' の場合は追加されたファイル、`-' の後にリ ビジョンは削除されたファイルです。timestamp は cvs がファイ ルを作成したときのタイムスタンプです。タイムスタンプがファイルの実際の 修正時刻と違えば、ファイルは修正されたということです。それは ISO C astime() 関数で使われる様式で保存されます (例えば、`Sun Apr 7 01:29:26 1996')。ファイルが常に修正されていると見なされるように、例え ば、`Result of merge' のようにその様式とは違う文字列を書くかもし れません。これは特別な場合ではありません。ファイルが修正されたかどうか を調べるために、プログラムはファイルのタイムスタンプを単純に timestamp と文字列比較をするべきです。衝突があれば、 conflict は、ファイルが衝突の印とともに書き込まれた後でファイル の修正時刻に設定することができます (see Conflicts example)。 もし conflict がその後も実際の修正時刻と同じであるなら、ユーザは明か に衝突を解消していません。options は貼り付けられたオプションを保 持しています (例えば、バイナリ・ファイルのための `-kbd')。 tagdate は `T' の後にタグ名が続いているか、日付 (date) の `D' で、貼り付けられたタグか日付がつづいているかのどちらかを保持 しています。timestamp が単独のタイムスタンプではなく、スペースで 分離されたタイムスタンプの対であるなら、cvs 1.5 より前のバージョ ンの cvs を扱っているということに注意してください (ここでは説明さ れていません)。

CVS/Entries のタイムスタンプの標準時 (ローカルもしくは共通時) はオペレー ティングシステムがファイル自身のタイムスタンプとして保存するものと同じ である必要があります。例えば、Unix ではファイルのタイムスタンプは共通 時刻 (UT) ですので、CVS/Entries のタイムスタンプもそうなっているべきで す。vms ではファイルのタイムスタンプはローカル時刻なので、 vms 上の cvs はローカル時刻を使うべきです。この規則は、標準 時が変わったためだけでファイルが修正されたようにならないためです (例え ば、サマータイムになったり、それが終わったときなどです)。

Entries の行の最初の文字が `D' であると、それはサブディレ クトリを現しています。行が `D' だけのときは、 Entries ファ イルを書いたプログラムはサブディレクトリを記録したということを現します (ですから、そのような行があって、他に `D' で始まる行がなければ、 サブディレクトリがないことがわかります)。そうでなければ、行は次のよう になっています:

          D/name/filler1/filler2/filler3/filler4
     

ここで name はサブディレクトリの名前であり、将来の拡張のために、 全ての filler 部分は暗黙の内に無視されるべきです。Entries を修正するプログラムはこれらの部分を保存するのが望まれています。

ファイル Entries 中の行はどんな順番でも構いません。


Entries.Log
このファイルは Entries に無いさらなる情報を記録することはありま せんが、Entries ファイル全体を再書き込みすることなく、情報を更 新するための方法をもたらし、その中には Entries と Entries.Log を書いているプログラムが不意に異常終了しても情報を 保護する機能もあります。Entries ファイルを読み込むプログラムは Entries.Log も調べるべきです。後者が存在すれば、Entries を読み込んで、Entries.Log にある変更を適用すべきです。変更を適 用した後で、Entries を再度書き込んで、Entries を消去する 習慣が推奨されています。Entries.Log の行の様式は、単独文字コマ ンドがあり、その後にスペースが続き、その後は Entries の行に指定 された様式になります。単独文字コマンドは登録が追加されたことを示す `A' と登録が消去されたことを示す `R' か、Entries の登 録行は暗黙に無視されるべきことを示す他の文字です (将来の拡張のため)。2 番目の文字が Entries.Log の行の2番目の文字がスペースでないと、 それは cvs の古いバージョンで書かれています (ここでは説明されてい ません)。

読み込みではなく、書き込みをしているプログラムは、もし望むならば Entries.Log ファイルを安全に無視することもできます。


Entries.Backup
これは一時ファイルです。推奨された使用法は、新しい Entriy ファイルを Entries.Backup に書き、それから Entries に改名する (もし 可能なら原子的操作で) ことです。


Entries.Static
このファイルが関連する唯一のことはそれが存在するか否か、ということです。 もし存在すると、ディレクトリの一部分だけが取得されていて、cvs は そのディレクトリに追加のファイルを作成しないということです。それを消去 するためには、update コマンドを `-d' オプションとともに使っ てください。そうすれば、追加のファイルを取得して、 Entries.Static を消去します。


Tag
このファイルはディレクトリごとの貼り付いたタグを保持します。最初の文字 は枝のタグには `T'、枝でないタグは `N'、日付は `D' にな り、他の文字は、将来の拡張のため暗黙に無視されるべきとなっています。こ の文字の後にタグや日付が続きます。ディレクトリごとの貼り付きタグや日付 は新規に追加されたファイルに適用されること等に使用されることに注意して ください。貼り付きタグと日付に関する一般的な情報は Sticky tags を参照してください。


Checkin.prog
Update.prog
これらのファイルはそれぞれ modules ファイルの `-i' と `-u' オプションで指定されたプログラムを保存します。


Notify
このファイルはまだサーバに送信されていない通知 (例えば、edit や unedit のため) を保存します。書式はまだここでは説明されていませ ん。


Notify.tmp
このファイルと Notify の関係は Entries.Backup と Entries の関係と同じです。即ち、Notify を書くためにはま ず新しい内容を Notify.tmp に書き、それから (可能であれば自動的 に) それを Notify に改名します。


Base
監視を使用していると、edit コマンドはファイルの元のコピーを Base ディレクトリに保存します。これで、サーバと通信できないとき でさえ unedit コマンドが実行できるようになります。


Baserev
このファイルは Base ディレクトリのそれぞれのファイルのリビジョ ンを一覧にします。書式は:
          Bname/rev/expansion
     

で、expansion は将来の拡張のために、無視されるべきものです。


Baserev.tmp
このファイルと Baserev の関係は Entries.Backup と Entries との関係と同じです。即ち、Baserev に書くために、 まず新しい内容を Baserev.tmp に書き、それから (もし可能なら自動 的に) それを Baserev に改名します。


Template
このファイルには rcsinfo ファイルで指定された雛型が入っています (see rcsinfo)。それはクライアントだけに使われます。非クライアント/ サーバ型 cvs は直接 rcsinfo ファイルを調べます。