SVN:Python Pre-commit脚本总是失败

问题描述

| 我找到了一个示例python脚本,并对其进行了修改以检查预提交中的注释。我的问题是,由python解析的注释文本始终以空白结尾。 环境:Windows XP SVN版本:svn,版本1.5.6(r36142)编译于2009年3月6日,14:54:47 Python 2.7 提交前
C:\\Python27\\python %1\\hooks\\pre-commit.py %1 %2
预提交
import sys,os,string,re

SVNLOOK=\'C:\\\\SVN\\\\bin\\\\svnlook.exe\'


# return true or false if this passed string is a valid comment
def check(comment):
    #define regular expression
    print comment
    p = re.match(\"[bB][uU][gG]\\s([0-9]+|NONE)+\",comment)
    print p
    return (p != None) #returns false if doesn\'t match

def result(r,txn,repos,log_msg,log_cmd):
    if r == 1:
        sys.stderr.write (\"File: \" + repos + \" Comment: \" + txn + \"\\n\" +\\
                          \"Log Msg: \" + log_msg + \"\\n\" +\\
                          \"Log Cmd: \" + log_cmd + \"\\n\" +\\
                            \"Comments must have the format of \\n\'Bug X\' \\n\" +\\
                          \"\'Comment text\' where X is the issue number.\\n\" +\\
                          \"Use comma to separatemultiple bug id\'s\\n\" +\\
                          \"Example:\\nBug 1234,1235\\nComment: Fixed things\\n\" +\\
                          \"Use \'NONE\' if there is no bug ID\")
        sys.exit(r)

def main(repos,txn):
    log_cmd = \'%s log %s -t %s\' % (SVNLOOK,repos)
    log_msg = os.popen(log_cmd,\'r\').readline().rstrip(\'\\n\')

    if check(log_msg):
        result(0,log_cmd)
    else:
        result(1,log_cmd)

if __name__ == \'__main__\':
    if len(sys.argv) < 3:
        sys.stderr.write(\"Usage: %s REPOS TXN\\n\" % (sys.argv[0]))
    else:
        main(sys.argv[1],sys.argv[2])
我已将vars的打印输出添加错误消息中,以进行调试。 令人讨厌的是,如果我使用bat文件命令,那么一切似乎都可以正常工作: pre-commit.bat只检查空白提交味精:
@echo off  
:: Stops commits that have empty log messages.        
@echo off  

setlocal  

rem Subversion sends through the path to the repository and transaction id  
set REPOS=%1  
set TXN=%2           


rem line below ensures at least one character \".\",5 characters require change to \".....\"
C:\\SVN\\bin\\svnlook.exe log %rEPOS% -t %TXN% | findstr . > nul  
if %errorlevel% gtr 0 (goto err) else exit 0  

:err  
echo. 1>&2  
echo Your commit has been blocked because you didn\'t enter a comment. 1>&2  
echo Write a log message describing the changes made and try again. 1>&2
echo Thanks 1>&2
exit 1
我究竟做错了什么?     

解决方法

通过Python运行时,在批处理文件中将忽略由Python设置的错误代码。您将需要执行以下操作:
C:\\Python27\\python %1\\hooks\\pre-commit.py %1 %2
exit %ERRORLEVEL%
最好也引用您的vaule,以确保它们完整地传递到Python:
C:\\Python27\\python \"%1\\hooks\\pre-commit.py\" \"%1\" \"%2\"
exit %ERRORLEVEL%
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...