としよんメモ RSSフィード Twitter

2006-06-15

Windows で動かしている Subversion で、コミットメールを送信する

Subversion を複数人で使っていると、他の人がコミットした時に通知をもらいたい時があります。

通知といえば、受け取る方としてはメールで受け取るのがいい場合が多いわけで、Subversion においても、リポジトリディレクトリの hook/post-commit に機能を仕込んでおけばメールで通知することが可能になります。

この post-commit を使ってメールを発信する方法ですが、UNIX/Linux での事例は色々とあったのですが、Windows でのやり方が具体的に詳しく載っているサイトをまだ見つけることができません。

でも、良く考えてみるとそれほど難しい仕組みとも思えないので、作ってみることにしました。


まず、そもそも Windows では、post-commit なんていう拡張子なしのファイルでは実行ができません。

この点については、post-commit.bat、post-commit.cmd、post-commit.exe などの Windows が実行ファイルと認める拡張子で置いておけば動くとのこと。

ということで、hook/post-commit.cmd に、

echo aa > d:\hoge.txt

と書いてコミットしてみると、d:\hoge.txt ができたので、ちゃんと動いているようです。


次に、コミットメールの機能としては、大きく、

  • メールの本文を作る
  • 本文をメールする

という2つのことが行う必要があります。


「メールの本文を作り出す」には、Subversion の svnlook コマンドを使います。

例えば、

svnlook changed d:\svn -r 3

上記のコマンドを実行すると、d:\svn というリポジトリからリビジョン3で変更されたファイルの一覧を取得することができます。

同様にして変更者/日付/ログ も取ってくることができるので、それらを取り混ぜて post-commit.cmd を、

@echo off
set REPO=%1
set REV=%2
set path=%PATH%;"C:\Program Files\Subversion\bin"
echo --Author----------------------------- >> %REPO%\%REV%.tmp
svnlook author %REPO% -r %REV% >> %REPO%\%REV%.tmp
echo --Date------------------------------- >> %REPO%\%REV%.tmp
svnlook date %REPO% -r %REV% >> %REPO%\%REV%.tmp
echo --Changed---------------------------- >> %REPO%\%REV%.tmp
svnlook changed %REPO% -r %REV% >> %REPO%\%REV%.tmp
echo --Comment---------------------------- >> %REPO%\%REV%.tmp
svnlook log %REPO% -r %REV% >> %REPO%\%REV%.tmp

という内容にします。

%1 と、%2 を見ていますが、post-commitには、

が渡されるためです。

この状態でコミットすると、

--Author----------------------------- 
toshyon
--Date------------------------------- 
2006-06-15 22:54:40 +0900 (木, 15 6 2006)
--Changed---------------------------- 
U   test.html
--Comment---------------------------- 
comments

というテキストファイルが出力されます。これをメールの本文にします。


次に、この本文をメールします。

さすがに生の Windows でメールを送信することは難しいので、CMAIL WRITER を使わせていただきました。

cmail.exe と cmail.cfg があれば動作します。

cmail.cfg に、From のアドレスと、SMTP サーバのアドレスを設定し、とりあえずリポジトリと同じディレクトリに2つのファイルを置きました。


最終的には、post-commit.cmd を次のようにします。

@echo off
set MAILTO=user1@example.com user2@example.com user3@example.com
set REPO=%1
set REV=%2
set path=%PATH%;"C:\Program Files\Subversion\bin"
echo --Author----------------------------- >> %REPO%\%REV%.tmp
svnlook author %REPO% -r %REV% >> %REPO%\%REV%.tmp
echo --Date------------------------------- >> %REPO%\%REV%.tmp
svnlook date %REPO% -r %REV% >> %REPO%\%REV%.tmp
echo --Changed---------------------------- >> %REPO%\%REV%.tmp
svnlook changed %REPO% -r %REV% >> %REPO%\%REV%.tmp
echo --Comment---------------------------- >> %REPO%\%REV%.tmp
svnlook log %REPO% -r %REV% >> %REPO%\%REV%.tmp
D:\svn\cmail -s "[svn]commit %REPO% %REV%" %MAILTO% < %REPO%\%REV%.tmp
del /Q %REPO%\%REV%.tmp

これで、user1@example.com,user2@example.com,user3@example.com 宛にコミットメールが届きます。


これでうまくいっていたのですが、どうも日本語のログメッセージが化けてしまいます。

これは、TortoiseSVN などでローカルのリポジトリを使っている時には化けないのですが、Apache + Subversion で動かしているWindowsサーバでやった時には化けてしまいました。

良くは理解していませんが、とりあえず、

set APR_ICONV_PATH=C:\Program Files\Subversion\iconv

を追加してやると日本語が化けるのはおさまりました。


ということで、コミットすると以下のようなメールが飛んでくるようになり、目的達成です。

Subject: [svn]commit D:/Svn 5

--Author----------------------------- 
toshyon
--Date------------------------------- 
2006-06-15 22:54:40 +0900 (木, 15 6 2006)
--Changed---------------------------- 
U   test.html
--Comment---------------------------- 
日本語のコメント

ひさしぶりにバッチを作ったのですが、作っていて思ったことが1つ。

やっぱシェルスクリプトの柔軟性はすごいです。それに比べるとWindows のバッチはできないことが多すぎます。

echo -n とかないし・・・。

コマンドの実行結果を変数に取り込めないし・・・。

ヒアドキュメントとかできないし・・・。


その後、vbs も併用して送信する方法に切り替えています。「Windows 上の Subversion でのコミットメール送信 〜 その2」

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/toshyon/20060615/p1