以下では、コミット時にユーザにメールを送信するための設定を記す。
メールを送信するためには、リポジトリ以下の CVSROOT 内を編集する必要がある。 編集のための checkout などの方法については cvs 管理用ディレクトリ CVSROOT の編集 を参照せよ。
単純に、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
ちょっと見やすく整形したメールを送るために、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
を
用いる。(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 = '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; 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 = 'foo@gfd-dennou.org'; $project = 'hoge0';
それが終わったら, add、commit して CVSROOT 以下に加える。
$ cvs add cvsform1.12.pl $ cvs commit -m "Format Messages of commit mail." cvsform1.12.pl
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
CVSROOT/loginfo
の編集も必要である。
ここに、各々のプロジェクト名と宛先を設定する。
cvsform1.12.pl を作成したので、以下のように記述する。
hoge0 perl $CVSROOT/CVSROOT/cvsform1.12.pl foo@gfd-dennou.org,hoge@gfd-dennou.org %p %{sVv} DEFAULT perl $CVSROOT/CVSROOT/cvsform1.12.pl keik@gfd-dennou.org %p %{sVv}
これにより、hoge0 プロジェクトで行なわれた変更は foo@gfd-dennou.org および hoge@gfd-dennou.org 宛てに送られる。 また、それ以外のプロジェクト で行なわれた変更は keik@gfd-dennou.org に送られる。 もしも新しくプロジェクトを始めたならば、同じように記述すると 良いだろう。
さらに、
hoge0 perl $CVSROOT/CVSROOT/cvsform.pl foo@gfd-dennou.org,hoge@gfd-dennou.org %p %{sVv} DEFAULT perl $CVSROOT/CVSROOT/cvsform.pl keik@gfd-dennou.org %p %{sVv} ALL perl $CVSROOT/CVSROOT/cvsform.pl admin@gfd-dennou.org %p %{sVv}
とした場合、hoge0 プロジェクトでおこなわれた変更やその他のプロジェクト の変更に関して、foo や hoge, keik に送られると同時に全て admin@gfd-dennou.org にもメールされることになる。必要ならばこのエントリ も利用すると良いだろう。
以上で作業は終了である。実際のメール配送に関しては hoge0 プロジェクト以下のファイルを commit してみて確認して欲しい。
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
を用いる。
#!/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
CVSROOT/checkoutlist
に以下の一行を追加する。詳細は
cvs 管理用ディレクトリ CVSROOT の編集 −
checkoutlistを参照のこと。
cvswebform.pl unable to check out / update cvswebform.pl in CVSROOT
編集が終ったら、いつも通り commit する。
$ cvs ci -m "Add cvswebform.pl" checkoutlist
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 してみて確認して欲しい。