Subversion 1.5 では merge-tracking がサポートされています。 merge-tracking のための情報は svn:mergeinfo というプロパティで管理されています。
しかし、Subversion 1.4 以前のクライアントから、Subversion 1.5 サーバーに コミットすると、svn:mergeinfo の情報を正しく更新しないため、せっかくの merge-tracking が正常に機能しなくなってしまいます。
この文章では、(merge-tracking をサポートしない) Subversion 1.4 以前のクライアントからの コミットを拒否できるように、サーバーを設定する方法を説明します。コミットを拒否するか しないかはサーバー管理者が制御することができます。
サーバーに Subversion 1.5 を使うのであれば、個人的には Merge Tracking を正しく動作させるために Subversion 1.4 以前のクライアントからのコミットを拒否することをおすすめします。
コミットを拒否するために、 start-commit フックスクリプトを使用します。ユーザがコミット権限があるかどうかを決定するフック スクリプトです。このスクリプトが0 以外の値を返すと、トランザクションが作成される前 にコミットが失敗します。
参考
引数の名前 | 値 | |
---|---|---|
第1引数 | REPOS-PATH | リポジトリのパスです。 |
第2引数 | USER | コミットしようとしているユーザーの名前です。 |
第3引数 | CAPABILITIES | クライアントがサポートしている機能のリストです。
(コロンで区切られています) (ハッシュで実装されているため、順番は未定義です。) |
引数の名前 | Subversion 1.5 クライアント | Subversion 1.4 クライアント | |
---|---|---|---|
第1引数 | REPOS-PATH | /var/svn/repos | /var/svn/repos |
第2引数 | USER | user1 | user1 |
第3引数 | CAPABILITIES | mergeinfo | "" |
pl2bat start-commit.pl
start-commit.pl 手抜き版
#!/usr/bin/perl
$capa = $ARGV[2];
if( $capa =~ /mergeinfo/ ){
exit 0;
}
else{
print STDERR "commit fail: you must use Subversion 1.5 or later\n";
exit 1;
}
start-commit.pl (将来のバージョンも考慮したバージョン)
#!/usr/bin/perl # # [1] REPOS-PATH (the path to this repository) ← start-commit.tmpl のコメントを引用 # [2] USER (the authenticated user attempting to commit) # [3] CAPABILITIES (a colon-separated list of capabilities reported # by the client; see note below) # # Note: The CAPABILITIES parameter is new in Subversion 1.5, and 1.5 # clients will typically report at least the "mergeinfo" capability. # If there are other capabilities, then the list is colon-separated, # e.g.: "mergeinfo:some-other-capability" (the order is undefined). # $repos = $ARGV[0]; $user = $ARGV[1]; $capa = $ARGV[2]; # CAPABILITIES は ':' (コロン) で区切られたリストなので # コロンをセパレータとして分離する。 @capa = split /:/, $capa; # 処理するために、一度ハッシュに入れておく foreach my $tmp ( @capa ){ $capa{ $tmp }++; } # "mergeinfo" を含むかどうかで判断する。 # コミットを許可する場合 => 0 を返す # コミットを失敗させる場合 => 0 以外を返す。 # if( $capa{ "mergeinfo" } ){ exit 0; } else{ print STDERR "commit fail: you must use Subversion 1.5 or later\n"; exit 1; }