[PATCH] schemes extension
Alexander Solovyov
piranha at piranha.org.ua
Thu Nov 26 02:45:39 CST 2009
# HG changeset patch
# User Alexander Solovyov <piranha at piranha.org.ua>
# Date 1259077703 -7200
# Node ID 27cba833328e4053e3ea9375c720693b7d8f5d0b
# Parent a9cab6c49d61d3fe10dc524377952f1b1d0bc128
schemes extension
diff --git a/hgext/schemes.py b/hgext/schemes.py
new file mode 100644
--- /dev/null
+++ b/hgext/schemes.py
@@ -0,0 +1,75 @@
+# Copyright 2009, Alexander Solovyov under terms of GPLv2
+"""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/
+
+Of course, it is possible to supply custom urls for schemes with suffixes::
+
+ [schemes]
+ ex = ssh://example.com/hg
+ ex+http = http://hg.example.com/
+
+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, splitted by /. Anything not
+specified as {part} will be just appended to an url.
+"""
+
+import re
+from mercurial import hg, ui, util, 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 '<ShortRepository: %s>' % 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': 'http://bitbucket.org/',
+ 'bb+ssh': 'ssh://hg@bitbucket.org/',
+ 'gcode': 'http://{1}.googlecode.com/hg/'
+ }
+
+def getschemes():
+ u = ui.ui()
+ t = templater.engine(lambda x: x)
+ schemes.update(dict(u.configitems('schemes')))
+ for scheme, url in schemes.items():
+ hg.schemes[scheme] = ShortRepository(url, scheme, t)
+
+getschemes()
diff --git a/tests/test-schemes b/tests/test-schemes
new file mode 100755
--- /dev/null
+++ b/tests/test-schemes
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+cat <<EOF >> $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 --git a/tests/test-schemes.out b/tests/test-schemes.out
new file mode 100644
--- /dev/null
+++ b/tests/test-schemes.out
@@ -0,0 +1,5 @@
+adding a
+comparing with l://
+searching for changes
+no changes found
+% errors
More information about the Mercurial-devel
mailing list