在Python中将SVN路径转换为本地文件系统路径

0 投票
3 回答
1440 浏览
提问于 2025-04-11 09:31

我正在用Python写一个小工具,这个工具会把在Subversion(SVN)中被修改的文件附加到一封邮件里,并在某些特定的文件夹发生变化时发送这封邮件。我使用的是pysvn这个库来访问代码仓库。

我在本地有一份文件的副本,每次运行这个工具时,我都会更新一下,看看自上次运行以来文件有没有变化。

现在我正在把SVN中的路径名转换为我本地副本中的路径名。

目前我写了以下代码来完成这个任务:

def formatPaths(self, paths):
    newPaths = list()
    for path in paths:
        path = path[len(self.basePath):]
        path = path.replace("/", "\\")
        newPaths.append(path)
    return newPaths

self.basePath的值大概是"/trunk/project1",我想获取的是某些特定文件夹的相对路径(比如"/trunk/project1"下的folder1)。

这样解决问题是否合适,还是说我错过了什么神奇的函数呢?

3 个回答

0

你提到的路径名称复制的具体解决方案是合理的,但你对整个问题的通用解决方案还有改进的空间。

我建议你使用 easy_install anyvc,这是一个为 PIDA IDE 开发的库,它提供了一个统一的 Python 接口来处理版本控制系统,建议你用这个来替代:

from anyvc import Subversion
vc = Subversion('/trunk')

modified = [f.relpath for f in vc.list() if f.state != 'clean']

for f in modified:
    print f.relpath # the relative path of the file to the source root

另外,我可能会把差异(diff)附在邮件里,而不是直接发送实际的文件。不过这也是你的选择。

0

嗯... 这样做就可以了:

baselen = len(self.basePath)
for path in paths:
    path = path[baselen:].replace("/", "\\")
    newPaths.append(path)
return newPaths

如果你愿意,可以这样做:

baselen = len(self.basePath)
return (path[baselen:].replace("/", "\\") for path in paths)

在每次循环中不计算 baselen 也是个好习惯。

3

继续使用切片操作符,但不要在循环内部改变循环变量。为了好玩,可以试试生成器表达式(或者继续使用列表推导)。

baselen = len(self.basePath)
return (path[baselen:].replace("/", "\\") for path in paths)

补充说明:`lstrip()`在这里并不相关。根据手册的说明:

str.lstrip([chars])

返回一个去掉开头字符的新字符串。如果没有提供chars或者是None,就会去掉空白字符。如果提供了且不是None,chars必须是一个字符串;这个字符串中的字符会从调用这个方法的字符串的开头被去掉。

撰写回答