SVN预提交脚本执行

SVN预提交脚本执行,svn,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

这是我的钩子脚本,它应该限制提交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

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

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

首先:

  • 仅打印到STDERR的消息,并且仅当预提交脚本的出口不是零时才打印。否则,根本就没有打印输出
  • 提交消息用于整个提交过程。这意味着您不会检查每个文件的提交消息。他们都一样
  • 通过查看revision属性
    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
,并输入各种版本号。这样,您可以在将脚本作为钩子尝试之前先验证它。然后,确保这被称为
预提交
,并且您的权限设置为
rwxr-xr-x


更好的是,试试我的。它经过了战斗的考验,可以做得更多。这是一个Perl脚本,但它应该在任何大于5.8的Perl版本中运行,并且您的系统上可能已经有了Perl。您可以检查svn:log的长度,但是我的hook脚本不允许您根据提交的内容来指定它。但是,不管是否提交了
*.cpp
文件,您为什么要允许任何空白提交消息?

它看起来像预提交挂钩(在您的问题中未提及)。它是服务器端钩子脚本吗?您为什么要在其上添加标签
tortoisesvn
?您是否尝试至少记录调用本身,以便查看脚本是否被调用?是的,这是一个服务器端钩子。这将在客户端生成结果