ということで、
続きです。今回は、
- 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 が設定されてない初期設定データをいじれるように
- RevtreePlugin の LogEnhancer を使ったりしてたので、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 をクローズできたりはしないし、チケット中のコメントは書き換えられません。