miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

Subversion 初期設定(3)

ということで、

続きです。今回は、

  • pre-revprop-change
  • post-revprop-change

のお話。

pre-revprop-change で svn:log を許可する

pre-revprop-change はリビジョン毎のプロパティ

あたりを編集する直前に呼ばれる hook です。未設定の場合はすべての変更が不可になっていますが、

  • ログを書き間違えた
  • ログに補足説明をつけたい(「後のリビジョンで使用しなくなったよ」とか)

なんてケースは結構発生するので、最低限ログの変更だけはできるようにしておきましょう。

変更方法ですが、テンプレート(pre-revprop-change.tmpl)にはすでに

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

という記述が入っているので、これをそのままコピーして使うだけでログの変更のみ許可できるようになります。

svn cp pre-revprop-change.tmpl pre-revprop-change
svn propset 'svn:executable' '*' pre-revprop-change

この状態で動作確認して、うまくログメッセージが変更できるようになっていたらコミットしてしまいます。

svn ci -m 'pre-revprop-change hook でログの変更を許可するよう設定。' pre-revprop-change

以前はさらに

  • author が誤って設定されたデータをいじれるように
  • author が設定されてない初期設定データをいじれるように
  • RevtreePluginLogEnhancer を使ったりしてたので、rth:* 属性をいじれるように

こんな感じにしてました。

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then 
    : 
elif [ \( "$ACTION" = "M" -o "$ACTION" = "A" \) -a "$PROPNAME" = "svn:author" ]; then 
    : 
elif [ "$PROPNAME" = "rth:deliver" -o "$PROPNAME" = "rth:bring" ]; then 
    : 
else 
    echo "Changing revision properties other than svn:log, svn:author, rth:* is prohibited" >&2 
fi

今回は RevTreePlugin 使うにしても MergeInfoEnhancer のほうを使うつもりだし、そもそも branch 運用するかわからないから、ここまでしなくていいかな。

・・・というか次項で書くようにちゃんとログが残るようにしているので、exit 0 にしちゃってもよかった気が。

post-revprop-change

pre-revprop-change でログの編集が可能になったわけですが、このログがどこにも残らないのは問題(こっそり author を書き換えられたりしたら困る)なので、プロパティの変更後に変更点をメールで飛ばすようにしておきます。

方法ですが、mailer.py が revprop-change 用のインターフェイスを備えているので、これを素直に使います。

svn cp post-revprop-change.tmpl post-revprop-change
svn propset 'svn:executable' '*' post-revprop-change
vi post-revprop-change

とやって、post-revprop-change の

propchange-email.pl "$REPOS" "$REV" "$USER" "$PROPNAME" watchers@example.org

この行を、

/usr/bin/python $REPOS/hooks/mailer.py propchange2 "$REPOS" "$REV" "$USER" "$PROPNAME" "$ACTION"

に変更と。
(2010-07-07 追記: 元々 mailer.py 呼び出し行の末尾に「&」をつけてバックグラウンド起動にしていましたが、これだと標準入力と結びつかないので、変更前の属性が取得できなくなります。)

問題なければコミットログを編集して、メールが飛ぶことを確認しておきましょう。

うまくいっていたら、いったんコミットしておいて・・・

svn ci -m 'post-revprop-change hook で変更内容をメール送信するよう設定。' post-revprop-change

属性ログの変更が Trac に反映されるよう、trac-admin resync も行うよう設定します。

post-revprop-change の末尾に、

/usr/local/bin/trac-admin /home/trac/hoge/ resync "$REV" &

こんな一行を追加。コミットログを再度編集して、変更が Trac に反映されることを確認します。

で、問題なければコミットと。

svn ci -m 'post-revprop-change hook で属性変更時に trac-admin resync する処理を追加。'

なお、Trac 上でのそのリビジョン記述は書き換わりますが、trac-post-commit-hook で設定されたチケットの情報は書き換わりません。たとえばコミットログを編集して closes #1 と追記しても、#1 をクローズできたりはしないし、チケット中のコメントは書き換えられません。

その他全体的な注意点

pre-xxxx-hook の内部で外部プログラムを呼ぶ場合はバックグラウンド起動しちゃダメです。トランザクションっぽいデータが消えてしまうので、うまく機能しなくなります。

      • -

これで SVN の初期設定は一通り終了です。

既存のプロジェクトで設定済みであれば、hooks ディレクトリをコピーしてちょこちょこ書き換えるだけでもいいんですけど・・・一度手順をまとめておきたかったので、今回はまじめに手順を追ってみたのでした。