comparison hgext/schemes.py @ 9964:e600ad9bc257

schemes extension
author Alexander Solovyov <piranha@piranha.org.ua>
date Tue, 24 Nov 2009 17:48:23 +0200
parents
children 963ed04a8fde
comparison
equal deleted inserted replaced
9963:a68fb6f4ae4b 9964:e600ad9bc257
1 # Copyright 2009, Alexander Solovyov <piranha@piranha.org.ua>
2 #
3 # This software may be used and distributed according to the terms of the
4 # GNU General Public License version 2, incorporated herein by reference.
5
6 """extend schemes with shortcuts to repository swarms
7
8 This extension allows you to specify shortcuts for parent URLs with a
9 lot of repositories to act like a scheme, for example::
10
11 [schemes]
12 py = http://code.python.org/hg/
13
14 After that you can use it like::
15
16 hg clone py://trunk/
17
18 Additionally there is support for some more complex schemas, for
19 example used by Google Code::
20
21 [schemes]
22 gcode = http://{1}.googlecode.com/hg/
23
24 The syntax is taken from Mercurial templates, and you have unlimited
25 number of variables, starting with ``{1}`` and continuing with
26 ``{2}``, ``{3}`` and so on. This variables will receive parts of URL
27 supplied, split by ``/``. Anything not specified as ``{part}`` will be
28 just appended to an URL.
29
30 For convenience, the extension adds these schemes by default::
31
32 [schemes]
33 py = http://hg.python.org/
34 bb = https://bitbucket.org/
35 bb+ssh = ssh://hg@bitbucket.org/
36 gcode = https://{1}.googlecode.com/hg/
37
38 You can override the predefined scheme by defining new schemes with
39 the same name.
40 """
41
42 import re
43 from mercurial import hg, templater
44
45
46 class ShortRepository(object):
47 def __init__(self, url, scheme, templater):
48 self.scheme = scheme
49 self.templater = templater
50 self.url = url
51 try:
52 self.parts = max(map(int, re.findall(r'\{(\d+)\}', self.url)))
53 except ValueError:
54 self.parts = 0
55
56 def __repr__(self):
57 return '<ShortRepository: %s>' % self.scheme
58
59 def instance(self, ui, url, create):
60 url = url.split('://', 1)[1]
61 parts = url.split('/', self.parts)
62 if len(parts) > self.parts:
63 tail = parts[-1]
64 parts = parts[:-1]
65 else:
66 tail = ''
67 context = dict((str(i), v) for i, v in enumerate(parts))
68 url = ''.join(self.templater.process(self.url, context)) + tail
69 return hg._lookup(url).instance(ui, url, create)
70
71 schemes = {
72 'py': 'http://hg.python.org/',
73 'bb': 'https://bitbucket.org/',
74 'bb+ssh': 'ssh://hg@bitbucket.org/',
75 'gcode': 'https://{1}.googlecode.com/hg/'
76 }
77
78 def extsetup(ui):
79 schemes.update(dict(ui.configitems('schemes')))
80 t = templater.engine(lambda x: x)
81 for scheme, url in schemes.items():
82 hg.schemes[scheme] = ShortRepository(url, scheme, t)