首先:
- 到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]
意味着要麼一個U
或M
或A
。你不需要每個之間的|
。
- 的
$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
文件?
它看起來像一個預先提交鉤子(在你的問題中沒有提到)。它是一個服務器端鉤子腳本?你爲什麼在它上面添加了「tortoisesvn」這個標籤?您是否嘗試過至少記錄通話本身,以便您可以查看腳本是否被調用? – mliebelt 2011-12-21 07:42:11
ya它是一個服務器端hook.that應該產生客戶端的結果 – shaggy 2011-12-21 08:27:30