首先:
- 到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