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>' ...
![[hatena]](http://d.hatena.ne.jp/images/b_entry_de.gif)
![[RSS]](/d/rss10.png)