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 派か {} 派か…^^;。