Перевести SVN-путь в локальную файловую систему в Python - PullRequest
0 голосов
/ 30 октября 2008

Я пишу утилиту на 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", и я просто хочу получить относительный путь к подмножеству папок (т.е. folder1 в "/trunk/project1").

Это хороший способ решить эту проблему, или я пропустил какую-то магическую функцию?

Ответы [ 3 ]

2 голосов
/ 30 октября 2008

Оставайтесь с оператором слайса, но не изменяйте переменную цикла внутри цикла. для развлечения попробуйте выражение генератора (или оставьте listcomp).

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

Edit: `lstrip () 'здесь не имеет значения. Из руководства :

str.lstrip ([символы])

Возвращает копию строки с удаленными начальными символами. Если символы не указаны или Нет, пробельные символы удаляются. Если дано, а не None, символы должны быть строка; символы в строке будут удалены с начала Строка, к которой вызывается этот метод.

0 голосов
/ 30 октября 2008

Ваше конкретное решение для копии имени пути разумно, но ваше общее решение всей проблемы может быть улучшено.

Я бы 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 голосов
/ 30 октября 2008

Хм ... Вот бы это сделать:

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 в каждой итерации цикла также является хорошей практикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...