Skip to content
forked from dsoprea/PySvn

Lightweight Subversion library for Python.

License

Notifications You must be signed in to change notification settings

BrunoBuett/PySvn

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build_Status Coverage_Status

Introduction

svn is a simple Subversion library for Python. I wrote it so that there could be a lightweight and accessible library that was also available on PyPI. It is compatible with both Python 2.7 and 3.3+.

The library wraps the svn commandline client, which should consequently be installed on the local system.

Functions currently implemented:

  • add
  • cat
  • checkout
  • cleanup
  • commit
  • export
  • diff (with raw and summary support)
  • info
  • list
  • log
  • propdel
  • propget
  • propset
  • remove (i.e. rm, del, delete)
  • status
  • update

In addition, there is also an "admin" class (svn.admin.Admin) that provides a create method with which to create repositories.

You are more than welcome to submit pull-requests to add more support for additional subcommands.

Usage

Usage is divided between two clients that either allow for access to a local working-directory or a remote repository.

Both clients inherit a common set of methods that work with both local working- directories and remote repositories.

svn.utility.get_client is provided for convenience. If you provide a location that starts with a backslash, it will return a LocalClient instance. Otherwise, it will return a RemoteClient instance.

You may pass username and password as optional arguments to both the constructor and utility function.

LocalClient

LocalClient allows access to a local working copy.

The following methods are available for a local client.

add(rel_path, do_include_parents=False)

Add files or directories to the repository.

cleanup()

Recursively clean up the working copy.

commit(message, rel_filepaths=[])

Send changes from your working copy to the repository.

remove(rel_path, do_keep_local=False, do_force=False)

Delete/remove an item from a working copy

status(rel_path=None)

Return the status of working copy files and directories.

update(rel_filepaths=[], revision=None)

Update the working copy.

RemoteClient

RemoteClient allows access to a remote repository.

checkout(path)

Checkout a remote repository:

import svn.remote

r = svn.remote.RemoteClient('https://repo.local/svn')
r.checkout('/tmp/working')

remove(rel_path, message, do_force=False):

Delete/remove an item from the repository

SvnException

SvnException is raised whenever there is an issue with the svn repository. We are no longer supporting catching ValueError.

Common Functionality

These methods are available on both clients.

cat(rel_filepath)

Get file-data as string.

import svn.local

l = svn.local.LocalClient('/tmp/test_repo')
content = l.cat('test_file')

diff(start_revision, end_revision)

Diffs between start and end revisions

Notice of Diff Reimplementation in 1.0.0

There was a previous contribution to the diff implementation that has been reported and confirmed to often throw an exception due to shoddy handling of the file-paths in the output. It also made secondary shell calls and mixed both text and XML output in the response. As a result of this, the decision has been made to just reimplement it and reshape the output in a backwards-incompatible way at the same time. If you need to stick to the older implementation, tie your dependencies to the 0.3.46 release.

diff_summary(start_revision, end_revision)

A lower-level diff summary that doesn't actually provide the content differences.

import svn.remote

l = svn.remote.RemoteClient('http://svn.apache.org/repos/asf')
print l.diff_summary(1760022, 1760023)

# [{'item': 'modified',
#  'kind': 'file',
#  'path': 'http://svn.apache.org/repos/asf/sling/trunk/pom.xml'},
# {'item': 'added',
#  'kind': 'file',
#  'path': 'http://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/models/pom.xml'}]

log_default(timestamp_from_dt=None, timestamp_to_dt=None, limit=None, rel_filepath='', stop_on_copy=False, revision_from=None, revision_to=None, changelist=False)

Perform a log-listing that can be bounded by time or revision number and/or take a maximum-count.

import svn.local

l = svn.local.LocalClient('/tmp/test_repo.co')

for e in l.log_default():
    print(e)

#LogEntry(date=datetime.datetime(2015, 4, 24, 3, 2, 39, 895975, tzinfo=tzutc()), msg='Added second file.', revision=2, author='dustin')
#LogEntry(date=datetime.datetime(2015, 4, 24, 2, 54, 2, 136170, tzinfo=tzutc()), msg='Initial commit.', revision=1, author='dustin')

export(to_path, revision=None, force=False)

Checkout the tree without embedding an meta-information.

import svn.remote

r = svn.remote.RemoteClient('file:///tmp/test_repo')
r.export('/tmp/test_export')

We can also use force option to force the svn export.

info(rel_path=None)

Get information about the directory.

import pprint

import svn.local

r = svn.local.LocalClient('/tmp/test_repo.co')
info = r.info()
pprint.pprint(info)

#{'commit#revision': 0,
# 'commit/author': None,
# 'commit/date': datetime.datetime(2015, 4, 24, 2, 53, 21, 874970, tzinfo=tzutc()),
# 'commit_author': None,
# 'commit_date': datetime.datetime(2015, 4, 24, 2, 53, 21, 874970, tzinfo=tzutc()),
# 'commit_revision': 0,
# 'entry#kind': 'dir',
# 'entry#path': '/tmp/test_repo.co',
# 'entry#revision': 0,
# 'entry_kind': 'dir',
# 'entry_path': '/tmp/test_repo.co',
# 'entry_revision': 0,
# 'relative_url': None,
# 'repository/root': 'file:///tmp/test_repo',
# 'repository/uuid': '7446d4e9-8846-46c0-858a-34a2a1739d1c',
# 'repository_root': 'file:///tmp/test_repo',
# 'repository_uuid': '7446d4e9-8846-46c0-858a-34a2a1739d1c',
# 'url': 'file:///tmp/test_repo',
# 'wc-info/depth': None,
# 'wc-info/schedule': None,
# 'wc-info/wcroot-abspath': None,
# 'wcinfo_depth': None,
# 'wcinfo_schedule': None,
# 'wcinfo_wcroot_abspath': None}

NOTE: The keys named with dashes, slashes, and hashes are considered obsolete, and only available for backwards compatibility. We have since moved to using only underscores to separate words.

list(extended=False, rel_path=None)

Return either a flat-list of filenames or a list of objects describing even more information about each.

import pprint

import svn.local

l = svn.local.LocalClient('/tmp/test_repo.co')

# Flat list.

entries = l.list()
for filename in entries:
    print(filename)

#aa
#bb

# Extended information.

entries = l.list(extended=True)
for entry in entries:
    pprint.pprint(entry)

#{'author': 'dustin',
# 'commit_revision': 1,
# 'date': datetime.datetime(2015, 4, 24, 2, 54, 2, 136170, tzinfo=tzutc()),
# 'is_directory': False,
# 'kind': 'file',
# 'name': 'aa',
# 'size': 0,
# 'timestamp': datetime.datetime(2015, 4, 24, 2, 54, 2, 136170, tzinfo=tzutc())}
#{'author': 'dustin',
# 'commit_revision': 2,
# 'date': datetime.datetime(2015, 4, 24, 3, 2, 39, 895975, tzinfo=tzutc()),
# 'is_directory': False,
# 'kind': 'file',
# 'name': 'bb',
# 'size': 0,
# 'timestamp': datetime.datetime(2015, 4, 24, 3, 2, 39, 895975, tzinfo=tzutc())}

list_recursive(rel_path=None, yield_dirs=False, path_filter_cb=None)

List all entries at and beneath the root or given relative-path.

import pprint

import svn.local

l = svn.local.LocalClient('/tmp/test_repo.co')

for rel_path, e in l.list_recursive():
    print('')
    print('[' + rel_path + ']')
    print('')

    pprint.pprint(e)

#[]
#
#{'author': 'dustin',
# 'commit_revision': 1,
# 'date': datetime.datetime(2015, 4, 24, 2, 54, 2, 136170, tzinfo=tzutc()),
# 'is_directory': False,
# 'kind': 'file',
# 'name': 'aa',
# 'size': 0,
# 'timestamp': datetime.datetime(2015, 4, 24, 2, 54, 2, 136170, tzinfo=tzutc())}
#
#[]
#
#{'author': 'dustin',
# 'commit_revision': 2,
# 'date': datetime.datetime(2015, 4, 24, 3, 2, 39, 895975, tzinfo=tzutc()),
# 'is_directory': False,
# 'kind': 'file',
# 'name': 'bb',
# 'size': 0,
# 'timestamp': datetime.datetime(2015, 4, 24, 3, 2, 39, 895975, tzinfo=tzutc())}
#
#[dir1]
#
#{'author': 'dustin',
# 'commit_revision': 3,
# 'date': datetime.datetime(2015, 4, 24, 3, 25, 13, 479212, tzinfo=tzutc()),
# 'is_directory': False,
# 'kind': 'file',
# 'name': 'cc',
# 'size': 0,
# 'timestamp': datetime.datetime(2015, 4, 24, 3, 25, 13, 479212, tzinfo=tzutc())}

properties(rel_path=None, revision=None):

Return a dictionary with all svn-properties associated with a relative path.

propdel(property_name, rel_path=None, revision=None)

Delete a property with property_anme for the url_or_path.

lc.propdel('svn:mime-type', rel_path='foo.jpg')

propget(property_name, rel_path=None, revision=None):

Return a dictionary with the url_or_path as key and the text for the property_name as value

propdict = lc.propget('svn:mime-type', rel_path='foo.jpg')

propset(property_name, property_value, rel_path=None, revision=None)

Set the property_name to the property_value for the url_or_path as key

c.propset('svn:mime-type','image/jpeg', rel_path='foo.jpg')

About

Lightweight Subversion library for Python.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 99.9%
  • Shell 0.1%