post-commit hookを試す

Subversionではコミットの前後などに hook してスクリプトを実行する機能があります。
スクリプトリポジトリ側のhooks/ディレクトリに配置し、リポジトリ側で実行されます。


hookポイント以下のようなものがあり結構細かいです。

  • start-comit
  • pre-commt
  • post-comit
  • pre-revpop-change
  • post-revrop-change
  • pre-lock
  • post-loc
  • pre-unlok
  • post-unlck


早速やってみましょう。
まずはテスト用のリポジトリを作成します。

cd tmp
mkdir testrepos
svnadmin create ~/tmp/testrepos
mkdir  src
cd src
svn checkout /home/taro/tmp/testrepos .
svn checkout file://home/taro/tmp/testrepos .
svn checkout file:///home/taro/tmp/testrepos .
svn add ChangeLog
svn ci -m ""


この時点で /home/taro/testrepos/hooks に hookスクリプトのサンプルができているので参考にすると良いでしょう。
hookスクリプトは以下の条件を満たすと実行されるようです。

  • hooksディレクトリに存在する
  • 実行権限が付与されている
  • hookポイントの名前がそのままファイル名である
  • レポジトリの存在するOSで Executable である。(sh/Perl/Python/exeなど何でも良い)


例えば Perl でhookスクリプト post-commit を以下のように書いてみると、ログにリポジトリパス、Revision、変更されたがファイルが吐かれます。
とても簡単です。

#!/usr/bin/perl
use strict;

my $repos = shift;
my $rev = shift;

sub print_log {
    my $text = shift;
    open(OUT, ">>/home/taro/tmp/post-commit.log");
    print OUT $text;
    close(OUT);
}

print_log(sprintf("repos=%s\n $rev=%s\n", $repos, $rev));
my $result = `/usr/local/bin/svnlook changed $repos`;
print_log(sprintf("[%s]", $result));


現実的な使い方としては、例えば post-commit を利用して変更をメールで送るとか、 pre-commit でコミット前に syntax check をするといった使い方ができそうです。


ただ今回 Mona でやろうとしていた「RevisionをChageLogに追記」は sf.net では以下の理由でできないことが分かりました。

  • hook は sf.net が用意したスクリプトしか利用できない
  • hook から参照可能な位置に、レポジトリローカルコピーを配置できない

残念。