Oct 22, 2008

Subversion リポジトリに対する commit を禁止する方法

Subversion のメンテナンスについて触れたので、 ついでに Subversion リポジトリのメンテナンスを実施する際に必要な commit 禁止の設定方法を書いておく。 Subversion リポジトリへの commit 禁止はリポジトリフックの start-commit を使用すると簡単に実現できる。

Version Control with Subversion - start-commit Repository Hooks
http://svnbook.red-bean.com/en/1.5/svn.ref.reposhooks.start-commit.html

start-commit フックの作成

Subversin リポジトリホーム($REPOS) に hooks というリポジトリフックをを格納する場所が用意されているので、その中に start-commit というファイルを作成する。 テンプレートが用意されているので、それをコピーしてもいい。 作成後は実行権限とアクセス権限を適切なものに変更すること。

$REPOS/hooks/start-commit

#!/bin/sh

REPOS="$1"
USER="$2"

if [ -e "$REPOS/commit.lock" ];
then
  echo "Service temporary unavailable." 1>&2
  exit 1
fi 
exit 0

commit の禁止方法

$REPOS/commit.lock というファイルを作成するとリポジトリに対する全ての commit が禁止される。

$ touch $REPOS/commit.lock
この状態でクライアントから commit を実行すると、クライアント側には "Service temporary unavailable." というメッセージが表示され commit が失敗する。 $REPOS/commit.lock を削除すれば再度 commit が可能になる。

commit 以外の更新処理

私のところでは commit 以外の更新系処理に関しても同様にリポジトリの保守前にアクセス制限をかけている。 それぞれのリポジトリフックは以下の通り。下記のリポジトリフックを使用した場合、

  • $REPOS/access.lock ・・・ commit, revporp, lock, unlock を全て禁止
  • $REPOS/commit.lock ・・・ commit を禁止
  • $REPOS/revporp.lock ・・・ revprop を禁止
  • $REPOS/lock.lock ・・・ lock を禁止
  • $REPOS/unlock.lock ・・・ unlock を禁止
となる。

$REPOS/hooks/start-commit

#!/bin/sh

REPOS="$1"
USER="$2"

if [ -e "$REPOS/access.lock" -o -e "$REPOS/commit.lock" ];
then
  echo "Service temporary unavailable." 1>&2
  exit 1
fi 
exit 0

$REPOS/hooks/pre-revprop-change

#!/bin/sh

REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"

if [ -e "$REPOS/access.lock" -o -e "$REPOS/revprop.lock" ];
then
  echo "Service temporary unavailable." 1>&2
  exit 1
fi

if [ "$PROPNAME" = "svn:log" ]; then exit 0; fi
exit 1

$REPOS/hooks/pre-lock

#!/bin/sh

REPOS="$1"
FILE="$2"
USER="$3"

if [ -e "$REPOS/access.lock" -o -e "$REPOS/lock.lock" ];
then
  echo "Service temporary unavailable." 1>&2
  exit 1
fi

exit 0

$REPOS/hooks/pre-unlock

#!/bin/sh

REPOS="$1"
FILE="$2"
USER="$3"

if [ -e "$REPOS/access.lock" -o -e "$REPOS/unlock.lock" ];
then
  echo "Service temporary unavailable." 1>&2
  exit 1
fi

exit 0

TrackBack ping me at
http://www.in-vitro.jp/blog/index.cgi/Subversion/20081022_01.trackback
Post a comment

writeback message: Ready to post a comment.