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

XML-rpc

今日は XML-rpc と、blog アクセス API を実装した。

汎用 XML-rpc は概ね全部できた。blog アクセスは投稿/アップロード/update-ping/trackback など。RSS と auto discovery もさわりだけ実装した。
多分 perl には速度的に負けまい^^;。といっても速度のほとんどは通信で食われるわけだが。

ココログMovableType にはほぼ問題なく投稿できるようになった。

RSS は 0.91/1.0/2.0/atom を解釈するようにするのはかったるいなぁ…。
あり物を探そうとしない自分^^;;。何のためにかは秘密。

それはそうととりあえずインストールメモ。

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 がメインブランチのパスになる。