TracにはSubversionでのコミット時に、たとえば以下のようなコメントを打つことでチケットを関連づけることができます。
fixed ticket:5
しかし、物覚えが悪く
fixed ticket:#5
等と間違って記述してしまい、後でがっかりすることもしばしば…
どうにかならんもんかいなと思ってたら、先日買った「入門Trac第2版―Linux/Windows対応」にチケットに対するコメントを必須にする方法が載っていたので試してみました。
※TracLightningの手順で、その他Linuxなどの場合は上記の本を参照してください^^
スクリプトの用意
バッチファイルの作成
C:\TracLight\projects\svn\<プロジェクト名>\hooks 配下にある post-commit.bat をコピーして pre-commit.bat を作成します。
バッチファイルの編集
バッチファイル内の「post-commit」を「pre-commit」に変更します。
SET TRAC_LIGHT_HOME=C:\TracLight if not DEFINED TL_PROJECT_HOME set TL_PROJECT_HOME=%TRAC_LIGHT_HOME%\projects ::----------------------------- ::Call the TRAC pre-commit hook :: SET REPOS="%1" SET REV=%2 FOR /F "usebackq delims==" %%i IN (`%TRAC_LIGHT_HOME%\python\python.exe -c "import sys,re;r=re.split('\\\\',sys.argv[1]);print r[len(r)-1]" %REPOS%`) DO SET PROJECT=%%i %TRAC_LIGHT_HOME%\bin\bash.exe %TRAC_LIGHT_HOME%/bin/pre-commit.sh "%1" %2 "%TRAC_LIGHT_HOME%" "%PROJECT%"
シェルスクリプトの作成
C:\TracLight\bin 配下に、pre-commit.sh という以下の内容のファイルを作成します。
#!/bin/sh REPOS="$1" TXN="$2" TRAC_LIGHT_HOME="$3" PROJECT="$4" TRAC_ENV="$TRAC_LIGHT_HOME/projects/trac/$PROJECT" LOG=`svnlook log -t "$TXN" "$REPOS"` python.exe $TRAC_LIGHT_HOME/python-lib/trac/contrib/trac-pre-commit-hook \ "$TRAC_ENV" "$LOG" || exit 1
以上で設定は終わりです。
試してみよう
試しに、コミットログを書かずにコミットしてみると以下の様なエラーとなります。
コマンド: コミット
追加中: D:\Temp\PersonalProject\test
追加中: D:\Temp\PersonalProject\test\テスト用ドキュメント.txt
内容を送信中: D:\Temp\PersonalProject\test\テスト用ドキュメント.txt
エラー: コミットに失敗しました (詳しい理由は以下のとおりです):
エラー: Commit blocked by pre-commit hook (exit code 1) with output:
エラー: At least one open ticket must be mentioned in the log message.
終了!:
ふむふむ。
で、ちゃんとコメント「close ticket:<チケット番号>」を入れてみましょう。
コマンド: コミット
変更: D:\Temp\PersonalProject\test\テスト用ドキュメント.txt
内容を送信中: D:\Temp\PersonalProject\test\テスト用ドキュメント.txt
エラー: コミットに失敗しました (詳しい理由は以下のとおりです):
エラー: Commit blocked by pre-commit hook (exit code 1) with output:
エラー: close ticket:18
エラー: At least one open ticket must be mentioned in the log message.
終了!:
あれれ、失敗しました。
実際にログをチェックしている trac-pre-commit-hook を見てみたところ、以下の様なチェックを行ってます。
tickets = [] for tmp in re.findall('(?:close|closed|closes|fix|fixed|fixes|addresses|references|refs|re|see)' '.?(#[0-9]+(?:(?:[, &]+| *and *)#[0-9]+)*)', log.lower()): tickets += re.findall('#([0-9]+)', tmp) # At least one ticket has to be mentioned in the log message if tickets == []: print >> sys.stderr, 'At least one open ticket must be mentioned ' \ 'in the log message.' sys.exit(1)
2,3行目にある正規表現にマッチするように記述する必要があるので、「close ticket:<チケット番号>」のような書き方はNGとなります。
というわけで、「close #<チケット番号>」みたいな記述に変更するとうまくコミットできました。
個人的な感想
チケットとの関連づけを強制されるのは良いけど、ちゃんと周知しておかないと混乱するかも。
まぁ、会社でも(今のところ)ひっそり使っているので問題ないですけどねw