【发布时间】:2012-09-24 09:01:49
【问题描述】:
我正在 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.bat,sys.stdin.read() 就可以了。
请帮帮我。
截图如下:
环境:
- Windows Server 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(免费)足以运行该虚拟机。
==============[解决方法]==================
@nmenezes 提供的非常好的解决方法,在 bat 中带有 c:\Python27\python.exe D:\svntest\testhook.py %*。
【问题讨论】:
-
为什么不直接使用.py文件呢?
-
我相信我可以在 Linux 上做到这一点。但是在 Windows 上,svn 拒绝直接调用 pre-revprop-change.py。