2011-12-21 76 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文件?