2

我正在编写一个 SVN pre-commit.bat 文件,该文件调用 Python 脚本来查询我们的问题跟踪系统,以确定用户提供的问题跟踪 ID 是否处于正确状态(例如“打开”状态)并与权限相关联项目。SVN 服务器正在运行 Windows(我认为是 2003 服务器 - 如果有问题,我可以与我们的 IT 小组联系......)。

问题是我似乎无法使 SVN 提交失败*;它总是成功的。AFAIK Python 脚本正在做它应该做的事情;它调用“sys.exit(1)”表示失败(调用“sys.exit(0)”表示成功)。对于 .bat 文件,我在这个论坛中改编了一些据说可以工作的例子,但到目前为止,还没有运气。这是稍微简化的 .bat 文件,

@echo off

set repos=%1 
set transaction=%2 
set proj=ferry

\Python26\python svn_sync.py -s --repos=%repos% --transaction=%transaction% --project=%proj% 

IF %ERRORLEVEL% GTR 0 (GOTO err) else exit 0 

REM This should return a failure to Subversion, but does not
:err
 echo 1>&2  
 echo Your commit has failed due to invalid PR or PR state. 1>&2  
 echo Thanks 1>&2
exit 1

我再次知道脚本正在运行(即不是服务器上的环境变量问题),并且sys.exit(1)代码正在被命中。此外,我很确定“err”函数正在运行,仅仅是“退出 1”返回码被 SVN 忽略了吗?

*注:不完全正确;我提交失败的唯一方法是 Python 脚本出现运行时错误。但是,在这种情况下,生成故意的运行时错误不是可接受的解决方法。

感谢您的关注。

4

2 回答 2

1

尝试更改exit 1exit /b 1. exit将退出命令解释器(cmd.exe);exit /b将退出当前的批处理脚本,但不会退出命令解释器。

exit 1可能正在关闭运行预提交脚本的命令解释器,因此如果它也在同一个命令解释器下运行,则退出代码对 SVN 不可用。

于 2012-04-16T12:14:36.530 回答
0

感谢您的建议,但是我找到了解决方案。

早些时候我说服自己不是这样,但错误实际上是在 Python 脚本中。本质上,当我认为“sys.exit(1)”正在执行时,“sys.exit(0)”正在执行。

下面我稍微改进了之前 .bat 文件中的 echo 语句中的注释,我可以确认这些确实显示在 TortoiseSVN GUI 窗口中。

\Python26\python svn_sync.py -s --repos=%repos% --transaction=%transaction% --project=%proj%   

IF %ERRORLEVEL% GTR 0 GOTO err 

echo ___________________ 1>&2  
echo Commit successful.  1>&2  
echo ___________________ 1>&2  
exit 0 

:err
echo _____________________________________________________ 1>&2  
echo Your commit has failed due to invalid PR or PR state. 1>&2  
echo _____________________________________________________ 1>&2  
exit 1
于 2012-04-16T18:24:41.587 回答