わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

コミットされたらメールを送る (Ruby 1.9)

複数人がコミットするSubversionリポジトリに,フックスクリプトを入れていました.コミットのたびにスクリプトが起動し,自分宛にメールを送ってくれます.
あとの説明のため,リポジトリのパスは「/PATH/TO/REPO」とします./PATH/TO/REPO/hooks/post-commitと/PATH/TO/REPO/hooks/commit-email.rbを用意し,実行属性をつけておきます.post-commitとcommit-email.rbは,サブバージョン コミットメールの配信方法 - hir_kazの日記から取得できます.なお,Ubuntuで/usr/share/subversion/hook-scripts/commit-email.rbというファイルも見つかりましたが,中身はびっくりするほど別物です.
ここでもう一つ,事情があります.サーバを,リプレースしました.以前はUbuntu 12.04で,取り替え,現在も稼働しているのはXubuntu 12.10です.
このXubuntuでは,/usr/bin/rubyが1.9系列になっています.そのままフックスクリプト*1として動かすと,コミット後に毎回,エラーメッセージが出ます.そして,メールが送られません.
ということで,Ruby 1.9対応をするとします.
先日,ActionMailerでJIS(ISO-2022-JP)のメールを受信すると incompatible encoding regexp match (US-ASCII regexp with ISO-2022-JP string) になる - 発声練習にて,mail-iso-2022-jpが良いとあり,試してみました.インストールは,gem install mail-iso-2022-jpでおしまいです.
出力を見ていると,mailというライブラリも入っています.これまでのスクリプトと,メールの指示のしかたが,ずいぶん異なっています.いや,mailのほうが,すっきりしているような.
ところで,以前から引っかかっていた課題にも,ここで対処しておくことにします.それは,リビジョン間の差分出力に,複数の文字コードが混在するという不具合です.具体的には,ファイル名に日本語を含み(UTF-8),中身がShift_JISのテキストだったときに,発生します.
対策ですが,コマンドに「| nkf -w」をつけるのでは,うまくいきません.行単位でUTF-8に変換するよう,Rubyスクリプトの中で,メソッドを定義しました.
出来上がり(commit-email.rb)は,いつものようにGistに置いています./PATH/TO/REPO/hooks/post-commitのほうは,変更ありません.
いちおうRuby 1.8,1.9両対応にしていますが,1.8では使わない方がよさそうです.コミット後ではなく,シェルで実行*2してみると,「Enumerable#map without a block does not return an array in 1.9 and later」という警告が出ます.

*1:運用に先立ち,旧機はオフにして,そのHDDをSATA-USBアダプタを介してXubuntuマシンにつなぎ,rsyncで/PATH/TO/REPOを丸ごとコピーしました.

*2:はじめはコミット→エラー→修正→…のサイクルでしたが,「/PATH/TO/REPO/hooks/commit-email.rb /PATH/TO/REPO リビジョン番号」というコマンドで,コミットせず動作確認できることを知り,デバッグの効率が上がりました.