0

这是一个示例代码:

import pysvn
svnClient = pysvn.Client()
entry = svnClient.info('C:\\MyLibrary\\')
entry.url
headrev = svnClient.info(entry.url).revision.number

最后一行触发错误。entry.url 似乎是正确的:它的值是

u'file:///G:/MyRepository/branches/branch_3.0'

运行最后一行导致

Traceback (most recent call last): File "<stdin>", line 1, in <module>   pysvn._pysvn_2_7.ClientError: 'file:\G:\MyRepository\branches' is not a working copy 'C:\Python27\file:\G:\MyRepository\branches' does not exist

我在 Windows 上使用 Python 2.7(从错误消息中可以看出:-)。

必须是微不足道的,但我不知道如何使它工作。有任何想法吗?

谢谢。

4

2 回答 2

0

您遇到的麻烦是您有一个 URL,file:///G:/MyRepository/branches/branch_3.0您将其传递给一个pysvn.Client.info需要本地路径而不是 URL 的函数。当函数试图将 URL 视为文件名时,它最终会在其当前工作目录中查找(因为 URL 不是以驱动器号或指示绝对路径的“/”字符开头)。不出所料,它在C:\Python27\file:\G:\MyRepository\branches.

要解决此问题,您需要将您的 URL 转换为合法的文件名。首先,您需要切断 URL 的协议(即file://. 然后您需要确保 URL 的“路径”部分对于您的操作系统是合法的。下面是一些可以为您执行此操作的代码:

import pysvn
import urllib # note, the url2pathname function is in urllib.request in Python 3

svnClient = pysvn.Client()
entry = svnClient.info('C:\\MyLibrary\\')

url = entry.url
assert(url.startswith("file://")     # basic error checking
pathPart = url[7:]                   # chop off "file://" prefix
path = urllib.url2pathname(pathPart) # convert path to something OS appropriate

headrev = svnClient.info(path).revision.number

注意这有点脆弱。file://如果您从第一次调用该方法时得到的不是URL info,它将引发一个AssertionError,这可能不是您想要的。恐怕我对 Subversion 的了解还不够,无法知道您要完成什么,或者是否有更好的方法来完成它。例如,可能值得看看pysvn.Client.info2似乎接受某些类型请求的 URL 的方法。

于 2012-08-02T06:30:15.273 回答
0

尝试使用字符串方法从 entry.url 中过滤 file:///C:/ 并将其写入相对于 Python 安装目录的内容。

于 2012-08-01T13:05:07.443 回答