# HG changeset patch # User Alexander Solovyov # Date 1259077703 -7200 # Node ID e600ad9bc257a9e92ce3b914757e8a6034f0f765 # Parent a68fb6f4ae4beae4dc1164217e831ab08a261632 schemes extension diff -r a68fb6f4ae4b -r e600ad9bc257 hgext/schemes.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgext/schemes.py Tue Nov 24 17:48:23 2009 +0200 @@ -0,0 +1,82 @@ +# Copyright 2009, Alexander Solovyov +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2, incorporated herein by reference. + +"""extend schemes with shortcuts to repository swarms + +This extension allows you to specify shortcuts for parent URLs with a +lot of repositories to act like a scheme, for example:: + + [schemes] + py = http://code.python.org/hg/ + +After that you can use it like:: + + hg clone py://trunk/ + +Additionally there is support for some more complex schemas, for +example used by Google Code:: + + [schemes] + gcode = http://{1}.googlecode.com/hg/ + +The syntax is taken from Mercurial templates, and you have unlimited +number of variables, starting with ``{1}`` and continuing with +``{2}``, ``{3}`` and so on. This variables will receive parts of URL +supplied, split by ``/``. Anything not specified as ``{part}`` will be +just appended to an URL. + +For convenience, the extension adds these schemes by default:: + + [schemes] + py = http://hg.python.org/ + bb = https://bitbucket.org/ + bb+ssh = ssh://hg@bitbucket.org/ + gcode = https://{1}.googlecode.com/hg/ + +You can override the predefined scheme by defining new schemes with +the same name. +""" + +import re +from mercurial import hg, templater + + +class ShortRepository(object): + def __init__(self, url, scheme, templater): + self.scheme = scheme + self.templater = templater + self.url = url + try: + self.parts = max(map(int, re.findall(r'\{(\d+)\}', self.url))) + except ValueError: + self.parts = 0 + + def __repr__(self): + return '' % self.scheme + + def instance(self, ui, url, create): + url = url.split('://', 1)[1] + parts = url.split('/', self.parts) + if len(parts) > self.parts: + tail = parts[-1] + parts = parts[:-1] + else: + tail = '' + context = dict((str(i), v) for i, v in enumerate(parts)) + url = ''.join(self.templater.process(self.url, context)) + tail + return hg._lookup(url).instance(ui, url, create) + +schemes = { + 'py': 'http://hg.python.org/', + 'bb': 'https://bitbucket.org/', + 'bb+ssh': 'ssh://hg@bitbucket.org/', + 'gcode': 'https://{1}.googlecode.com/hg/' + } + +def extsetup(ui): + schemes.update(dict(ui.configitems('schemes'))) + t = templater.engine(lambda x: x) + for scheme, url in schemes.items(): + hg.schemes[scheme] = ShortRepository(url, scheme, t) diff -r a68fb6f4ae4b -r e600ad9bc257 tests/test-schemes --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-schemes Tue Nov 24 17:48:23 2009 +0200 @@ -0,0 +1,22 @@ +#!/bin/sh + +cat <> $HGRCPATH +[extensions] +schemes= + +[schemes] +l = http://localhost:$HGPORT/ +EOF + +hg init test +cd test +echo a > a +hg ci -Am initial + +hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log +cat hg.pid >> $DAEMON_PIDS + +hg incoming l:// + +echo % errors +cat errors.log diff -r a68fb6f4ae4b -r e600ad9bc257 tests/test-schemes.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-schemes.out Tue Nov 24 17:48:23 2009 +0200 @@ -0,0 +1,5 @@ +adding a +comparing with l:// +searching for changes +no changes found +% errors