まず:STDERRへ
- メッセージだけが印刷され、事前にコミットスクリプトの終了は、ゼロ以外のものである場合にのみされています。そうでなければ、プリントアウトは全くありません。
- コミットメッセージは、コミット全体に対するものです。つまり、すべての単一ファイルのコミットメッセージをチェックしません。それはすべての人にとって同じです。
- コミットメッセージは、リビジョンプロパティ
svn:log
を参照して見つけることができます。あなたはメッセージを見る必要はありません。
この完全にテストされていない書き換えを試してみてください:ここで
#!/bin/bash
REPOS="$1"
TXN="$2"
SVNLOOK="/usr/bin/svnlook"
AWK="/usr/bin/awk"
GREP="/bin/egrep"
SED="/bin/sed"
if "$SVNLOOK" changed -t $TXN | grep -q "^ *[UAM].*\.cpp$"
then
MESSAGE=$("$SVNLOOK" pget -t $TXN --revprop "$REPOS" svn:log)
if [ -z ${MESSAGE:16} ]
then
echo "Committing a *.cpp file, but didn't put a comment!" >&2
exit 1 #CPP, but message too short
else
exit 0 #CPP Files but message is long enough
fi
exit 0 #No CPP files
は、変更の一部です:
あなたがこの持っていた:ANを通じて、あなたはgrepのを通してそれをプッシュする
CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A|M]" | $AWK '{print $2}' | $GREP \\.cpp$`
をawk、そして別のgrepを通して。代わりに、一度に行全体をしないでください。
"$SVNLOOK" changed -t $TXN "$REPOS" | $GREP -q "^ *[UAM].*\.cpp$"
[UAM]
はU
又はM
又はA
のいずれかを意味します。それぞれの間に|
は必要ありません。
$GREP -q
は、grepを静かに実行することを意味します。何か見つかった場合は0を返し、それ以外の場合は1を返します。これは[...]
テスト中括弧なしでif
ステートメントに直接入れることができます。
.*\.cpp$
は、残りの行を見て、それが.\.cpp
で終わるかどうかを調べることを意味します。grep|awk|grep
パイプは不要です。
- ログメッセージは1つだけなので、一度確認するだけです。ループの必要はありません。
- 通知バックティックの代わりに
$(...)
を使用します。それは同じことをしますが、見やすくなります。
- 私は
${MESSAGE:16}
を使用します。 BASHでは、これは私のメッセージの16文字のオフセットです。メッセージが16文字未満の場合、${MESSAGE:16}
は空白です。次に、-z
を使用して、オフセット文字列が空であるかどうかを確認できます。パイプをsedに保存してからgrepします。
これが少しうまく機能するかどうかを確認してください。実際、これをフックの外にある通常のシェルスクリプトとして実行します。 -t
を-r
に変更し、さまざまなリビジョン番号を付けることができます。これにより、スクリプトをフックとして試す前に、スクリプトを最初に確認することができます。次に、これがpre-commit
と呼ばれ、許可がrwxr-xr-x
に設定されていることを確認します。
さらに、私のpre-commit hookを試してみてください。それは戦闘テストされ、より多くを行うことができます。これはPerlスクリプトですが、5.8より大きいPerlバージョンで実行する必要があります。すでにPerlがシステムにインストールされている可能性があります。 svn:logの長さを確認することはできますが、私のフックスクリプトでは、コミットされたものに基づいて指定することはできません。しかし、とにかく空白のコミットメッセージを許可する必要があります - *.cpp
ファイルがコミットされたかどうか?
これは、プリコミットフックのように見えます(あなたの質問には言及されていません)。それはサーバーサイドフックスクリプトですか?なぜあなたはそれに 'tortoisesvn'というラベルを追加しましたか?スクリプトがまったく呼び出されているかどうかを確認できるように、少なくとも呼び出し自体をログに記録しようとしましたか? – mliebelt
これはサーバー側のフックです。クライアント側で結果を生成する必要があります – shaggy