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 派か {} 派か…^^;。
やばくないか…?
さっきまで検索結果がやけに少ないと思ってたらいよいよ不安定になってきた気が…。
ふむ
hooks/post-commit で適当に書けばよい、と。
あり?
コミットメール通知の方法も分からんな。これできんかったら痛いぞ…。
それはそうととりあえずインストールメモ。
某 Solaris サーバでは db_185.h は見つからんわ ranlib は見つからんわで放置ちぅ^^;。linux のほうのメモ。
tar を持ってきての ./configure;make;make install はあっさり。
/home/svn を作成。で、svnadmin create /home/svn/repname
chown -R apache: /home/svn
で apache がアクセスできるようにしておく。
・httpd.conf に追加
<Location /svn> DAV svn SVNParentPath /home/svn AuthzSVNAccessFile /home/svn/.htsvnaccess Satisfy Any Require valid-user AuthType Basic AuthName "Subversion repository" AuthUserFile /home/svn/.htpass </Location>
・/home/svn/.htsvnaccess 作成
[groups] opengroup = user1 user2 group = user3 user4 [repname:/] @group = rw user5 = rw [repname:/openprojectdir] @opengroup = rw * = r
・/home/svn/.htpass は htpasswd で作る
ユーザはこのファイルだけで認証(シェルアカウント不要)し、アクセス権は上記 .htsvnaccess でディレクトリ単位で自由に設定できる。(なので同一リポジトリで全然異なるプロジェクトも一応 OK)
import 前のディレクトリレイアウトが重要。
プロジェクトディレクトリ配下は以下の3つにしておくのが慣習。
trunk branches tags
(リポジトリ直下を上記にしておくケースもあり)
trunk 下に import したいリソースを突っ込んで、プロジェクトディレクトリごと import すべし。
これで http://host/svn/repname/projectname/trunk がメインブランチのパスになる。