2011-12-21 9 views
0

は、それが実行に失敗していないcomments.butとのcppファイルのコミット制限する必要があり、私のフックスクリプトです...任意のアイデアSVNプリコミットスクリプトの実行

 #!/bin/bash 

     REPOS="$1" 
     TXN="$2" 

     SVNLOOK="/usr/bin/svnlook" 
     AWK="/usr/bin/awk" 
     GREP="/bin/egrep" 
     SED="/bin/sed" 

     CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A|M]" | $AWK '{print     
     $2}' | $GREP \\.cpp$` 

     for FILE in $CHANGED 
     do 
     MESSAGE=`$SVNLOOK log -t "$TXN" "$REPOS" "$FILE" | sed 's/ *//g' |$GREP ".\    
     {16,\}"` 
     if [ $? -ne 0 ] 
     then 
     echo 1>&2 
     echo "***********************************" 1>&2 
     echo `echo "$MESSAGE"` 1>&2 
     echo "***********************************" 1>&2 
     exit 1 
     fi 
     done 
+0

これは、プリコミットフックのように見えます(あなたの質問には言及されていません)。それはサーバーサイドフックスクリプトですか?なぜあなたはそれに 'tortoisesvn'というラベルを追加しましたか?スクリプトがまったく呼び出されているかどうかを確認できるように、少なくとも呼び出し自体をログに記録しようとしましたか? – mliebelt

+0

これはサーバー側のフックです。クライアント側で結果を生成する必要があります – shaggy

答えて

0

は、プリコミットスクリプトを確認してください実行許可がある(chmod +x pre-commit

また、実際にスクリプトが実行されていることを確認してください。エコーメッセージは、エラーがある場合にのみクライアントにエコーされ、ゼロ以外のエラーコードで終了することに注意してください。

0

まず: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ファイルがコミットされたかどうか?

関連する問題