2011-12-21 90 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 2011-12-21 07:42:11

+0

ya它是一個服務器端hook.that應該產生客戶端的結果 – shaggy 2011-12-21 08:27:30

回答

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 

這裏有一些變化:

你有這樣的:

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

你推它通過grep的,通過awk,然後通過另一個grep。相反,爲什麼不一次完成整條生產線呢?

"$SVNLOOK" changed -t $TXN "$REPOS" | $GREP -q "^ *[UAM].*\.cpp$" 
  • [UAM]意味着要麼一個UMA。你不需要每個之間的|
  • $GREP -q手段做的grep悄然展開。如果你發現了什麼,它返回一個0,否則返回1.您可以把這個直接進入您的if語句,而不用[...]測試支撐。
  • .*\.cpp$意味着我正在查看該行的其餘部分,並查看它是否以.\.cpp結束。不需要grep|awk|grep管道。
  • 這裏只有一個日誌消息,所以我必須做的是檢查一次。無需循環。
  • 注意我用的是$(...),而不是反勾。它做同樣的事情,但更容易看到。
  • 我使用${MESSAGE:16}。在BASH中,這個消息有16個字符的偏移量。如果我的信息短於16個字符,則${MESSAGE:16}爲空。然後我可以使用-z來查看偏移字符串是否爲空。將管道保存爲sed,然後grep。

看看這個效果好一點。實際上,將它作爲一個普通的shell腳本運行在鉤子之外。您可以將-t更改爲-r並輸入各種版本號。這樣,您可以在將其作爲掛鉤使用之前先驗證腳本。然後,確保將其命名爲pre-commit,並且您將權限設置爲rwxr-xr-x

更好的是,試試我的pre-commit hook。這是戰鬥測試,並可以做更多。它是一個Perl腳本,但它應該在任何大於5.8的Perl版本中運行,並且您的系統上可能已經有Perl。你可以檢查svn:log的長度,但是我的鉤子腳本不允許你根據提交的內容來指定它。但是,爲什麼還要允許任何空白提交消息 - 是否提交*.cpp文件?