commit をメール通知する設定

以下では、コミット時にユーザにメールを送信するための設定を記す。



準備 (CVSROOT 編集のために)

メールを送信するためには、リポジトリ以下の CVSROOT 内を編集する必要がある。 編集のための checkout などの方法については cvs 管理用ディレクトリ CVSROOT の編集 を参照せよ。

方法その1 (御手軽版)

loginfo の編集

単純に、CVSROOT/loginfo に以下の一行を追加する。

DEFAULT (echo ""; id; echo %{sVv}; date; cat) | mail -s hoge0-commit foo@gfd-dennou.org

これにより、リポジトリ内の全てのプロジェクトに関して、コミットが ある度にfoo@gfd-dennou.orgに対して以下のような文面のメールが 送信される。

Subject: hoge0-commit
From: hero@www.gfd-dennou.org
To: foo@www.gfd-dennou.org
Date: 27 Aug 2004 10:34:51 -0000

uid=1079(hero) gid=1079(hero) 所属グループ=1079(hero), .....
hoge0/test/ Makefile,NONE,1.1 Mkinclude,1.10,1.11
2004年  8月 27日 金曜日 20:31:11 JST
Update of /GFD_Dennou_Club/ftp/arch/hoge/cvsroot/hoge0/test
In directory studenno:/tmp/cvs-serv30787

Modified Files:
	Makefile Mkinclude
Log Message:
Add SUFFIX Rules.

以下のようにDEFAULTの部分を変更すれば、各プロジェクト毎に異なる 動作が可能である。また、以下のように複数のメールアドレスを指定可能である。

hoge0 (echo ""; id; echo %{sVv}; date; cat) | mail -s hoge0-commit keik@gfd-dennou.org fof@gfd-dennou.org

方法その2 (ちょっと凝ってみました版)

ちょっと見やすく整形したメールを送るために、Perl スクリプトを フィルターとして用いる方法である。 この方法を用いると以下のように整形されたメールが送られる。 (ファイル数が増えるとこちらの方が見やすくなる)。

Subject: hoge-cvs-commit 2004-09-03T16:13-00:00
From: hero@gfd-dennou.org
To: foo@gfd-dennou.org
Date: 27 Aug 2004 10:34:51 -0000

At 2004-08-27T10:34-00:00, user hero commited following 2 files.

hoge0/Makefile: NONE to 1.1
hoge0/Mkinclude: 1.10 to 1.11

Update of /GFD_Dennou_Club/ftp/arch/hoge/cvsroot/hoge0
In directory studenno:/tmp/cvs-serv8513

Modified Files:
	Mkinclude
Added Files:
	Makefile
Log Message:
Add SUFFIX Rules.

cvsform.pl の追加

フィルタとしてcvsform.pl を 用いる。

#!/usr/bin/perl
#
# cvsform.pl by Yasuhiro MORIKAWA, 2005
#   original is cvsdiff.pl by Eizi TOYODA, 2001

############################################################
## Settings

$mailto0 = 'foo@gfd-dennou.org';
$envelop_from = '';
$project = 'hoge0';
$charcode = 'iso-2022-jp';

## End Setting
############################################################

# umask 0;
# open(LOG, ">/tmp/cvsform.tmp");

$mailto = $ARGV[0] || $mailto0;
$loginfo = $ARGV[1];

####
# Fix username
$user = $ENV{'USER'} || $ENV{'LOGNAME'} || $<;
$domain = '@gfd-dennou.org';

####
# Set envelop-from user
$_ = $envelop_from;
$envelop_from =~ s/\s//g;
unless ($envelop_from eq '') {
    $envelop_from = "-f" . $envelop_from;
}

# GMT Time
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
$date = sprintf("%04d-%02d-%02dT%02d:%02d-00:00",
		$year + 1900, $mon + 1, $mday, $hour, $min);

# # Local Time (Assume Japan Time)
# ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
# $localdate = sprintf("%04d-%02d-%02dT%02d:%02d+09:00",
# 		     $year + 1900, $mon + 1, $mday, $hour, $min);

open(MAIL, "|nkf|/usr/lib/sendmail $envelop_from $mailto"); # convert to JIS
select(MAIL);
print <<EOF;
From: $user$domain
To: $mailto
Subject: ${project}-cvs-commit $date
Mime-Version: 1.0
Content-Type: Text/Plain; charset=$charcode
Content-Transfer-Encoding: 8bit

EOF

@loginfo = split(/\s/, $loginfo);
$path = shift @loginfo;
$number = scalar(@loginfo);

if ($loginfo[0] eq '-') {
    @loginfo = ('.,NONE,NONE');
}

$s = 's' if $number != 1;

print <<EOF;
At $date, user $user commited following $number file$s.

EOF
foreach $hunc (@loginfo) {
    ($fnam, $old, $new) = split(/,/, $hunc);
    print <<EOF;
$path/$fnam: $old to $new
EOF
}

print <<EOF;

EOF

while (<STDIN>) {
    s/\x0D\x0A|\x0D|\x0A/\n/g;  # convert each OS linefeed code to "\n"
    print;
}

close(MAIL);

この cvsform.pl を add、commit して CVSROOT 以下に加える。

$ cvs add cvsform.pl
$ cvs commit -m "Format Messages of commit mail." cvsform.pl

checkoutlist の編集

CVSROOT/checkoutlist に以下の一行を追加する。詳細は cvs 管理用ディレクトリ CVSROOT の編集 − checkoutlistを参照のこと。

cvsform.pl        unable to check out / update cvsform.pl in CVSROOT

編集が終ったら、いつも通り commit する。

$ cvs ci -m "Add cvsform.pl" checkoutlist

loginfo の編集

CVSROOT/loginfo の編集も必要である。 ここに、各々のプロジェクト名と宛先を設定する。 cvsform.pl を作成したので、以下のように記述する。

hoge0   perl $CVSROOT/CVSROOT/cvsform.pl foo@gfd-dennou.org %{sVv}
DEFAULT perl $CVSROOT/CVSROOT/cvsform.pl keik@gfd-dennou.org %{sVv}

これにより、hoge0 プロジェクトで行なわれた変更は foo@gfd-dennou.org 宛てに送られる。また、それ以外のプロジェクト で行なわれた変更は keik@gfd-dennou.org に送られる。 もしも新しくプロジェクトを始めたならば、同じように記述すると 良いだろう。

さらに、

hoge0   perl $CVSROOT/CVSROOT/cvsform.pl foo@gfd-dennou.org %{sVv}
DEFAULT perl $CVSROOT/CVSROOT/cvsform.pl keik@gfd-dennou.org %{sVv}
ALL     perl $CVSROOT/CVSROOT/cvsform.pl admin@gfd-dennou.org %{sVv}

とした場合、hoge0 プロジェクトでおこなわれた変更やその他のプロジェクト の変更に関して、foo や keik に送られると同時に全て admin@gfd-dennou.org にもメールされることになる。必要ならばこのエントリ も利用すると良いだろう。

以上で作業は終了である。実際のメール配送に関しては hoge0 プロジェクト以下のファイルを commit してみて確認して欲しい。

方法その3 (cvsweb も使いたい人版)

web を介して cvs を利用する CVSweb を利用する場合には以下の方法を用いると良いだろう。 この方法を用いると、以下のように cvsweb の URL も記載されたメールが届く。

Subject: hoge-cvs-commit 2004-09-03T16:13-00:00
From: hero@gfd-dennou.org
To: foo@gfd-dennou.org
Date: 27 Aug 2004 10:34:51 -0000

At 2004-08-27T10:34-00:00, user hero commited following 2 files.

hoge0/Makefile: NONE to 1.1
  http://www.gfd-dennou.org/cgi-bin/cvsweb.cgi/hoge0/Makefile
hoge0/Mkinclude: 1.10 to 1.11
  http://www.gfd-dennou.org/cgi-bin/cvsweb.cgi/hoge0/Mkinclude.diff?r1=text&tr1=1.10&r2=text&tr2=1.11&f=h

Update of /GFD_Dennou_Club/ftp/arch/hoge/cvsroot/hoge0
In directory studenno:/tmp/cvs-serv8513

Modified Files:
	Mkinclude
Added Files:
	Makefile
Log Message:
Add SUFFIX Rules.

cvswebform.pl の追加

フィルタとしてcvswebform.pl を用いる。

#!/usr/bin/perl
#
# cvswebform.pl by Morikawa Yasuhiro, 2004
#   original is cvsdiff.pl by TOYODA Eizi, 2001

$mailto0 = 'foo@gfd-dennou.org';
$project = 'hoge0';
$charcode = 'iso-2022-jp';

$server = 'www.gfd-dennou.org';
$cgi = 'cgi-bin/cvsweb.cgi';

# umask 0;
# open(LOG, ">/tmp/cvsform.tmp");

$mailto = $ARGV[0] || $mailto0;
$loginfo = $ARGV[1];
$user = $ENV{'USER'} || $ENV{'LOGNAME'} || $<;

# GMT Time
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
$date = sprintf("%04d-%02d-%02dT%02d:%02d-00:00",
		$year + 1900, $mon + 1, $mday, $hour, $min);

# # Local Time (Assume Japan Time)
# ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
# $localdate = sprintf("%04d-%02d-%02dT%02d:%02d+09:00",
# 		     $year + 1900, $mon + 1, $mday, $hour, $min);

open(MAIL, "|nkf|/usr/lib/sendmail $mailto"); # convert to JIS
select(MAIL);
print <<EOF;
From: $user\@gfd-dennou.org
To: $mailto
Subject: ${project}-cvs-commit $date
Mime-Version: 1.0
Content-Type: Text/Plain; charset=$charcode
Content-Transfer-Encoding: 8bit

EOF

@loginfo = split(/\s/, $loginfo);
$path = shift @loginfo;
$number = scalar(@loginfo);

if ($loginfo[0] eq '-') {
    @loginfo = ('.,NONE,NONE');
}

$s = 's' if $number != 1;

print <<EOF;
At $date, user $user commited following $number file$s.

EOF
foreach $hunc (@loginfo) {
    ($fnam, $old, $new) = split(/,/, $hunc);
    $diff = ".diff?r1=text&tr1=$old&r2=text&tr2=$new&f=h";
    $diff = undef if ($old eq 'NONE' || $new eq 'NONE');
    print <<EOF;
$path/$fnam: $old to $new
  http://$server/$cgi/$path/$fnam$diff
EOF
}

print <<EOF;

EOF

while (<STDIN>) {
    s/\x0D\x0A|\x0D|\x0A/\n/g;  # convert each OS linefeed code to "\n"
    print;
}

close(MAIL);

この cvswebform.pl を add、commit して CVSROOT 以下に加える。

$ cvs add cvswebform.pl
$ cvs commit -m "Format Messages of commit mail for cvsweb." cvswebform.pl

checkoutlist の編集

CVSROOT/checkoutlist に以下の一行を追加する。詳細は cvs 管理用ディレクトリ CVSROOT の編集 − checkoutlistを参照のこと。

cvswebform.pl        unable to check out / update cvswebform.pl in CVSROOT

編集が終ったら、いつも通り commit する。

$ cvs ci -m "Add cvswebform.pl" checkoutlist

loginfo の編集

CVSROOT/loginfo の編集も必要である。 ここに、各々のプロジェクト名と宛先を設定する。 cvswebform.pl を作成したので、以下のように記述する。

hoge0   perl $CVSROOT/CVSROOT/cvswebform.pl foo@gfd-dennou.org %{sVv}
DEFAULT perl $CVSROOT/CVSROOT/cvswebform.pl keik@gfd-dennou.org %{sVv}

これにより、hoge0 プロジェクトで行なわれた変更は foo@gfd-dennou.org 宛てに送られる。また、それ以外のプロジェクト で行なわれた変更は keik@gfd-dennou.org に送られる。 もしも新しくプロジェクトを始めたならば、同じように記述すると 良いだろう。

以上で作業は終了である。実際のメール配送に関しては hoge0 プロジェクト以下のファイルを commit してみて確認して欲しい。


Last Updated: 2005/11/09, Since: 2004/09/30