Mercurial > hg
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) |