Python: модуль pysvn — работа с репозиторием SVN

Автор: | 11/20/2014
 

PythonУстанавливаем из репозитория:

# yum list pysvn
...
pysvn.x86_64 1.7.6-1.el6 epel
# yum -y install pysvn
...
Installed:
pysvn.x86_64 0:1.7.6-1.el6

pysvn является модулем, который работает с SVN-клиентом, установленным в системе. Т.е., настройки прокси для SVN, авторизация — будут использовать из файла /etc/subversion/servers,.

Созадим первый скрипт — для проcмотра содержимого репозитория:

#!/usr/bin/env python

import pysvn

client = pysvn.Client()

dirlist = client.list( 'http://svnurl.com/svn/' )

print(dirlist)

Запускаем:

# ./svn_1.py
[(<PysvnList u'http://svnurl.com/svn'>, None), (<PysvnList u'http://svnurl.com/svn/PROJ_APP_05112013'>, None), (<PysvnList u'http://svnurl.com/svn/autotest'>, None), (<PysvnList u'http://svnurl.com/svn/database-test'>, None), (<PysvnList u'http://svnurl.com/svn/kievapp'>, None), (<PysvnList u'http://svnurl.com/svn/local_database_source'>, None)]

Метод list возвращает кортеж, который содержит два объекта — путь и имя директории, и значение Lock для неё.

Что бы упорядочить вывод — можно вспользоваться такой конструкцией:

#!/usr/bin/env python

import pysvn

client = pysvn.Client()

dirlist = client.list ('http://svnurl.com/svn/')

for dir in dirlist:
    for i in dir:
        if i:
            print(i['repos_path'])

Имя repos_path — поле для объекта, возвращаемого в кортеже.

Можно использовать например поле created_rev, для получения номера последней ревизии:

for dir in dirlist:
    for i in dir:
        if i:
            print(i['repos_path'])
            print(i['created_rev'])
# ./svn_1.py
/
<Revision kind=number 129>
//PROJ_APP_05112013
<Revision kind=number 113>
//autotest
<Revision kind=number 115>
//database-test
<Revision kind=number 128>
//kievapp
<Revision kind=number 129>
//local_database_source
<Revision kind=number 106>

Другой метод для получения списка — ls:

#!/usr/bin/env python

import pysvn

client = pysvn.Client()

dirlist = client.ls ('http://svnurl.com/svn/')

print(dirlist)
# ./svn_1.py
[<PysvnDirent u'http://svnurl.com/svn/PROJ_APP_05112013'>, <PysvnDirent u'http://svnurl.com/svn/autotest'>, <PysvnDirent u'http://svnurl.com/svn/database-test'>, <PysvnDirent u'http://svnurl.com/svn/kievapp'>, <PysvnDirent u'http://svnurl.com/svn/local_database_source'>]

ls возвращает словарь, в отличии от list.

Что бы вывести только имена — вызовем поле name словаря:

#!/usr/bin/env python

import pysvn

client = pysvn.Client()

dirlist = client.ls ('http://svnurl.com/svn/')

for dir in dirlist:
    print(dir['name'])

И результат:

# ./svn_1.py
http://svnurl.com/svn/PROJ_APP_05112013
http://svnurl.com/svn/autotest
http://svnurl.com/svn/database-test
http://svnurl.com/svn/kievapp
http://svnurl.com/svn/local_database_source

Ещё пример — выполнение export файла из SVN-репозитория:

#!/usr/bin/env python

import os

import pysvn

svn_file = ('http://svnurl.com/svn/file.properties')
local_file = '/tmp/file.properties'

client = pysvn.Client()

try:
    client.export(svn_file, local_file)
except pysvn._pysvn.ClientError as e:
    print('ERROR: %s' % e)

if os.path.isfile('%s' % local_file):
    print('File %s saved.' % local_file)
else:
    print("ERROR: can't find file %s." % local_file)
$ ./svn_2.py
File /tmp/file.properties saved.

Возможностей у модуля очень много, подробности смотрите тут>>>.