2008-10-30 109 views
0

我正在Python中編寫一個實用程序,它將Subversion中已更改的文件附加到電子郵件中,並在SVN中的源代碼管理下的文件夾子集發生更改時發送它。我正在使用pysvn庫來訪問存儲庫。在Python中將SVN路徑翻譯成本地文件系統路徑

我有我的本地文件系統上的文件的副本,我做了更新以檢查自上次運行該實用程序以來文件是否已更改。

我正在將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會是這樣「/主幹/ PROJECT1」,我期待只得到的一個子集的相對路徑文件夾(「/ trunk/project1」下的文件夾1)。

這是一個很好的方法來解決這個問題,或者是否有一些我錯過的神奇功能?

回答

2

留在切片運算符,但不要更改循環內的循環變量。爲了好玩,請嘗試生成器表達式(或保留listcomp)。

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

編輯:`lstrip()」是不是與此有關。從manual

str.lstrip([字符])

返回移除前導字符串的副本。如果字符被省略或 無,則刪除空白字符。如果給出而不是無,字符必須是 字符串;該字符串中的字符將從調用該方法的 字符串的起始處被刪除。

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也是很好的做法。

+0

str.lstrip([chars])不接受整數。 – gimel 2008-10-30 15:44:42

+0

Narf。這很愚蠢。 :-D(我會糾正它的。) – Tomalak 2008-10-30 19:08:39

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來的電子郵件,而不是實際的文件。但我想這是你的選擇。