tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

Subversionでコミット時にメールを送信する

良くあるやつですが、某人の策略によりスクリプトを消されてしまったので再作成しました。

hooks/post-commit

#!/bin/sh

export LANG=ja_JP.UTF-8

REPOS="$1"
REV="$2"
TO="svn@tanamon.jp"
PREFIX="testrepos"

ruby -Ku $REPOS/hooks/post-commit.rb $REPOS $REV $TO $PREFIX

TOとPREFIXはテキトウに書き換えてください。

hooks/post-commit.rb

require 'net/smtp'


# args
REPOS  = ARGV[0]
REV    = ARGV[1]
TO     = ARGV[2]
PREFIX = ARGV[3]


# svn info
author  = `svnlook author       -r #{REV} #{REPOS}`.chomp
comment = `svnlook log          -r #{REV} #{REPOS}`.chomp
list    = `svnlook changed      -r #{REV} #{REPOS}`.chomp
diff    = `svnlook diff         -r #{REV} #{REPOS}`.chomp.gsub(/\t/m, "    ")
dir     = `svnlook dirs-changed -r #{REV} #{REPOS}`.split("\n")[0].chomp
%r{^((.*branch/)*(.*?))(/|$)} =~ dir
package = $1


# mail info
SERVER  = "mail.tanamon.jp"
FROM    = "#{author}@tanamon.jp"
contents = <<EOS
From: #{FROM}
To: #{TO}
Subject: [#{PREFIX} ##{REV}]#{package}
Content-Type: text/plain; charset="UTF-8"

:Comment
#{comment}


:Changed
#{list}


:Diff
#{diff}
EOS


# mail post
Net::SMTP.start(SERVER) do |smtp|
  smtp.sendmail(contents, FROM, TO)
end

こちらもSERVERとFROMは書き換えてください。

送信されるメール

 [testrepos #16220]test
 :Comment
 コミットメールのテスト
 
 
 :Changed
 U   test/dummy.txt
 
 
 :Diff
 変更: test/dummy.txt
 ===================================================================
 --- test/dummy.txt    2009-02-10 10:22:29 UTC (rev 16220)
 +++ test/dummy.txt    2009-02-10 11:27:15 UTC (rev 16221)
 @@ -1,2 +1,3 @@
  R~bgeXg
  Q
 +R
要点
  • 件名にリポジトリ名称・リビジョン・更新プロジェクト名を入れている
  • trunkが無い(直下に置いてる)ので、プロジェクト名取得ではbranchだけを判定している
  • Subversionのauthorはメールアカウント名と同一なので、FROMをコミット者にしている
  • ソースにタブを使う会社なので、4スペースに置き換えている
問題点
  1. メールがUTF-8になってる(手抜き)
  2. 文字コードUTF-8以外が混在するとdiff部分が文字化けする
  3. サーバに入っているRubyが1.8.1と死ぬほど古い

1,2はそのうち何とかする。