Hatena::ブログ(Diary)

わさっき RSSフィード

2012年11月11日

[][] コミットされたらメールを送る (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:運用に先立ち,旧機はオフにして,そのHDDSATA-USBアダプタを介してXubuntuマシンにつなぎ,rsyncで/PATH/TO/REPOを丸ごとコピーしました.

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

トラックバック - http://d.hatena.ne.jp/takehikom/20121111/1352572653
リンク元