subversion の commit-mail

昨日は ruby の日。
こんなん作った。

リポジトリディレクトリに receivers というファイルを置き、そこに監視したいディレクトリとメイルアドレスを書いておくと、対象ディレクトリに変更があったときだけメイルが飛ぶ。全ディレクトリを監視対象にする場合は「空白+メイルアドレス」の行を書く。
リポジトリディレクトリの下に log ディレクトリを作っておくことで、commit ログが保存される。

あとは receivers ファイルを編集する CGI を書けばいいわけだが…リポジトリのアクセス制御との折り合いに悩み、保留…。

文字コードUTF-8 ベースで、SVN_EDITOR で UTF-8 編集できるものを使っていればログメッセージも読めるはず。ソースは Shift_JIS だったりするとアウトだけど。
大体 import 時にクライアントのエンコーディングを指定できないから…って同一プロジェクト内でも複数文字コードが混在することもよくあるので根が深いけど(UTF-8 統一にはまだ至らずといったところ)。
mod_encoding を試そうかとも思ったけど既に import しちゃってるからもういいや…。

ベースは http://maid.sytes.net/~mugetu/diary/?date=20040302#p02スクリプトです。ありがとうございます。

[commit-mail.rb]

#!/usr/bin/ruby
# referred > http://maid.sytes.net/~mugetu/diary/?date=20040302#p02

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

fromaddr='svn@example.com'

map={};
f=open("#{REPOS}/receivers")
while f.gets
    next if ~/^[#\r\n]/
    (a,b) = $_.split(/\s+/)
    if map[a] then map[a].push(b)
    else map[a] = [b]
    end
end

svnauthor=%x{svnlook author #{REPOS} rev #{REV}}.chomp!
svndate=%x{svnlook date #{REPOS} rev #{REV}}.chomp!
svnchanged=%x{svnlook changed #{REPOS} rev #{REV}}.chomp!
svnlog=%x{svnlook log #{REPOS} rev #{REV}}.chomp!
svndiff=%x{svnlook diff #{REPOS} rev #{REV}}.chomp!

#commit-email.pl "$REPOS" "$REV" toaddr

toaddrs = [];
map.each { |path, addrs|
    if svnchanged =~ /[A-Z] +#{path}/ then
        toaddrs = toaddrs | addrs
    end
}

if toaddrs.size > 0 then

require 'net/smtp'

Net::SMTP.start( 'localhost', 25 ) {|smtp|
    smtp.send_mail <

ruby はいいですねぇ…。
ブロックは do end 派か {} 派か…^^;。