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