Subversionフックスクリプト | Hello, Stupid World!

Hello, Stupid World!

いろいろとメモ代わりに書いていきます。

フックスクリプトはリポジトリに対するイベントで動作するプログラムです。

フックスクリプトを使うことでログの入力を強制することやコミット時に自動的に
メールを送信することが可能です。
テスト用のスクリプトを実行させてCI(継続的インテグレーション)ぽく使う
なんてのも良さそうですね。

フックスクリプトはリポジトリのあるサーバーで実行されます。
TortoiseSVNだとローカルで実行されるクライアント側フックスクリプトも設定できます。
リポジトリ配下にあるhooksディレクトリ内にフックスクリプトを配置しておくと
イベント毎に対応するフックスクリプトが起動されます。

初期状態ではhooksディレクトリ内にはunix(Linux)環境でのサンプルが置いてあります。


まずは簡単なテスト用のスクリプトを作成してみます。

[\hooks\pre-commit.bat]
echo "%1" >> C:\SVNrepository\test.log
echo "%2" >> C:\SVNrepository\test.log
exit 1


[解説]
pre-commit.batというのはコミット直前に動作するフックスクリプトです。
ここでは引数の内容をログに出力してコミットを失敗にして中断させています。
exit 0以外は失敗となります。


[実行結果]

$Hello, Stupid World!-フックスクリプト1

ログファイルには以下の内容が出力されます。
引数としてリポジトリのパスとトランザクションIDが渡されています。

$Hello, Stupid World!-フックスクリプト_2


フックスクリプトには以下のようなものがあります。

・start-commit pre-commitよりも前に動作します。
・pre-commit コミット直前
・post-commit コミット直後
・pre-revprop-change リビジョン属性変更前
・post-revprop-change リビジョン属性変更後
・pre-lock ロック取得直前
・post-lock ロック取得直後
・pre-unlock ロック解放直前
・post-unlock ロック解放直後


コミット時にログメッセージが空の場合、許可しないフックスクリプト
を作ってみました。

[\hooks\pre-commit.bat]
set REPOS=%1
set TRAN=%2

for /f %%i in ('svnlook log %REPOS% -t %TRAN%') do set LOG=%%i
if not "%LOG%" == "" exit 0
echo '更新ログを入力して下さい!' >&2
exit 1


[解説]
今回はsubversionの説明が主旨なのでバッチプログラム自体の説明は
簡略します。
バッチプログラムだけではあまり難しいことができないので
perlやVBScript,PowerShellなどを呼ぶようにすれば難しいこともできます。
svnlookというコマンドがありますが、これがsubversionが提供している
APIになります。
svnlookを使うことでリポジトリ内の様々な情報を取得できます。
ここではsvnlook logと指定してログメッセージを取得しました。
他のAPIはぐぐって下さい。


[実行結果]
$Hello, Stupid World!-フックスクリプト_3


[フックスクリプトの作成上の注意]
・フックスクリプト実行時、環境変数(PATH 変数も)はすべて空の状態で起動されます。
 このためスクリプト内で外部プログラムを起動する場合は絶対パスを使用して下さい。
・標準出力への出力は全て無効になります。標準エラー出力を使えば画面に表示されます。