[目次へ][7章へ][7.2へ][7.4へ] 最終更新:$Date: 2002/09/10 05:22:12 $

データの取り直しと、画面の撮り直しが必要。ふみ。

※1.11.2はwatchの実装がバグってるくさい。

複数ユーザーバー忘れてました。


■■ 7.3 監視のためのコマンドたち

■■■ 7.3.1 監視の強制を開始してみよう(watch on)
■■■ 7.3.2 ファイル/モジュール監視を開始してみよう(watch add) 
■■■ 7.3.3 監視者を眺めてみよう(watchers)
■■■ 7.3.4 編集を開始してみよう(edit)
■■■ 7.3.5 編集者を眺めてみよう(editors)
■■■ 7.3.6 コミットしてみよう(commit)
■■■ 7.3.7 編集を途中放棄してみよう(unedit(release))
■■■ 7.3.8 ファイル/モジュールの監視をやめてみよう(watch remove)
■■■ 7.3.9 監視の強制を止めてみよう(watch off)


■■7.3 監視のためのコマンドたち

CVSの日常作業で使用するコマンドでは、主にチェックアウトとコミットくらいしか、作業状態を知ることができません。つまり、自分が担当してるファイルの作業コピーが誰かにチェックアウトされていることを知ることはできても、編集されているかどうかは、その人がコミットをしてくるまでは分かりません。それでは困るというときに、もう少し細かく作業状態を調べることのできるコマンド群が、CVSには用意されています。要するに、「今から編集するよーん。気をつけてね〜」と声をかける代わりに、CVSに代行してもらう仕組みです。

この監視のための仕組みで使用されるコマンドは、watch、edit、unedit(release)、commit、watchers、editorsコマンドです。以下では、その機能と関わり合いについて説明してみようと思います。なお、notifyファイルによる通知を設定する話については次の7.4節で説明したいと思います。

この機能はあくまでも、トラブルが生じそうな状態をなるべく早く知ることができるように支援しているにすぎません。また、editコマンドを使うことを厳しく他の人に強いることもできません。この機能の使用においては、開発者間の意志疎通が十分なされていることが必要条件となってきます。つまり、watch add、watch onする前に他の開発者にそのことを話しておくべきです。勝手に導入されてしまうと、他の開発者はムッとしてしまうかも知れませんし、気づかずにchmodで許可を出して編集を続けるかも知れません。そうしたお互いの意志疎通を大事にした上で、「作業を支援するもの」としてこうした機能を使っていってください。うまく使えば、心強い味方となります。

話を進める前に、ここで使用するテストユーザたちの設定とテストモジュールについて説明しておきます。テストユーザには、7.1.3項で使用したapple、orange、grapeに再度登場願うことにします。readers、writersの制限が残っていたら解除しておいてください。そして、テストモジュールとしtは新たに、test1.txt、tset2.txt、test3.txtという3つのファイルを含む、watchtestモジュールを用意します。

せっかく、複数人で作業を行うので、grapeにはWinCvsを使用してもらうことにしましょう。orangeが監視機構の導入者で、appleはUNIXマシンのコマンドライン利用者としましょう。そうした状態として話を進めていきます。

■■■7.3.1 監視の強制を開始してみよう(watch on)

watchコマンドの書式は【図7.3.1】のようになります。

【図7.3.1】watchコマンドの書式
▼
cvs watch [on|off|add|remove] [-lR] [[-a 操作]...] [ファイル群...]
▲

watchコマンドにはon、off、add、removeという4つのサブコマンドがあり、これで動作を切り替えます。-aオプションで指定するのは操作種別で、edit、unedit、commitの3種類が指定できます。それぞれ、edit、unedit(release)、commitに対応しています。-aオプションは複数回指定できます。なお、指定しなければ、3種類すべてが対象となります。最後に対象となるファイルを複数個指定することができます。省略した場合には、そのディレクトリ(以下)が対象になります。

watchコマンドには、2つのまったく異なる機能があります。1つはあるファイルに対して監視者を追加および削除する機能で、サブコマンドのうちのadd(追加)とremove(削除)でおこないます。もう一方は、対象ファイルを取り出すときには必ず、読み取りのみになるように設定および設定解除する機能で、残りのサブコマンドon(設定)とoff(設定解除)で指定します。

後者の機能は、editコマンドを実行して編集を開始するように他の人に強いることを目的としています。なぜなら、普通に書き込める状態ではeditコマンドを実行せずに編集できてしまうため、わざわざ「editコマンドを実行してから編集を開始しよう」とはあまり思わないためです(よほど律儀な人なら別ですけど、筆者はズボラなのでまずしません)。

ということでまず、他の人がeditを実行するのを忘れないように、orangeに作業コピーを取り出してもらったあと、おもむろにその作業コピーに移動、cvs watch onコマンドを実行してもらいましょう【図7.3.2】。

【図7.3.2】orangeとしてwatchtestモジュールの監視を開始する
▼
[orange]% cvs -d -d :pserver:orange@localhost:/home/cvsroot checkout watchtest
cvs checkout: Updating watchtest
U watchtest/test1.txt
U watchtest/test2.txt
U watchtest/test3.txt
[orange]% cd watchtest
[orange]% cvs watch on
▲

ちなみに、WinCvsにはwatch add、watch removeに対応するメニューはありますが、watch on、watch offに対応するメニューはありません。watch on、watch offを使用したい場合はコマンドライン入力を使用してください。

■■■■ チェックアウトして確認

ここで、appleとしてテストモジュールを取り出してみましょう【図7.3.3】。

【図7.3.3】appleとしてwatchtestモジュールを取り出してみる。
▼
[apple]% cvs -d :pserver:apple@localhost:/home/cvsroot checkout watchtest
cvs server: Updating watchtest
U watchtest/test1.txt
U watchtest/test2.txt
U watchtest/test3.txt
▲

この状態でwatchtestディレクトリに含まれるファイルを見てみる【図7.3.4】と、いつもと違ってファイルに書き込み許可が出ていません【図7.3.4 5-7行目】。watch onの効果が出ているわけですが、よく知らない人がこういう状態になってしまったらビックリしますよね?しかし、こういうときには、いきなりchmod u+wなどで書き込み許可を出すのではなく、他の人にwatch onしたのかどうか聞いてください。そしてもし、間違いならwatch offで解除してください。

【図7.3.4】おや書き込み許可がない…
▼
[apple]% cd watchtest
[apple]% ls -l
total 16
drwxrwxr-x    2 mika     users        4096 Sep  7 13:41 CVS
-r--r--r--    1 mika     users          16 Sep  7 13:16 test1.txt
-r--r--r--    1 mika     users          25 Sep  7 13:16 test2.txt
-r--r--r--    1 mika     users          24 Sep  7 13:16 test3.txt
▲
grapeにもチェックアウトしてもらうと、【図7.3.5】のように書き込み禁止になっています。

【図7.3.5】 こっちも書き込み許可がないよう

■■■ 7.3.2 ファイル/モジュール監視を開始してみよう(watch add) 

さらにorangeには、その作業コピー内にいる状態でcvs watch addを実行して、モジュールに含まれる各ファイルの監視者になってもらいます【図7.3.6】。

【図7.3.6】orangeがwatchtestモジュールの監視を開始する
▼
[orange]% cvs watch add
▲

一方、grapeにはWinCvsから監視者になってもらうことにします。WinCvsでモジュールの監視を開始するには、対象モジュールを選んだ状態で、メニュー[トレース(T)]→[編集の監視]【図7.3.7】もしくは複数ユーザバーの監視アイコンを実行します。

【図7.3.7】 [トレース(T)]→[編集者の表示]メニュー

【図7.3.8】のようなメッセージが出れば特に問題はありません。

【図7.3.8】
▼
cvs watch add (ディレクトリ C:\home\mika\workcopy\watchtest\ 内)

*****CVS はコード 0 で終了しました*****
▲

■■■7.3.3 監視者を眺めてみよう(watchers)

さてここで、監視者はどういう状態になっているのでしょうか。あるファイルを監視している人の一覧を眺めるにはwatchersコマンドを使用します。watchersの書式は【図7.3.9】のようになります。

【図7.3.9】watchersコマンドの書式
▼
cvs watchers [-lR] [ファイル群...]
▲

早速、appleに「この、ファイルたちは誰に監視されているのかなぁ」と呟きながらwatchersコマンドを実行してもらいましょう【図7.3.10】。

【図7.3.10】watchtestモジュールの監視状態はどうなっているかな?
▼
[apple]% cvs watchers
test1.txt       orange  edit    unedit  commit
        grape   edit    unedit  commit
test2.txt       orange  edit    unedit  commit
        grape   edit    unedit  commit
test3.txt       orange  edit    unedit  commit
        grape   edit    unedit  commit
▲

test1.txt、test2.txt、test3.txtの全てのファイルに、edit、unedit、commitの各操作について監視が設定されていることがわかります。【図7.3.1】のコマンドの書式設定のところで説明したように、この操作種別はwatch add onのときに-aオプションで指定することができます。例えばeditだけ監視したい場合には-a editというように指定します。

一方、grapeがWinCvsでwatchersを実行するには、メニュー[トレース]→[監視者の表示]【図7.3.11】を選択します。

【図7.3.11】 [トレース]→[監視者の表示]メニュー ※XP撮り直し

すると、アウトプット領域に【図7.3.12】のように表示されるはずです。appleが見たのと同じなんですけどね。

【図7.3.12】監視状態はグラフィカルには出てこないね
▼
cvs watchers (ディレクトリ C:\home\mika\workcopy\watchtest\ 内)
test1.txt	orange	edit	unedit	commit
	grape	edit	unedit	commit
test2.txt	orange	edit	unedit	commit
	grape	edit	unedit	commit
test3.txt	orange	edit	unedit	commit
	grape	edit	unedit	commit

*****CVS はコード 0 で終了しました*****
▲

ちなみに、知らないうちに書き込み許可が出てこなくなったときに、watchersコマンドを実行するのはいい考えです。ファイルに監視者がいたら、きっとその人が犯人に違いありません。慌てずに、「ああ、cvs watch onしたんだな」と考え、cvs editを使ってください。どうしても知らせたくないと思ったらchmod u+wでもよいのですけどね…。編集者がchmodを使って書き込み許可を出してしまうのを止めることまではできません。この仕組みは、あくまでもCVSの機構を理解した人が、自分の意志で使うためのものです。

ここでは、同意されているということで、editコマンドを使って編集を進めていきましょう。

■■■7.3.4 編集を開始してみよう(edit)

editコマンドは、そのファイルの監視者に編集を開始することを通知するためのコマンドです。なお、このコマンドを実行すると自分も監視者のリストに加えられます。editコマンドの書式は【図7.3.13】のようになります。特別なオプションは何もありません。

【図7.3.13】editコマンドの書式
▼
cvs edit [-lR] [ファイル群...]
▲

それでは、cvs editでtest1.txtの編集を開始すると宣言しましょう【図7.3.14】。

【図7.3.14】appleがeditをtest1.txtに対して実行する
▼
[apple]% cvs edit test1.txt
▲

コマンド実行後、ファイルの一覧を見てみる【図7.3.15】と、test1.txtに書き込み許可が出て、編集可能状態になったことがわかります。

【図7.3.15】書き込み許可が出たぞ
▼
[apple]% ls -l
total 16
drwxrwxr-x    3 mika     users        4096 Sep  7 14:30 CVS
-rw-rw-r--    1 mika     users          16 Sep  7 13:16 test1.txt
-r--r--r--    1 mika     users          25 Sep  7 13:16 test2.txt
-r--r--r--    1 mika     users          24 Sep  7 13:16 test3.txt
▲

ついでに、grapeにもeditコマンドを実行してみてもらいましょう。WinCvsでeditコマンドを実行するには、対象とするファイルを選んだ状態でメニュー[トレース]→[編集の開始]【図7.3.16】を選択するか、複数ユーザーバーの編集アイコンを選択します。

【図7.3.16】 [トレース]→[編集の開始]メニュ

ここでは、test2.txtを選んだ状態でやってみました。【図7.3.17】のようなメッセージがアウトプット領域に出て、【図7.3.18】のような状態になれば成功です。

【図7.3.17】editコマンドが実行されたぞ
▼
cvs edit test2.txt (ディレクトリ C:\home\mika\workcopy\watchtest\ 内)

*****CVS はコード 0 で終了しました*****

【図7.3.18】 test2.txtに書き込み許可が出たぞ

■■■■ watchersで監視者の状態を確認してみる

さてここで、orangeが「さて、どうなったかなぁ」とおもむろに、cvs watchersを実行して監視者の状態を眺めてみたとしましょう。【図7.3.19】のように結構複雑な状態になった模様です。

【図7.3.19】監視者の状態を眺めてみる
▼
[orange]% cvs watchers
test1.txt       orange  edit    unedit  commit
        grape   edit    unedit  commit
        apple   tedit   tunedit tcommit
test2.txt       orange  edit    unedit  commit
        grape   edit    unedit  commit  tedit   tunedit tcommit
test3.txt       orange  edit    unedit  commit
        grape   edit    unedit  commit
▲

さっきは、orangeとgrapeだけだったtext1.txtの監視者にappleが加えられています。test2.txtなどは、grapeの列にtを先頭とする文字列が増えてます。実は、editコマンドで編集を開始したことをCVSに教えると、CVSはこの編集者を準監視者とみなし、監視者のリストに加えてくれるのです。ちなみに、真の監視者とは各操作種別の前に「t」がついていることで区別できます。確かに、appleとgrapeの列には、tedit、tunedit、tcommitという「t」のついた操作種別が並んでいます。

監視者リストに加えられている間は、通常の監視者と同等の扱いを受けます。例えば監視通知メールの設定がある場合には、他の人がここに並んでいる操作をする度に、appleもorangeとgrapeが受け取るのと同じメールを受け取ることになります。監視通知メールについては次の7,4節でお話しします。

uneditやcommitをした時点で、appleは監視者リストから取り除かれ、grapeのtがつく操作種別は除かれますます。

■■■7.3.5 編集者を眺めてみよう(editors)

watchersコマンドの出力で暫定的な監視者をチェックすることでも、誰が編集をしているのかわかりますけれど、もっとちゃんと編集者について調べるにはcvs editorsを使います。editorsコマンドは、あるファイルを編集している人の一覧を見るためのコマンドです。editorsコマンドの書式は【図7.3.20】のようになります。

【図7.3.20】editorsコマンドの書式
▼
cvs editors [-lR] [ファイル群...]
▲

さっそく、orangeとして「誰が編集してるかなぁ」と言いながら実行してみましょう【図7.3.21】。

【図7.3.21】編集者の状態を眺めてみる
▼
[orange]% cvs editors
test1.txt       apple   Sat Sep  7 05:30:15 2002 GMT    cvs.mydomain.com      /home/mika/test/apple/watchtest
test2.txt       grape   Sat Sep  7 06:25:26 2002 GMT    MyPC    C:\home\mika\workcopy\watchtest
▲

test1.txtに対して今、appleとgrapeが編集中であることだけでなく、それぞれについて、作業を開始した時刻、および作業をおこなっている計算機名や作業しているディレクトリまでわかります。面白いですね。

grapeもWinCvsから編集者を調べることができます。調べるには、対象フォルダもしくはファイルを選んだ状態で、メニュー[トレース]→[編集者の表示]【図7.3.22】を選択します。

【図7.3.22】 [トレース]→[編集者の表示]メニュー ※XP撮り直し

watchtestに対してやってみると、【図7.3.23】のようなメッセージがアウトプット領域に出力されます。まぁorangeが眺めた結果と同じなんですけどね。

【図7.3.23】 同じメッセージですね…当たり前か
▼
cvs editors (ディレクトリ C:\home\mika\workcopy\watchtest\ 内)
test1.txt	apple	Sat Sep  7 05:30:15 2002 GMT	cvs.mydomain.com	/home/mika/test/apple/watchtest
test2.txt	grape	Sat Sep  7 06:25:26 2002 GMT	MyPC	C:\home\mika\workcopy\watchtest

*****CVS はコード 0 で終了しました*****

▲

--------------------------------------------

Column 監視情報ってどこで管理されてるのだろう

こうした管理情報がどこで管理されているか、気になりませんか?リポジトリのどこかに蓄えられてるはずです。ということで、リポジトリ内のwatchtestディレクトリを眺めてみます【図7.3.24】。

【図7.3.24】なぜかリポジトリにCVSディレクトリが
▼
% ls -F /home/cvsroot/watchtest
CVS/  test1.txt,v  test2.txt,v  test3.txt,v
% ls /home/cvsroot/watchtest/CVS
fileattr
▲

と、なぜかwatchtestにCVSディレクトリができてます【図7.3.24 2行目】。CVSディレクトリがリポジトリにあるなんて変ですね。さらに中を眺めてみる【図7.3.24 3行目】と、fileattrという名前のファイルができています【図7.3.24 4行目】。このファイルの中身は、【図7.3.25】のようになっています。

【図7.3.25】/home/cvsroot/watchtest/CVS/fileattr
▼
Ftest1.txt      _watched=;_watchers=orange>edit+unedit+commit,grape>edit+unedit+commit,apple>tedit+tunedit+tcommit;_editors=apple>Sat Sep  7 05:30:15 2002 GMT+cvs.mydomain.com+/home/mika/test/apple/watchtest
Ftest2.txt      _watched=;_watchers=orange>edit+unedit+commit,grape>edit+unedit+commit+tedit+tunedit+tcommit;_editors=grape>Sat Sep  7 06:25:26 2002 GMT+MyPC+C:\home\mika\workcopy\watchtest
Ftest3.txt      _watched=;_watchers=orange>edit+unedit+commit,grape>edit+unedit+commit
D       _watched=;_watchers=orange>edit+unedit+commit,grape>edit+unedit+commit
▲

まさしくこのファイルが、監視情報を蓄えている場所のようです。なんで、CVSディレクトリなのかというと、絶対リポジトリ側には出てこないディレクトリだから、だとか。

--------------------------------------------

■■■7.3.6 コミットしてみよう(commit)

次に行うのはコミットです。編集結果をリポジトリに反映するためのコマンドですので、当然関わってきています。commitコマンド実行時にはファイルのcommitを監視している人に通知がおこなわれます。

appleとして、commitコマンドを実行してみましょう【図7.3.26】。

【図7.3.26】編集をコミットしてみる
▼
[apple]% cvs commit -m "Commit test for watch" test1.txt
Checking in test1.txt;
/home/cvsroot/watchtest/test1.txt,v  <--  test1.txt
new revision: 1.2; previous revision: 1.1
done
▲

なお、uneditやcommitを実行すると、ファイルから書き込み許可がなくなります【図7.3.27】。これは「また次に編集するときはeditを実行してね」という意味です。

【図7.3.27】あら、書き込み許可がなくなっちゃった
▼
[apple]% ls -l
total 16
drwxrwxr-x    3 mika     users        4096 Sep  8 12:38 CVS
-r--r--r--    1 mika     users          30 Sep  8 12:38 test1.txt
-r--r--r--    1 mika     users          25 Sep  7 13:16 test2.txt
-r--r--r--    1 mika     users          24 Sep  7 13:16 test3.txt
▲

grapeにもコミットしてもらいます。要するに赤いアイコンが白くなって書き込み禁止になるだけですけどね【図7.3.28】。

【図7.3.28】 赤いアイコンが白くなって書き込み禁止に ※加工前ファイル[コミット前]→[コミット後]

■■■■ watchersで監視者の状態を確認してみる

orangeにwatchersで状態を確認してもらいましょう。

【図7.3.29】tがついたのがなくなった
▼
[orange]% cvs watchers
test1.txt       orange  edit    unedit  commit
        grape   edit    unedit  commit
test2.txt       orange  edit    unedit  commit
        grape   edit    unedit  commit
test3.txt       orange  edit    unedit  commit
        grape   edit    unedit  commit
▲

ちゃんと、appleがリストからいなくなって、grapeのところからtのついた操作がなくなりました。

■■■7.3.7 編集を途中放棄してみよう(unedit(release))

uneditコマンドは、編集をやめたことをそのファイルの監視者に通知するためのコマンドです。なお、このコマンドを実行すると、それまでに加えた変更は破棄されます。そして監視者のリストからも除かれます。uneditコマンドの書式は【図7.3.30】のようになります。特別なオプションは何もありません。また、releaseコマンド実行もunedit実行と同じ取り扱いになります。

【図7.3.30】uneditコマンドの書式
▼
cvs unedit [-lR] [ファイル群...]
▲

appleに編集を加えたファイルにuneditを実行してみます【図7.3.31】。と、「ファイルは変更されています。変更を元に戻しますか?」と尋ねられます【図7.3.31 6行目】。

【図7.3.31】uneditしてみるとどうなるのかな?
▼
[apple]% cvs edit test1.txt

(編集)
[apple]% cvs unedit test1.txt
test1.txt has been modified; revert changes? y
▲

これに「y」と答えると、それまでの変更がすべて捨てられて、前の状態に戻されてしまいますので気をつけてください。それが嫌な場合は、nと答えて、commitコマンドで変更を反映するようにしてください。

WInCvsでuneditコマンドを実行するには、対象ファイルを選んだ状態で、メニュー[トレース]→[編集の中止]【図7.3.32】 を選択するか、複数ユーザーバー編集放棄アイコンを選択します。

【図7.3.32】 [トレース]→[編集の中止]メニュー

test2.txtを編集後、これらを選ぶと、アウトプット領域に【図7.3.33】のようなメッセージが表示され、

cvs unedit test2.txt (ディレクトリ C:\home\mika\workcopy\watchtest\ 内)
test2.txt has been modified; revert changes? 

【図7.3.34】のような確認ダイアログが現われます。「はい」と答えて、uneditを完了しましょう。

【図7.3.34】 確認ダイアログ

と、【図7.3.35】のように赤かったアイコンが白くなり、書き込み禁止になります。しかし、コミットのときと違って、リビジョンには変化無しです。

【図7.3.35】 ファイルの変化 ※加工前ファイル[unedit前]→[unedit後]

■■■■ 放棄(release)について

releaseについては3章で説明したので、ここでは説明しません。ディレクトリ単位に一挙に放棄する他は、監視関係についてはuneditと同じことがおこります。

■■■7.3.8 編集をやめてみよう(watch remove/off)

最後に、監視を中断してみましょう。orangeがtest1.txtに興味を無くしたものとします。そこで、監視をやめることにしました。監視をやめるには、cvs watch removeを使用します【図7.3.36】。

【図7.3.36】ファイルの監視をやめる
▼
[orange]% cvs watch remove test1.txt
▲

一方、grapeはtest2.txtに関心を無くし、監視を止めることにしました。WinCvsで監視を止めるには、対象ファイルを選んだ状態で、メニュー[トレース]→[監視を止める]【図7.3.37】あるいは複数ユーザーバー監視停止アイコンを選択します。

【図7.3.37】 [トレース]→[監視を止める]メニュー ※XP撮り直し

実行後、orangeにwatchersコマンドでtest1.txtのリストからこれらが削除されていることを確認してもらいましょう【図7.3.38】。

【図7.3.38】監視者はどうなってるのかな?
▼
[orange]% cvs watchers
test1.txt       grape   edit    unedit  commit
test2.txt       orange  edit    unedit  commit
test3.txt       orange  edit    unedit  commit
        grape   edit    unedit  commit
▲

そのとおりになったようですね。

■■■7.3.9 監視を止めてみよう

orangeは、ついでにcvs watch offをtest1.txtに実行して、書き込み許可が出されるようにしたとしましょう【図7.3.39】。

【図7.3.39】editの強制をオフにする
▼
[oarnge]% cvs watch off test1.txt
▲

これで、次にだれかがtest1.txtをとりだしたときにはtest1.txtには書き込み許可が出るようになります。ただし、test1.txtにまだ残ってる監視者grapeにとっては迷惑かも知れません。監視者が残ってるときはwatch offはしない方がいいでしょうね。