comparison svnrepo.py @ 328:48ec2d62dc29

Rename tag_repo.py to svnrepo.py and get rid of the 'fake' tags.
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
date Sat, 09 May 2009 12:34:29 +0200
parents tag_repo.py@98740f66a70c
children 75f082b5897e
comparison
equal deleted inserted replaced
327:98740f66a70c 328:48ec2d62dc29
1 from mercurial import node
2 from mercurial import util as hgutil
3 import mercurial.repo
4
5 import hg_delta_editor
6 import util
7 import wrappers
8
9 def generate_repo_class(ui, repo):
10 def localsvn(fn):
11 '''
12 Filter for instance methods which only apply to local Subversion
13 repositories.
14 '''
15 if util.is_svn_repo(repo):
16 return fn
17 else:
18 original = repo.__getattribute__(fn.__name__)
19 return original
20
21 def remotesvn(fn):
22 '''
23 Filter for instance methods which require the first argument
24 to be a remote Subversion repository instance.
25 '''
26 original = repo.__getattribute__(fn.__name__)
27 def wrapper(self, *args, **opts):
28 if not isinstance(args[0], svnremoterepo):
29 return original(*args, **opts)
30 else:
31 return fn(self, *args, **opts)
32 wrapper.__name__ = fn.__name__ + '_wrapper'
33 wrapper.__doc__ = fn.__doc__
34 return wrapper
35
36 class svnlocalrepo(repo.__class__):
37 @remotesvn
38 def pull(self, remote, heads=None, force=False):
39 try:
40 lock = self.wlock()
41 wrappers.pull(None, self.ui, self, source=remote.path,
42 svn=True, rev=heads, force=force)
43 except KeyboardInterrupt:
44 pass
45 finally:
46 lock.release()
47
48 @localsvn
49 def tags(self):
50 tags = super(svnlocalrepo, self).tags()
51 hg_editor = hg_delta_editor.HgChangeReceiver(repo=self)
52 for tag, source in hg_editor.tags.iteritems():
53 target = hg_editor.get_parent_revision(source[1]+1, source[0])
54 tags['tag/%s' % tag] = node.hex(target)
55 return tags
56
57 repo.__class__ = svnlocalrepo
58
59 class svnremoterepo(mercurial.repo.repository):
60 def __init__(self, ui, path):
61 self.ui = ui
62 self.path = path
63 self.capabilities = set(['lookup'])
64
65 def url(self):
66 return self.path
67
68 def lookup(self, key):
69 return key
70
71 def cancopy(self):
72 return False
73
74 def heads(self, *args, **opts):
75 """
76 Whenever this function is hit, we abort. The traceback is useful for
77 figuring out where to intercept the functionality.
78 """
79 raise hgutil.Abort('command unavailable for Subversion repositories')
80
81 def instance(ui, url, create):
82 if create:
83 raise hgutil.Abort('cannot create new remote Subversion repository')
84
85 if url.startswith('svn+') and not url.startswith('svn+ssh:'):
86 url = url[4:]
87 return svnremoterepo(ui, util.normalize_url(url))