SVNコミット時にチケット番号を必須にしたい

Redmineをインストールしてしばらく一人管理を行っているのですが、たまにチケット番号を忘れてコミットしてしまうケースが何度かあります。
「あ、しまった」といった時には後の祭りなので、やはり必須にしようと思い立った訳です。
以前、TracLightningを使用していたときにメッセージを必須にする設定は行ったことがあったので、同じ要領で行えばと思っていたのですが、
Bitnamiに同梱されているSubversionTracLightningに同梱されているSubversionで環境も構成も微妙に違うことに気づきました。

TracLightningではWindows版のbashが同梱されているので、シェルスクリプトを書くことで対応していましたが、
Bitnamidではそのようになっていません。まあWindows版のbashをインストールしたら動きそうな気もしますが。。。


0から組み込むのは嫌だな〜と思って検索をかけてみたら、以前にも参考にさせて頂いたid:language_and_engineeringさんのページで
id:language_and_engineering:20100819)を発見しました。
今回は上での例を参考に以下のように変更して使用してみることにしました。
該当するプロジェクトのリポジトリのhooksの下にpre-commit.batとvalidate.jsを用意します。


pre-commit.bat

rem 条件を満たさないコミットをはじくためのスクリプト

rem subversionから渡される引数を格納
set REPOS=%1
set TXN=%2

rem コミットしようとしているトランザクションを検証
cscript //nologo %~dp0validate.js "%REPOS%" "%TXN%"

rem 検証結果をsubversionに返す(0ならコミット可能)
exit %ERRORLEVEL%


validate.js

// batから渡される引数を格納
var svn_repos          = WScript.Arguments.Unnamed(0);
var svn_transaction_id = WScript.Arguments.Unnamed(1);

// svnlookから,コミット実行時のログメッセージを取得
var ws = WScript.CreateObject("WScript.Shell");
var cmd_get_comment = "G:\\Bitnami\\subversion\\bin\\svnlook -t \""
	+ svn_transaction_id
	+ "\" log \""
	+ svn_repos
	+ "\""
;
var proc = ws.Exec( cmd_get_comment );
while( proc.Status == 0 )
{
	WScript.Sleep(100);
}
var svn_comment = proc.StdOut.ReadAll();
var regstring = new RegExp("refs|fixes|closes","igm");

if( !svn_comment.match(regstring) ){
	WScript.StdErr.Write("チケット番号が記入されていません。");
	// 異常終了コードを返して終了
	WScript.Quit(1);
}
// 正常終了コードを返して終了
WScript.Quit(0);

実際に変更した部分は、環境に依存する部分と、チケット番号のチェックをコミットメッセージの中に
refsやfixes,closesの文字があるかどうかでチェックする部分くらいですね。
この仕組みを応用すれば、いろいろなプロジェクト要件にあわせてカスタマイズするのも容易いと思います。