我正在 Windows 机器上尝试 pre-revprop-change 挂钩脚本,但发现了一个棘手的问题。
我将我的问题提炼为以下场景:
我有C:\csvn\data\repositories\tr1\hooks\pre-revprop-change.bat内容:
D:\svntest\testhook.py %*
exit %ERRORLEVEL%
testhook.py是:
import os, sys
if __name__ == '__main__':
# sys.stderr.write(sys.version+'\n') # this is OK, tried.
newtext = sys.stdin.read() # try to read new log message
sys.stderr.write('newtext is: %s\n'%newtext)
exit(2)
但是,在做客户端时svn propset svn:log --revprop -r 2 "newtext"
,我得到了 python 错误:
Traceback (most recent call last):
File "D:\svntest\testhook.py", line 5, in <module>
newtext = sys.stdin.read() # try to read new log message
IOError: [Errno 9] Bad file descriptor
这个错误的原因是什么?
似乎pre-revprop-change.bat没有将 STDIN 句柄传递给 py 脚本。是的,我验证了pre-revprop-change.bat 可以从 STDIN 获取文本(根据Read stdin stream in a batch file 中的说明)。
我也尝试直接从命令行运行pre-revprop-change.batsys.stdin.read()
,没问题。
请帮助我。
屏幕截图如下:
环境:
- 视窗服务器 2003
- Collabnet Subversion Edge 2.3(svn 1.7.3 和 Apache 2.2.22)
- 从 python.org 安装 Python 2.7.1 msi
==============[最新更新]=====================
不好意思说:我应该写在.bat
exit %ERRORLEVEL%
代替
exit /b %ERRORLEVEL%
对于和我一起尝试过的人,请修复它并重试。/b
似乎 pre-revprop-change.bat 总是以 0 退出。提示:如果没有,/b
直接从 cmd 窗口运行 .bat 会导致 cmd 窗口关闭,所以我们最好尝试使用cmd /c "pre-revprop-change.bat some param"
.
在下面重现此问题的快速方法
更重要的是,对于那些仍然感兴趣的人,请
- 下载这个文件包http://down.nlscan.com/misc/chjsvnpyhook.zip ,
- 将它们提取到 D:\ ,
- cd 进入 D:\svntest\tr1_local ,
- 运行 elog.bat (
svn propset svn:log --revprop -r 2 "newtext"
)
那么我的问题将被重现。(要求:svn.exe 1.7 命令行(collabnet 或 TortoiseSVN),并安装 Python 2.7)
如果仍然无法重现错误。我已经准备了一个 VMware 虚拟机来准确地展示这个问题。在http://down.nlscan.com/misc/chj/winxp-svnhook-py-stdin-error.7z下载 VM (链接预计有效期至 2013 年 9 月)。VMware Player 3.0(免费)足以运行该虚拟机。
==============[找到解决方法]===================</p>
@nmenezes 提供的非常好的解决方法,c:\Python27\python.exe D:\svntest\testhook.py %*
在 bat 中。