ノード:What Watches Look Like In The Repository, 前:Reminding People To Use Watches, 上:Watches (CVS As Telephone)



What Watches Look Like In The Repository

ブラックボックスと要らぬ神秘を打ち消すため、リポジトリ中で監視機構が どう実装されているかちょっと覗いてみることにしましょう。でも pretty ではないので、ほんとにちょっと覗くだけですよ。

監視するよう設定すると

floss$ pwd
/home/jrandom/myproj
floss$ cvs watch add hello.c
floss$ cvs watchers
hello.c jrandom edit    unedit  commit
floss$

CVS は適切なリポジトリのサブディレクトリ中のある特殊なファイル CVS/fileattr にそれを記録します:

floss$ cd /usr/local/newrepos
floss$ ls
CVSROOT/   myproj/
floss$ cd myproj
floss$ ls
CVS/          a-subdir/     foo.gif,v
README.txt,v  b-subdir/     hello.c,v
floss$ cd CVS
floss$ ls
fileattr
floss$ cat fileattr
Fhello.c        _watchers=jrandom>edit+unedit+commit
floss$

リポジトリに中の CVS サブディレクトリに fileattr が保存されるからと いって、リポジトリが作業コピーになったわけではありません。単に、 CVS という名前が既に作業コピー中で図書管理用に予約されているの で、リポジトリ中にその名前のサブディレクトリを作るようなプロジェクト は存在しないというのを確信できるから、という理由によります。

fileattr の形式をきちんと説明したりはしません。コマンドごとに そのファイルが変わるのを見るだけで理解できると思います。

floss$ cvs watch add hello.c
floss$ cat /usr/local/newrepos/myproj/CVS/fileattr
Fhello.c        _watchers=jrandom>edit+unedit+commit
floss$ cvs watch add README.txt
floss$ cat /usr/local/newrepos/myproj/CVS/fileattr
Fhello.c        _watchers=jrandom>edit+unedit+commit
FREADME.txt     _watchers=jrandom>edit+unedit+commit
floss$ cvs watch on hello.c
floss$ cat /usr/local/newrepos/myproj/CVS/fileattr
Fhello.c        _watchers=jrandom>edit+unedit+commit;_watched=
FREADME.txt     _watchers=jrandom>edit+unedit+commit
floss$ cvs watch remove hello.c
floss$ cat /usr/local/newrepos/myproj/CVS/fileattr
Fhello.c        _watched=
FREADME.txt     _watchers=jrandom>edit+unedit+commit
floss$ cvs watch off hello.c
floss$ cat /usr/local/newrepos/myproj/CVS/fileattr
FREADME.txt     _watchers=jrandom>edit+unedit+commit
floss$

fileattr 中のレコードを編集してみたりしましょう。qsmith が自分自身を 編集者として登録したときに起こることを見てみます:

paste$ cvs edit hello.c

floss$ cat /usr/local/newrepos/myproj/CVS/fileattr
Fhello.c        _watched=;_editors=qsmith>Tue Jul 20 04:53:23 1999 GMT+floss\
+/home/qsmith/myproj;_watchers=qsmith>tedit+tunedit+tcommit
FREADME.txt     _watchers=jrandom>edit+unedit+commit

そのディレクトリのファイル全部に監視者も編集者もいなくなると、CVS は fileattr ファイルも CVS サブディレクトリも削除してしまうことに注 意して下さい:

paste$ cvs unedit

floss$ cvs watch off
floss$ cvs watch remove
floss$ cat /usr/local/newrepos/myproj/CVS/fileattr
cat: /usr/local/newrepos/myproj/CVS/fileattr: No such file or directory
floss$

こうやってちょっと見てみるとおわかりの通り、fileattr のフォーマット の解釈の詳細は CVS に任せておいたほうがよいです。

そのフォーマットについて理解するのは、舞台裏でなにが起こっているのか 知って満足するというのを置いておくとすると、CVS の監視機構の拡張を書 くとか、そのへんをデバッグするとかが主な理由だと思います。普通はリポ ジトリの中に CVS/ サブディレクトリができたからといってびっくりしない 程度で十分です。CVS/ サブディレクトリは CVS にとって、監視者リストの ようなメタ情報を安全に保存しておける唯一の場所なのです。