[ 地球流体電脳倶楽部 / cc-env / CVS に関するメモ / SIGEN.htm ]

commit をメール通知する設定

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


  1. 準備 (CVSROOT 編集のために)
  2. 方法その1 (御手軽版)
  3. 方法その2 (ちょっと凝ってみました版)
  4. 方法その3 (cvsweb も使いたい人版)

準備 (CVSROOT 編集のために)

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

方法その1 (御手軽版)

loginfo の編集1

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

DEFAULT (echo ""; id; echo %{sVv}; date; cat) | mail -s hoge0-commit [email protected]

これにより、リポジトリ内の全てのプロジェクトに関して、コミットが ある度に[email protected]に対して以下のような文面のメールが 送信される。

Subject: hoge0-commit
From: [email protected]
To: [email protected]
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 [email protected] [email protected]

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

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

Subject: hoge-cvs-commit 2004-09-03T16:13-00:00
From: [email protected]
To: [email protected]
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 を 用いる。(CVS 1.11 版は こちら)

#!/usr/bin/env perl
#
# cvsform.pl by Yasuhiro MORIKAWA, 2006
#   original is cvsdiff.pl by Eizi TOYODA, 2001
#
# for loginfo in CVS 1.12
#
# Downloaded from <http://www.gfd-dennou.org/library/cc-env/cvs/customize/commitmail-tools/cvsform1.12.pl>

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

$mailto0 = '[email protected]';
$envelop_from = '';
$project = 'hoge0';
$charcode = 'iso-2022-jp';

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

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

$mailto = $ARGV[0] || $mailto0;
shift(@ARGV);
@loginfo = @ARGV;
$sendmailto = join(' ', split(/,/, $mailto));

####
# 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 $sendmailto"); # 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

$path = shift @loginfo;
$number = int(scalar(@loginfo) / 3);

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

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

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

EOF
$loginfo_num = 0;
while ($loginfo[$loginfo_num]) {
    $fnam = $loginfo[$loginfo_num]; $loginfo_num++;
    $old  = $loginfo[$loginfo_num]; $loginfo_num++;
    $new  = $loginfo[$loginfo_num]; $loginfo_num++;
    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 の以下の部分を編集する.

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

$mailto0 = '[email protected]';
$project = 'hoge0';

それが終わったら, add、commit して CVSROOT 以下に加える。

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

checkoutlist の編集2

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

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

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

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

loginfo の編集2

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

hoge0   perl $CVSROOT/CVSROOT/cvsform1.12.pl [email protected],[email protected] %p %{sVv}
DEFAULT perl $CVSROOT/CVSROOT/cvsform1.12.pl [email protected] %p %{sVv}

これにより、hoge0 プロジェクトで行なわれた変更は [email protected] および [email protected] 宛てに送られる。 また、それ以外のプロジェクト で行なわれた変更は [email protected] に送られる。 もしも新しくプロジェクトを始めたならば、同じように記述すると 良いだろう。

さらに、

hoge0   perl $CVSROOT/CVSROOT/cvsform.pl [email protected],[email protected] %p %{sVv}
DEFAULT perl $CVSROOT/CVSROOT/cvsform.pl [email protected] %p %{sVv}
ALL     perl $CVSROOT/CVSROOT/cvsform.pl [email protected] %p %{sVv}

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

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

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

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

Subject: hoge-cvs-commit 2004-09-03T16:13-00:00
From: [email protected]
To: [email protected]
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 = '[email protected]';
$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 の編集3

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 の編集3

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

hoge0   perl $CVSROOT/CVSROOT/cvswebform.pl [email protected] %{sVv}
DEFAULT perl $CVSROOT/CVSROOT/cvswebform.pl [email protected] %{sVv}

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

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


Last Updated: 2006/03/18 (森川靖大), Since: 2004/09/30 (森川靖大)