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

时间:2008-10-30 05:07:18

标签: python svn

我正在用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”下的文件夹1)。

这是解决这个问题的好方法还是我错过了一些神奇的功能?

3 个答案:

答案 0 :(得分:2)

保持切片运算符,但不要更改循环内的循环变量。为了好玩,尝试生成器表达式(或保持listcomp)。

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

编辑:`lstrip()'与此无关。来自manual

  

str.lstrip([字符])

     

返回删除了前导字符的字符串副本。如果省略字符或       无,删除空格字符。如果给出而不是None,则字符必须是a       串;字符串中的字符将从开头删除       string调用此方法。

答案 1 :(得分: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也是一种很好的做法。

答案 2 :(得分: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

此外,我可能会将差异附加到电子邮件而不是实际文件。但我想这是你的选择。