SVNでSVNLookを使用して変更されたアイテムを検索する方法
質問
svnlook
が以下の作業方法について教えてください。/tags
の下のタグ内のコミットを防ぐためにフックにこれを含めたい:
$SVNLOOK changed -t "$TXN" "$REPOS" | grep "^U\W.*\/tags\/" && /bin/echo "Cannot commit to tags!" 1>&2 && exit 1
. 解決
Subversion Pre-Commitフックは、0
の終了コードを返す場合、コミットを通過することができます。それ以外の場合は、Pre-Commitフックは fail になり、コミットは処理されません。
$SVNLOOK changed -t "$TXN" "$REPOS"
には、$REPOS
で発生した$TXN
の変更が表示されます。シェル変数はあなたが設定する必要があります。 Subversionに付属のpre-commit
スクリプトを見ると、次のようになります。
$TXN=$1
$REPO=$2
.
svnlook changed
コマンドの出力は次のようになります。
$ $SVNLOOK changed -t $TXN $REPOS
A trunk/vendors/deli/
A trunk/vendors/deli/chips.txt
A trunk/vendors/deli/sandwich.txt
A trunk/vendors/deli/pickle.txt
U trunk/vendors/baker/bagel.txt
_U trunk/vendors/baker/croissant.txt
UU trunk/vendors/baker/pretzel.txt
D trunk/vendors/baker/baguette.txt
.
最初の列は、ゼロのものであるか否か、 a ddded、又は a ddded、又は > d が現れた。 2番目の列は属性を表します。
残りは、行動されたファイルの名前です。 baguette.txt
が削除され、croissant.txt
のプロパティが変更されたことがわかりますが、ファイル自体が更新されていませんでした。
誰かがタグを変更しようとしたとしましょう。 svnlook changed
の出力は次のようになります。
$SVNLOOK changed -t $TXN $REPOS
U tags/4.2.1/vendors/baker/bagel.txt
.
grepコマンドはこれです:
grep "^U\W.*\/tags\/"
.
これは、^U
で始まる行を更新であることを意味しています。その後、/tags
で始まる文字列を探します。うーん...それは問題かもしれません。 svnlook changed
コマンドの出力と一致しません。
多分それは次のようになるべきです:
grep -q "^U.[[\s+tags/"
.
これは、U
で始まる文字列と、その後に他の文字が続き、続いて空白、次にtags/
。
その式を確認したい場合があります。
&&
は list演算子です。 &&
の左側の式が正常に実行された場合(すなわち、ゼロの終了コードを返す)が実行された場合、右側のステートメントが実行されます。それ以外の場合は、右側のステートメントは実行されません。
このように、あなたのgrep
が誰かがタグを更新したように見えるパターンと一致する場合、それは真になります。 &&
の右側のステートメントが実行されます。
したがって、
/bin/echo "Cannot commit to tags!" 1>&2
.
が実行されます。これはSubversionクライアントに送信されるStderrに送信されますが、Pre-Commitフックの終了コードがゼロの場合に限ります。
このようにして、exit 1
が成功したら、次のリスト演算子コマンド/bin/echo
が実行されます。 (そうではないかもしれませんが、通常はそうなるでしょう)。これにより、プレコミットフックがゼロ以外の終了コードで終了し、フックが失敗し、Cannot commit to tags!
がユーザーがSVNクライアントに送信されます。
この声明のようにこの声明のために世界では絶対に理由はありません。これはほぼ同等であり、理解しやすい:
if $SVNLOOK changed -t $TXN $REPOS | grep -q "^U.[[\s+tags/"
then
/bin/echo "Cannot commit to tags!" 1>&2"
exit 1
fi
exit 0
.
結局のところ、とにかくpre-commit
というシェルスクリプトにこれを置く必要があり、とにかくシェル変数$SVNLOOK
、$REPOS
、および$TXN
を設定します。
これが等価ではない理由は、/bin/echo
が失敗してもコミットが失敗することです。
タグを制御するための手前のコミットフックを探している場合は、鉱山。これは何百ものサイトでテストされており、あなたのリポジトリをもっと多くのコントロールを与え、より良いエラーチェックを行います。
このフックはコントロールファイルを使用してリポジトリへのアクセスを制御します。たとえば、必要に応じてタグを変更できるようにすることができます。
[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/**
access = read-only
users = @ALL
[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/
access = add-only
users = @ALL
[file I can modify and delete tags]
file = /tags/**
access = read-write
users = jazzr
.
フックを見てください。それは標準Perl 5.8.8のインストールおよび上に機能します。他のモジュールは必要ありません。ただし、Subversion Access ControlのLDAPまたはActive Directoryを使用する場合は、Net::LDAP
Perlモジュールをインストールし、アクセス制御のためにプレコミットフックでLDAPまたはActive Directoryグループを使用できます。
他のヒント
$SVNLOOK changed -t "$TXN" "$REPOS"
変更されたすべてのパスを印刷します。パラメータの詳細についてはこちらを参照してください。
http://svnbook.red-an.com / en/1.7/svn.ref.svnlook.c.Changed.html
次に、変更されたパスのリストは、パスに "/ tags /"がある場合にチェックしているかどうかを確認しているGREPに配置されています。
&&シェルのAND演算子です。 grepコマンドが一致を見つけると、ステータスコード0は次の場合に返されます。この場合は「true」と&&実行した後のコマンドは、そうでなければそれはそうではありません。
&& | grep "^U\W.*\/tags\/"
の後の部分はechoコマンドを実行し、1(標準出力)から&2へのメッセージを標準エラーです。これが成功した場合、コマンドはステータスコード1 /bin/echo "Cannot commit to tags!" 1>&2
で終了します。これにより、フックスクリプトはゼロ以外のステータスコードで戻り、コミットは「タグをコミットできません」に失敗します。ユーザーへのメッセージ。