comparison svnwrap/svn_ctypes_wrapper.py @ 0:f2636cfed115

Initial import of hgsubversion into a public repository.
author Augie Fackler <durin42@gmail.com>
date Tue, 30 Sep 2008 11:42:52 -0500
parents
children e37f9d3fd5e7
comparison
equal deleted inserted replaced
-1:000000000000 0:f2636cfed115
1 """Right now this is a dummy module, but it should wrap the ctypes API and
2 allow running this more easily without the SWIG bindings.
3 """
4 from csvn import repos
5
6 class Revision(object):
7 """Wrapper for a Subversion revision.
8 """
9 def __init__(self, revnum, author, message, date, paths, strip_path=''):
10 self.revnum, self.author, self.message = revnum, author, message
11 # TODO parse this into a datetime
12 self.date = date
13 self.paths = {}
14 for p in paths:
15 self.paths[p[len(strip_path):]] = paths[p]
16
17 def __str__(self):
18 return 'r%d by %s' % (self.revnum, self.author)
19
20
21 class SubversionRepo(object):
22 """Wrapper for a Subversion repository.
23
24 This uses the SWIG Python bindings, and will only work on svn >= 1.4.
25 It takes a required param, the URL.
26 """
27 def __init__(self, url=''):
28 self.svn_url = url
29
30 self.init_ra_and_client()
31 self.uuid = ra.get_uuid(self.ra, self.pool)
32 repo_root = ra.get_repos_root(self.ra, self.pool)
33 # *will* have a leading '/', would not if we used get_repos_root2
34 self.subdir = url[len(repo_root):]
35 if not self.subdir or self.subdir[-1] != '/':
36 self.subdir += '/'
37
38 def init_ra_and_client(self):
39 # TODO(augie) need to figure out a way to do auth
40 self.repo = repos.RemoteRepository(self.svn_url)
41
42 @property
43 def HEAD(self):
44 raise NotImplementedError
45
46 @property
47 def START(self):
48 return 0
49
50 @property
51 def branches(self):
52 """Get the branches defined in this repo assuming a standard layout.
53 """
54 raise NotImplementedError
55
56 @property
57 def tags(self):
58 """Get the current tags in this repo assuming a standard layout.
59
60 This returns a dictionary of tag: (source path, source rev)
61 """
62 raise NotImplementedError
63
64 def _get_copy_source(self, path, cached_head=None):
65 """Get copy revision for the given path, assuming it was meant to be
66 a copy of the entire tree.
67 """
68 raise NotImplementedError
69
70 def list_dir(self, dir, revision=None):
71 """List the contents of a server-side directory.
72
73 Returns a dict-like object with one dict key per directory entry.
74
75 Args:
76 dir: the directory to list, no leading slash
77 rev: the revision at which to list the directory, defaults to HEAD
78 """
79 raise NotImplementedError
80
81 def revisions(self, start=None, chunk_size=1000):
82 """Load the history of this repo.
83
84 This is LAZY. It returns a generator, and fetches a small number
85 of revisions at a time.
86
87 The reason this is lazy is so that you can use the same repo object
88 to perform RA calls to get deltas.
89 """
90 # NB: you'd think this would work, but you'd be wrong. I'm pretty
91 # convinced there must be some kind of svn bug here.
92 #return self.fetch_history_at_paths(['tags', 'trunk', 'branches'],
93 # start=start)
94 # this does the same thing, but at the repo root + filtering. It's
95 # kind of tough cookies, sadly.
96 raise NotImplementedError
97
98
99 def fetch_history_at_paths(self, paths, start=None, stop=None,
100 chunk_size=1000):
101 raise NotImplementedError
102
103 def get_replay(self, revision, editor, oldest_rev_i_have=0):
104 raise NotImplementedError
105
106 def get_unified_diff(self, path, revision, deleted=True, ignore_type=False):
107 raise NotImplementedError
108
109 def get_file(self, path, revision):
110 raise NotImplementedError
111
112 def proplist(self, path, revision, recurse=False):
113 raise NotImplementedError
114
115 def fetch_all_files_to_dir(self, path, revision, checkout_path):
116 raise NotImplementedError
117
118 class SubversionRepoCanNotReplay(Exception):
119 """Exception raised when the svn server is too old to have replay.
120 """