SVN预提交脚本执行

时间:2011-12-21 06:46:13

标签: svn

这是我的钩子脚本,它应该限制cpp文件的提交而没有注释。但是它无法执行......任何想法

        #!/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

2 个答案:

答案 0 :(得分:0)

确保预提交脚本具有执行权限(chmod +x pre-commit

此外,请确保脚本确实正在执行但您没有意识到它是。请注意,只有在出现错误并且您使用非零错误代码退出时,回显消息才会回显给客户端。

答案 1 :(得分: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文件?