サイトマップ 連絡先 トップに戻る 最初に戻る 前に戻る 次へ進む
$Date: 2018-07-07 06:49:13 +0900 (2018/07/07 (土)) $
$Revision: 1347 $

start-commit によるSubversion 1.4 クライアントから Subversion 1.5 サーバーへのコミットを拒否する方法

概要

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 に関して

コミットを拒否するために、 start-commit フックスクリプトを使用します。ユーザがコミット権限があるかどうかを決定するフック スクリプトです。このスクリプトが0 以外の値を返すと、トランザクションが作成される前 にコミットが失敗します。

参考

start-commit の引数

Subversion 1.5 サーバーでは、start-commit は以下の3つの引数を渡されて呼び出されます。 (Subversion 1.4 以前のサーバーでは 2 つの引数です)

start-commit の引数
引数の名前
第1引数 REPOS-PATH リポジトリのパスです。
第2引数 USER コミットしようとしているユーザーの名前です。
第3引数 CAPABILITIES クライアントがサポートしている機能のリストです。 (コロンで区切られています)
(ハッシュで実装されているため、順番は未定義です。)

実際の start-commit の引数の例
引数の名前 Subversion 1.5 クライアント Subversion 1.4 クライアント
第1引数 REPOS-PATH /var/svn/repos /var/svn/repos
第2引数 USER user1 user1
第3引数 CAPABILITIES mergeinfo ""

第3引数が mergeinfo という値を含むかどうかで、merge-tracking サポートの有無を判断できます。

merge-tracking 非サポートの Subversion クライアントからのコミット拒否

以下のスクリプトは、CAPABILITIES に "mergeinfo" が含まれないときに コミットを失敗させるためのスクリプトの例です。

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;
}