ノード:Reminding People To Use Watches, 次:, 前:Finding Out Who Is Watching What, 上:Watches (CVS As Telephone)



Reminding People To Use Watches

監視機構は開発者全員の協力に全面的に依存しているということに、既にお 気づきだと思います。誰かが cvs edit をし忘れてファイルを編集し始めた 場合、変更がコミットされるまで、誰もそのことを知らないということになっ てしまいます。cvs edit というのは通常の開発のサイクルに入っておらず、 余分に手数のかかるものですから、忘れやすいと言えるでしょう。

CVS は cvs edit を使うよう強制はできませんが、そうするのを忘れないよ うな機構を持っています。それは、watch on コマンドです:

floss$ cvs -q co myproj
U myproj/README.txt
U myproj/foo.gif
U myproj/hello.c
U myproj/a-subdir/whatever.c
U myproj/a-subdir/subsubdir/fish.c
U myproj/b-subdir/random.c
floss$ cd myproj
floss$ cvs watch on hello.c
floss$

jrandom が cvs watch on hello.c を実行すると、これ以降の myproj のチェッ クアウトにおいて、作業コピー中の hello.c は読み出し専用で作成される ようになります。qsmith がそれをいじろうとすると、hello.c は読み出し 専用であることに気づき、まず cvs edit を実行することを思い出します:

paste$ cvs -q co myproj
U myproj/README.txt
U myproj/foo.gif
U myproj/hello.c
U myproj/a-subdir/whatever.c
U myproj/a-subdir/subsubdir/fish.c
U myproj/b-subdir/random.c
paste$ cd myproj
paste$ ls -l
total 6
drwxr-xr-x   2 qsmith    users        1024 Jul 19 01:06 CVS/
-rw-r--r--   1 qsmith    users          38 Jul 12 11:28 README.txt
drwxr-xr-x   4 qsmith    users        1024 Jul 19 01:06 a-subdir/
drwxr-xr-x   3 qsmith    users        1024 Jul 19 01:06 b-subdir/
-rw-r--r--   1 qsmith    users         673 Jun 20 22:47 foo.gif
-r--r--r--   1 qsmith    users         188 Jul 18 01:20 hello.c
paste$

こうすると、ファイルは読み書きできるようになります。編集してコミット すると、また読み出し専用になります:

paste$ cvs edit hello.c
paste$ ls -l hello.c
-rw-r--r--   1 qsmith    users         188 Jul 18 01:20 hello.c
paste$ emacs hello.c
  ...
paste$ cvs commit -m "say hello in Aramaic" hello.c
Checking in hello.c;
/usr/local/newrepos/myproj/hello.c,v  <--  hello.c
new revision: 1.12; previous revision: 1.11
done
paste$ ls -l hello.c
-r--r--r--   1 qsmith    users         210 Jul 19 01:12 hello.c
paste$

彼の edit と commit は hello.c の監視者全員に通知されます。jrandom は監視者でなくてもかまわないことに注意してください。cvs watch on hello.c を実行しても、jrandom はそのファイルの監視者リストの一員になっ たりはしないのです。ただ読み出し専用でチェックアウトされるように指定 しただけになります。ファイルを監視したい人は自分を監視者リストに加え るのを忘れないようにする必要があります。CVS はその面倒は見ません。

ファイルひとつについて watch on するのは例外的な状況です。一般にはプ ロジェクト全体を watch on するのが普通です:

floss$ cvs -q co myproj
U myproj/README.txt
U myproj/foo.gif
U myproj/hello.c
U myproj/a-subdir/whatever.c
U myproj/a-subdir/subsubdir/fish.c
U myproj/b-subdir/random.c
floss$ cd myproj
floss$ cvs watch on
floss$

このアクションはプロジェクト全体についてのポリシーをアナウンスするの に等しいです: 「ファイルをいじるときは cvs edit を使って監視してる人 に知らせてね。興味があったり、担当のファイルは自由に監視してください」 プロジェクト中の全ファイルは読み出し専用でチェックアウトされますので、 何かいじろうとすると cvs edit をしなければならないのを思い出すことで しょう。

おもしろいことに、監視されているファイルをチェックアウトすると読み出 し専用になるのに、アップデートではそうはなりません。jrandom が cvs watch on する前に既に qsmith が作業コピーをチェックアウトしていたと すると、qsmith のファイルはアップデートしても読み書きできるままにな ります。しかし、jrandom が watch on した後でコミットしたファイルは読 み出し専用になります。jrandom が watch off しても、

floss$ cvs watch off

qsmith の読み出し専用ファイルは自動的に読み書きできるようになったり はしません。一方、コミット後に読み出し専用には戻らなくなります(watch on のままだと読み出し専用に戻ります)。qsmith がひねくれていて、 cvs edit を全く避けて chmod コマンドで作業コピー中 のファイルを書込み可にしたとします

paste$ chmod u+w hello.c

またはこのように全部一挙に

paste$ chmod -R u+w .

したとします。

こういう風なことをされると CVS には手も足も出ません。もともと作業コ ピーというのはプライベートなサンドボックスなのです。監視機構は the watch features can open them up to public scrutiny a little bit, but only as far as the developer permits. Only when a developer does something that affects the repository (such as commits) is her privacy unconditionally lost.

watch add, watch remove, watch on, watch off の関係はちょっとわかり にくいかもしれません。全体の規則をまとめるとこうなります:

addremove はそのファイルの監視者リストにユーザを追 加したり、削除したりするもので、チェックアウト時やチェックアウト後に ファイルを読み出し専用にしたりはしません。onoff は ファイルのパーミッションについてのものです。ファイルの監視者リストに 居るユーザをどうこうしたりはしません。開発者に監視ポリシーを思い出し てもらうために作業コピー中のファイルを読み出し専用にするだけです。

ちょっと一貫していないように見えるかもしれません。監視機構を使うとい うのは、ある意味で CVS の本質に反しています。複数の開発者が自分の作 業コピー内で自由に編集し、そのことはコミットするまでお互いから見えな い、という理想世界からそれることになります。監視機構は開発者が自分の 作業コピーで何をしているかお互いに知らせるために CVS が提供している 便利な方法なのです。しかし監視ポリシーを強制する方法はありませんし、 編集セッションがどのように構成されるかについて絶対的なコンセプトがあ るわけでもありません。まあそれでも監視機構が役に立つような状況もある のです。