Subversionのコミットメールを送信スクリプト

Subversionのレポジトリにコミット(commit)があった場合に、メールが飛ぶようにする方法はググるとたくさん出てくる。具体的には、レポジトリ配下に hooks/post-commit というスクリプトを置いて、apacheユーザー(WebDAV+SVNの場合)などに実行権限を与えれば良い。

問題は、その post-commit スクリプトの中身だ。テンプレートとして用意されている post-commit.tmpl は外部の perlpythonスクリプトを使うようだが、なんだかいまいち。

良く出回っているのはRubyで書かれたものだが、日本語の扱いがタコなので、文字化けしたり途中で落ちたりして、どうも決定版がない。

下記のスクリプトは、今日半日かけて試行錯誤しながら、それら参考にして改造したやつだ。今のところ順調に動いていそうだ。使いたい人は自己責任にてどうぞ。ただ、不具合があったらレポートよろしゅうに!

pjname, toaddr, fromaddr, smtpsrv はちゃんと設定してね!
あっ、そうそう、Rubyは1.8.3以上でよろしくね。

#!/usr/bin/ruby

# customize here!!!!
pjname = 'Project Name'               # プロジェクト名(メールのタイトルに表示される)
toaddr = 'toaddress@hogehoge.jp'      # メール送信先(To)アドレス
fromaddr = 'fromaddress@hogehoge.jp'  # メール送信者(From)アドレス
smtpsrv = 'smtp.hogehoge.jp'          # 送信SMTPサーバーのアドレス(MXは引かないよん!)

REPOS=ARGV[0]
REV=ARGV[1].to_i

tolist = [toaddr]

ENV['LANG']='en_US.UTF-8'
svnauthor=%x{svnlook author #{REPOS} -r #{REV}}.chomp!
svndate=%x{svnlook date #{REPOS} -r #{REV}}.chomp!

ENV['LANG']='ja_JP.UTF-8'
svnchanged=%x{svnlook changed #{REPOS} -r #{REV}}
svnlog=%x{svnlook log #{REPOS} -r #{REV}}
svndiff=%x{svnlook diff #{REPOS} -r #{REV}}

require 'kconv'
require 'net/smtp'

Net::SMTP.start(smtpsrv, 25) { |smtp|
  smtp.send_mail <<EndOfMail, fromaddr, *tolist
From: Subversion Admin <#{fromaddr}>
To: #{toaddr}
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Subject: [#{pjname}]Subversion commit #{REPOS} r#{REV}

Subversion commit to #{REPOS}

[Author] #{svnauthor}
[Date] #{svndate}
[New Revision] #{REV}

[Changed]
#{svnchanged.tojis}
[Log]
#{svnlog.tojis}
[Diff]
#{svndiff.tojis}
EndOfMail
}