为了能够和svn配合使用,在修改配置文件后,测试了master,发现遇到如下问题:
File "f:\sandbox\lib\site-packages\twisted\internet\defer.py", line 654, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "f:\sandbox\lib\site-packages\buildbot\changes\svnpoller.py", line 186, in <lambda>
d.addCallback(lambda _: self.get_prefix())
File "f:\sandbox\lib\site-packages\buildbot\changes\svnpoller.py", line 215, in get_prefix
d = self.getProcessOutput(args)
File "f:\sandbox\lib\site-packages\buildbot\changes\svnpoller.py", line 204, in getProcessOutput
d = utils.getProcessOutput(self.svnbin, args, self.environ)
File "f:\sandbox\lib\site-packages\twisted\internet\utils.py", line 128, in getProcessOutput
reactor)
File "f:\sandbox\lib\site-packages\twisted\internet\utils.py", line 28, in _callProtocolWithDeferred
reactor.spawnProcess(p, executable, (executable,)+tuple(args), env, path)
File "f:\sandbox\lib\site-packages\twisted\internet\posixbase.py", line 353, in spawnProcess
return Process(self, processProtocol, executable, args, env, path)
File "f:\sandbox\lib\site-packages\twisted\internet\_dumbwin32proc.py", line 232, in __init__
raise OSError(pwte)
builtins.OSError: (2, 'CreateProcess', '系统找不到指定的文件。')
于是乎,定位到 File "f:\sandbox\lib\site-packages\twisted\internet\_dumbwin32proc.py", line 232,添加了部分代码,监测这里的变化,发现,createprocess在执行win32process.CreateProcess(‘svn’,'svn info --xml --non-interactive file:///F:/localSVN/trunk/HelloWorld',None,None,1,win32con.CREATE_NO_WINDOW,None,None,win32process.STARTUPINFO())时会报错。
一开始就感觉到时第一个参数的问题。于是在cmd下测试cmdline:svn info --xml --non-interactive file:///F:/localSVN/trunk/HelloWorld,一切正常。百思不得其解啊!百度也没有,不死心,怀疑是python调用createprocess的问题,于是测试了用python结合createprocess调用记事本,一切OK。。。。
最后,没办法,直接找到svn的bin路径,直接给定绝对路径,测试OK。
这就奇怪了,明明系统变量里是有svn的,怎么不能用呢?到现在也不知道怎么回事,回头继续研究吧!
目前,现在代码里面cover了,将F:\sandbox\Lib\site-packages\twisted\internet\_dumbwin32proc.py中,在219行加入
if command=="svn":
command='C:\\Program Files (x86)\\VisualSVN\\bin\\svn.exe'
后来发现其实这个svn是可以在配置文件中指定的:
c['change_source'].append(changes.SVNPoller(repourl="file:///F:/localSVN/trunk/HelloWorld",
svnuser=None, svnpasswd=None,pollInterval=10,project='HelloWorld',
svnbin='C:\\Program Files (x86)\\VisualSVN\\bin\\svn.exe',split_file=util.svn.split_file_branches))
在SVNPoller(F:\sandbox\Lib\site-packages\buildbot\changes\svnpoller.py)的class中也有体现,
def __init__(self, repourl, split_file=None,
svnuser=None, svnpasswd=None,
pollInterval=10 * 60, histmax=100,
svnbin='svn', revlinktmpl='', category=None,
project='', cachepath=None, pollinterval=-2,
extra_args=None, name=None, pollAtLaunch=False):
一开始真的是糊涂啊!