[目次へ][7章へ][7.3へ][付録Aへ] 最終更新:$Date: 2002/09/08 07:33:15 $

cvsmailerなど新規コマンドの記述は今回お流れ。


■■ 7.4 作業状態を通知するには
■■■ 7.4.1 電子メールでコミットを通知するには
■■■ 7.4.2 電子メールで編集開始終了を通知するには


■■7.4 編集状態を通知するには

commitコマンド実行時に他の開発者へメールを送ることをコミットメールと言います。やはり、コミットの完了時点でメールしたいでしょうから、loginfoもしくはmodulesを使用するのがよいでしょう。しかし、modulesへ渡される情報は少なすぎてメールをもらっても嬉しくなさそうです。そこで、loginfoでメールするための設定方法について説明します。

一方、コミットメールは非常に便利なのですが、コミットされた時にしかメールがこないと不便なこともあります。筆者はあまりそういう状態になったことはないのですが、非常に複雑なコードを複数の人で編集していて、お互いの変更が頻繁に入り乱れるような場合、更新をしばらく忘れると、マージが非常に大変になります。このような場合、編集される度に自分宛に通知が届くと便利ですよね。ですので、この処理を実現する話をコミットメールの次に解説します。

■■■7.4.1 電子メールでコミットを通知するには

コミットメールはよく使われている機能ですので、ログを解析してメールするためのプログラムが当然のように提供されています。色々フリーのものがありますが、ここでは、cvs-1.11.x附属のプログラムを使用しましょう。/usr/share/cvs/contribあたりにlogというプログラムが入っているはずです。cvs-jpをインストールした場合には、ログメッセージをJISに変換してメールするように書き換えられているはずです。これらは、perlスクリプトですので、興味のある人は覗いてみてください。

cvs-jpは使用していないが、ログに日本語を使用している場合は、cvs-jpのものにならって、メールを転送する前にJISコードに変換しておくとよいでしょう。たとえば、logの【100行目】を【図7.4.1】のように、nkfフィルタで変換するように書き換えます。ackを使用する場合には、「nkf -j」が「ack -j1 -z」のようになります。ここを書き換えるついでにMailになっているメールコマンドを好きなコマンドに変えても構いません。特になければ、このままにしておいてください。

【図7.4.1】logスクリプトの100行目を書き換える
▼
my $mailcmd = "| nkf -j | Mail -s 'CVS update: $modulepath'";
▲

このプログラムをloginfoに設定します。このプログラムの先頭部分に説明がついているので読んでもらうとよいのですが(英語ですけれど)、プログラムの使い方は【図7.4.2】のようになります。-fオプションが必須で、他のオプションは必須ではありません。-mオプションでのメールアドレス指定は複数回繰り返すことができます。-sオプションはメッセージにstatus -vの出力を加えないようにします。-sオプションを指定しない場合にはメッセージにstatus -vの出力がついてきます。1.11から-uオプションと-Vオプションが増えました。-uで指定するユーザはloginfoから渡されるユーザ名を差出人にするためのオプションです。-Vは-vオプション無しのsutatusコマンドの出力をメッセージにつけさせるためのオプションです。

【図7.4.2】logスクリプトの使い方
▼
log [-u user] [[-m メールアドレス] ...] [-s] [-V] -f ログファイル 'ディレクトリ名 ファイル...'
▲

では、実際に設定してみましょう。上でずっと使ってきた、testモジュールがコミットされたときに、CVSROOTの下のcommitlogというファイルにログをとりつつ、developpers@mydomain.comという開発者のメーリングリストに転送するというような状況を想定してみます。この場合、【図7.4.3】のように設定します。なお、テストするときには、メールアドレスには自分のメールアドレスを指定するようにしてくださいね。

【図7.4.3】loginfoでの設定例
▼
^test /usr/share/cvs/contrib/log %s -f $CVSROOT/CVSROOT/commitlog -m developers@mydomain.com
▲

■■■■ コミットしてみよう

この設定をリポジトリに反映させたら、実際に編集してコミットしてみます。ここでは、test2.txtとtest3.txtを編集したことにします。【図7.4.4】のようにcommitコマンドを実行します。

【図7.4.4】コミットしてみる
▼
% cvs commit -m "Commit mail test."
cvs commit: Examining .
Checking in test2.txt;
/home/cvsroot/test/test2.txt,v  <--  test2.txt
new revision: 1.7; previous revision: 1.6
done
Checking in test3.txt;
/home/cvsroot/test/test3.txt,v  <--  test3.txt
new revision: 1.7; previous revision: 1.6
done
▲

■■■■ さて、どんなメールが届いたかな?

【図7.4.5】のようなメールがdeveloppers@mydomain.comに登録されたユーザに届いているはずです。題名には、testというモジュールが更新されたと書いてあります。内容には、日付とその変更をした人(fruit)に続いてモジュールのリポジトリ内でのフルパス、実際に作業をおこなった場所の情報、対象となったファイル、それらに対してstatus -vコマンドを実行した結果がズラズラと並んでいます。また、この内容と同じものが、/home/cvsroot/CVSROOT/commitlogにも記録されているはずです。確かめてみてください。

【図7.4.5】届いたメール
▼
Date: Sun, 8 Sep 2002 14:24:42 +0900
From: Proxy user for CVS <fruit@cvs.mydomain.com>
Message-Id: <200209080524.g885Ogq17276@cvs.mydomain.com>
To: developers@rosymoon.com
Subject: CVS update: test


Date:	Sunday September 8, 2002 @ 14:24
Author:	fruit

Update of /home/cvsroot/test
In directory cvs.mydomain.com:/tmp/cvs-serv17270

Modified Files:
	test2.txt test3.txt 
Log Message:
Commit mail test.
===================================================================
File: test2.txt        	Status: Up-to-date

   Working revision:	1.7	Sun Sep  8 05:24:41 2002
   Repository revision:	1.7	/home/cvsroot/test/test2.txt,v

   Existing Tags:
	No Tags Exist

===================================================================
File: test3.txt        	Status: Up-to-date

   Working revision:	1.7	Sun Sep  8 05:24:41 2002
   Repository revision:	1.7	/home/cvsroot/test/test3.txt,v

   Existing Tags:
	No Tags ExistSubject: CVS update: test
▲

このように、コミットメールを使うようになると、コミットログの内容が詳細になるそうです。ただし、仲間内での愚痴とかも書かれやすくなるため、気をつけないと他の人が読むと眉をひそめるような内容のログになることもあるようです。後から誰からでも参照されるものだということを念頭において書きましょうということです。

Column pserverのユーザ名でメールが来ない!

オリジナルのlogプログラムでよくないところは、Fromのユーザが指定できないところ(例えば、developersにしたいとか)と、pserverのユーザ名がAuthorにならずにCVSのダミーユーザ名が使われてしまうところです。後者については、環境変数$CVS_USERをうまく使ってプログラムを書き換えると対処することができます。例えば、【図7.4.6】のように$CVS_USERが存在する場合にはそちらを、存在しない場合にはログインユーザ名をとるようにします。

【図7.4.6】logの書き換え例(diff -c出力)
▼
*** log Sun Sep  8 14:35:16 2002
--- log.cvsuser Sun Sep  8 14:37:06 2002
***************
*** 133,144 ****
  $logfh->print ("\n");
  $logfh->print ("****************************************\n");
  $logfh->print ("Date:\t$days[$wday] $mos[$mon] $mday, $year @ $hour:" . sprint
f("%02d", $min) . "\n");
! $logfh->print ("Author:\t$login\n\n");

  if ($mailfh) {
        $mailfh->print ("\n");
        $mailfh->print ("Date:\t$days[$wday] $mos[$mon] $mday, $year @ $hour:" .
 sprintf("%02d", $min) . "\n");
!       $mailfh->print ("Author:\t$login\n\n");
  }

  # print the stuff from logmsg that comes in on stdin to the logfile
--- 133,145 ----
  $logfh->print ("\n");
  $logfh->print ("****************************************\n");
  $logfh->print ("Date:\t$days[$wday] $mos[$mon] $mday, $year @ $hour:" . sprint
f("%02d", $min) . "\n");
! my $author = $ENV{CVS_USER} ? $ENV{CVS_USER} : $login;
! $logfh->print ("Author:\t$author\n\n");

  if ($mailfh) {
        $mailfh->print ("\n");
        $mailfh->print ("Date:\t$days[$wday] $mos[$mon] $mday, $year @ $hour:" .
 sprintf("%02d", $min) . "\n");
!       $mailfh->print ("Author:\t$author\n\n");
  }

  # print the stuff from logmsg that comes in on stdin to the logfile
▲

この変更を行うと、Author: の欄がpserverのユーザになったメールが届くようになります。

■■■7.4.2 電子メールで編集開始終了を通知するには

前7.3節で紹介したwatchコマンドとedit、uneditコマンドを使用するように義務付ければ、コミットメールより細かく作業状態を通知することができるようになります。通知をおこなうプログラムを呼び出すように設定する管理ファイルは、notifyファイルです。6.3.4項でその設定方法については説明しました。そして、このプログラムはwatchコマンドを使って別途監視している人を指定しておかなければ呼び出されないということも説明しました。

■■■■ 管理ファイルを設定する

管理ファイルで関係してくるのはnotifyとusersの2つです。notifyについては詳しく説明しましたが、usersファイルについてはまだでしたね。これは、pserver経由で接続している場合に、pserver接続におけるユーザ名ではメールが送れないという状況を解決するための管理ファイルです。つまり、usersファイルにpserverのユーザ名に対応するメールアドレスを書いておくと、そのメールアドレスに通知がおこなわれるようになります。usersに設定していないと、pserverのユーザにメールを送ろうとして失敗し、CVSが文句を言います。

usersの書式は【図7.3.7】のようになります。ただし、このファイルはまだCVSの正式な管理ファイルになっていない(cvs-1.11.2時点)ので、checkoutlistに自分で加えなくてはいけません。

【図7.3.7】CVSROOT/usersの書式
▼
ユーザ名:メールアドレス
▲

以下に一般的な設定例について紹介します。すべてのモジュールでこの機能を使いたい場合は、notifyファイルを【図7.3.8】のように設定します。さらに、usersを使用して、pserverのユーザには必ず電子メールアドレスを指定します。

【図7.3.8】notifyの設定例
▼
ALL mail %s -s "CVS notification"
▲

例えば、orangeにはpozzy@hoge.com、appleにはpie@hage.com、grapeにはjuice@mage.comというアドレスがある場合には、【図7.3.9】のように設定します。

【図7.3.9】usersの設定例
▼
orange:pozzy@hoge.com
apple:pie@hage.com
grape:juice@mage.com
▲

設定後、【図7.3.10】のような行をcheckoutlistに追加してusersを管理ファイルとして扱うようにするのを忘れないでください。

【図7.3.10】usersをcheckoutlistに追加するための行(例)
▼
users Users file checkout failed
▲

■■■■ 監視者に送られるメール

さて、appleにもう一度test1.txtに対して編集状態に入ってもらいましょう。このとき、監視者の状態は【図7.3.11】のようになり、

【図7.3.11】 appleがtest1.txtの編集状態に
▼
% cvs watchers
test1.txt       grape   edit    unedit  commit
        apple   tedit   tunedit tcommit
test2.txt       orange  edit    unedit  commit
test3.txt       orange  edit    unedit  commit
        grape   edit    unedit  commit
▲

すると、test1.txtの監視者grapeに対して、【図7.3.12】のようなメールが送られます。

【図7.3.12】 grapeに送られるメール
▼
Date: Sun, 8 Sep 2002 15:04:55 +0900
From: Proxy user for CVS <fruit@cvs.mydomain.com>
To: juice@mage.com
Subject: CVS notification

watchtest test1.txt
---
Triggered edit watch on /home/cvsroot/watchtest
By apple
▲

usersに指定したgrapeのメールアドレスfuice@mage.comに送られます。ちゃんと設定が効いているようですね。メールのボディパートにはappleがwatchtestモジュールのtest1.txtに対してeditを実行(つまり編集を開始)したことなどが書かれています。

■■■■ 暫定監視者に送られるメール

orangeにも編集に参加してもらいましょう。【図7.3.13】のように監視者にorangeが加わりました。

【図7.3.13】 appleがtest1.txtの編集状態に入ったぞ
▼
% cvs watchers
test1.txt       grape   edit    unedit  commit
        apple   tedit   tunedit tcommit
        orange  tedit   tunedit tcommit
test2.txt       orange  edit    unedit  commit
test3.txt       orange  edit    unedit  commit
        grape   edit    unedit  commit
▲

このとき、暫定監視者であるappleにもgrapeに送られるメールと似たもの【図7.3.14】が送られています。

【図7.3.14】 appleに送られるメール
▼
Date: Sun, 8 Sep 2002 15:16:27 +0900
From: Proxy user for CVS <fruit@cvs.mydomain.com>
To: pie@hage.com
Subject: CVS notification

watchtest test1.txt
---
Triggered temporary edit watch on /home/cvsroot/watchtest
By orange
▲

grapeのものと違うのは、最後の"Triggered ..."で始まる部分です。temporary(暫定的な)という形容詞が挟まってます。appleはtedditになってますからそのとおりですね。

■■■■ コミット時に送られるメール

あまり面白くないのですが、コミットくらいまで試してみましょう。appleにコミットしてもらいます。すると、apple以外の人、つまり、orangeとgrapeに文面はほぼ同じメールが送られました。orangeのを見せてもらいましょう【図7.3.15】。

【図7.3.15】 orangeに送られるメール
▼
Date: Sun, 8 Sep 2002 15:24:43 +0900
From: Proxy user for CVS <fruit@cvs.mydomain.com>
To: pozzy@hage.com
Subject: CVS notification

watchtest test1.txt
---
Triggered temporary commit watch on /home/cvsroot/watchtest
By apple
▲

appleのときと同じくtemporaryなコミットの監視によってメールが送られたと最後に書いてあります。

■■■■ その他

この他、uneditとreleaseでも作業種別が変わっただけの同様の文面のメールが送られます。わざわざ書くまでもないと思われるので省略します。試されてみてください。

この監視機構によるメールの文面はイマイチなのですが、標準ではどうしようもありません。書式は同じなので、notifyファイルで呼び出すプログラムで適当に処理すれば、もっと楽しくできるとは思いますが。