9966
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.
|
9966
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 |
|
9967
|
38 |
You can override a predefined scheme by defining a new scheme with the
|
|
39 |
same name.
|
9966
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 = ''
|
10070
|
67 |
context = dict((str(i+1), v) for i, v in enumerate(parts))
|
9966
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)
|