test_ok1/py/path/svn/xsvnbinding.py

111 lines
3.6 KiB
Python

"""
module defining subversion path objects.
SvnBindingPath implementation using svn-swig-py-bindings
"""
# import svn swig-c-bindings
if 0:
#import svn.client, svn.core, svn.util, atexit
#svn.util.apr_initialize()
#atexit.register(svn.util.apr_terminate)
#import os, sys, time, re
#from common import *
#from svncommon import _cache, _repocache, SvnPathBase
class SvnBindingPath(SvnPathBase):
pool = svn.util.svn_pool_create(None)
def _make_rev_t(self):
rev = svn.core.svn_opt_revision_t()
if self.rev is not None:
rev.kind = svn.core.svn_opt_revision_number
rev.value.number = self.rev
return rev
def _make_cctx(self):
cctx = svn.client.svn_client_ctx_t()
provider = svn.client.svn_client_get_simple_provider(self.pool)
cctx.auth_baton = svn.util.svn_auth_open([provider], self.pool)
return cctx
def open(self, mode='r'):
assert 'w' not in mode and 'a' not in mode
assert self.exists() # svn cat returns an empty file otherwise
return os.popen("svn cat -r %s '%s'" % (self.rev, self.strpath))
# XXX we don't know how to make our own stream
#from svn import client, util, core
#url = self.strpath
#rev = self._make_rev_t()
#cctx = self._make_cctx()
#stream = core.svn_stream_create(None, self.pool)
#client.svn_client_cat(stream, url, rev, cctx, self.pool)
#return stream.get_value()
def _propget(self, name):
url = self.strpath
rev = self._make_rev_t()
cctx = self._make_cctx()
table = svn.client.svn_client_propget(name, url, rev, 0, cctx, self.pool)
return str(table.values()[0])
def _proplist(self):
url = self.strpath
rev = self._make_rev_t()
cctx = self._make_cctx()
table = svn.client.svn_client_proplist(url, rev, 0, cctx, self.pool)
if not table:
return {}
content = table[0][1]
for name, value in content.items():
content[name] = str(value)
return content
def exists(self):
try:
self.proplist()
except RuntimeError, e:
if e.args[0].lower().find('unknown node')!=-1:
return 0
raise
return 1
def _listdir_nameinfo(self):
""" return a tuple of paths on 'self' as a directory """
url = self.strpath
rev = self._make_rev_t()
cctx = self._make_cctx()
try:
dic = svn.client.svn_client_ls(url, rev, 0, cctx, self.pool)
except RuntimeError, e:
raise IOError(e.args)
nameinfo_seq = map(lambda x: (x[0], InfoSvnBinding(x[1])), dic.items())
return nameinfo_seq
class InfoSvnBinding:
def __init__(self, _info):
self.size = _info.size
self.time = _info.time
self.last_author = _info.last_author
self.created_rev = _info.created_rev
self.has_props = _info.has_props
if _info.kind == svn.core.svn_node_dir:
self.kind = 'dir'
elif _info.kind == svn.core.svn_node_file:
self.kind = 'file'
else:
raise ValueError, "unknown kind of svn object"
self.mtime = self.time / 1000000
def __eq__(self, other):
return self.__dict__ == other.__dict__
SvnPath = SvnBindingPath