2006年03月29日

SVNコミットメール処理

私のかかわっている編集業務のほとんどはSVNで処理している関係上、ログや差分を提供するコミットメールは必須とも言える。しかし、CVSに比べると日本語ユーザにとって使いやすいものがあまりない。

また、前提条件として、CVSではリポジトリの中に複数のモジュールを持たせることができ、フックでもそれらのモジュールを区別できるのだが、SVNではリポジトリは1つでありモジュールは単にディレクトリとして論理的に分かれているに過ぎない。同じ出版社のプロジェクトを個別リポジトリを作るのも骨なので、できればCVSと似たようにしたい。

現在、コミットメールを処理するツールとしては次のようなものがある。

commit-email.pl
SVNに収録されている標準ツール。日本語対応はなし(plなのでがんばればNkfなど通すようにできる?)。
svnmailer
Debianパッケージ化されているもの。モジュールも扱える。日本語対応はなし。Pythonわからん…。設定ファイルが分離できるなど、いろいろ便利そうではあるのだが。
post-commit.rb
Rubyスクリプト。今はこれを少し改良して使っている。これ自体はモジュールを扱えないので、post-commitフックで処理する。

ということで、post-commit.rbを使っているわけだが。post-commit.rbをちょっと編集。

--- /tmp/post-commit.txt	2006-01-31 14:29:37.000000000 +0900
+++ /usr/local/bin/post-commit.rb	2006-03-28 16:02:58.000000000 +0900
@@ -1,4 +1,5 @@
-#!/usr/local/bin/ruby
+#!/usr/bin/ruby
+require 'nkf'
 
 REPOS=ARGV[0]
 REV=ARGV[1].to_i
@@ -9,14 +10,20 @@
 my_version = '0.1'
 
 config_path = REPOS + '/hooks/post-commit.conf'
+if ARGV.size == 3
+  config_path = REPOS + '/hooks/' + ARGV[2]
+end
 load config_path
 
-
 # get svn info
 svnauthor=%x{svnlook author #{REPOS} -r #{REV}}.chomp!
 svndate=%x{svnlook date #{REPOS} -r #{REV}}.chomp!
 svnchanged=%x{svnlook changed #{REPOS} -r #{REV}}.chomp!
 svnlog=%x{svnlook log #{REPOS} -r #{REV}}.chomp!
+ENV['LANG'] = 'C'
+svndiff=%x{svnlook diff #{REPOS} -r #{REV}}.chomp!
+svndiff = NKF.nkf('-w', svndiff)
+ENV['LANG'] = 'ja_JP.UTF-8'
 
 from_address = svnauthor;
 if $author_table.has_key?(svnauthor)
@@ -47,10 +54,10 @@
 
 #{svnchanged}
 
+#{svndiff}
 EndOfMail
 
 # String Encode Convert
-require 'nkf'
 mailbody = NKF.nkf('-W8 -j', mailbody)
 
 # Send Mail Message

要は3つ目の引数で設定スクリプトを読めるようにする、svndiffの結果をUTF8で出力する、という感じ。

commitinfoフックのほうはこんな風で。ちと格好悪いけど。

case $(svnlook changed -r${REV} ${REPOS} | head -1) in
*projecta*)
    /usr/local/bin/post-commit.rb "${REPOS}" "${REV}" projecta.conf &
    ;;
*projectb*)
    /usr/local/bin/post-commit.rb "${REPOS}" "${REV}" projectb.conf &
    ;;
esac

hooksディレクトリに置くproject*.confに該当設定を記述。

$to_addresses = '作業ML'
$smtp_srv = 'メールサーバ'
$helo_domain = '自分のドメイン'
$subject_prefix = 'メールに付けるprefix'

require '/usr/local/etc/usermap'

で、後はユーザーデータベース(usermap.rb)。

$author_table['kmuto'] = 'Kenshi Muto <kmuto@hogehoge>'
 ...