フックスクリプト

フックスクリプトとは


Subversionには、フックスクリプトという機構が用意されています。
クライアントがリポジトリに対して、なんらかのアクションを起こした際に起動するスクリプトです。
リポジトリのhooksディレクトリにあるスクリプトファイルが実行されます。

種類


hooksディレクトリにはフックスクリプトのテンプレートが用意されています。
以下の名称でスクリプトを作成すると、それぞれのタイミングで実行されます。
各スクリプトは、独自の引数を渡されて実行されます。
具体的には次の動作テストにて。

・start-commit
コミットのトランザクションが開始後に実行されます。
コミット権限がないとエラーを返します。
$1:リポジトリのパス
$2:クライアントのユーザ名

・pre-commit
コミットのトランザクションが終了後に実行されます。
(コミット完了後ではありません。)
$1:リポジトリのパス
$2:トランザクション

・post-commit
トランザクションのデータがコミットされた後に実行されます。
$1:リポジトリのパス
$2:トランザクション番号

※ 参考
hooksディレクトリのテンプレートは以下です。

[root@example hooks]# ls
post-commit.tmpl post-unlock.tmpl pre-revprop-change.tmpl
post-lock.tmpl pre-commit.tmpl pre-unlock.tmpl
post-revprop-change.tmpl pre-lock.tmpl start-commit.tmpl

動作テスト


まず、テンプレートをコピーして各種フックスクリプトを作成します。
今回の目的は、どのような引数が渡されるか確かめることです。
なので、テンプレートに記述されている各種処理は省きます。

引数を単にechoするだけのスクリプトを作成します。

start-commit

#!/bin/bash
REPOS="$1"
USER="$2"
LOG="test.log"

# 引数を確かめます。
echo start-commit:${REPOS} >> $LOG
echo start-commit:${USER} >> $LOG

pre-commit
#!/bin/bash
REPOS="$1"
TXN="$2"
LOG="test.log"

# 引数を確かめます。
echo pre-commit:${REPOS} >> $LOG
echo pre-commit:${TXN} >> $LOG

post-commit

#!/bin/bash
REPOS="$1"
REV="$2"
LOG="test.log"

# 引数を確かめます。
echo post-commit:${REPOS} >> $LOG
echo post-commit:${REV} >> $LOG


以下の条件でクライアントからコミットします。
ユーザ名:testuser
リポジトリ:/home/svn/repos/sampleproject
リビジョン:3

コミットしたユーザのディレクトリに「test.log」が作成されているので、見てみましょう。

[testuser@example ~]$ cat test.log
start-commit:/home/svn/repos/sampleproject
start-commit:testuser
pre-commit:/home/svn/repos/sampleproject
pre-commit:2-3
post-commit:/home/svn/repos/sampleproject
post-commit:3