##// END OF EJS Templates
templater: parse template string to tree by templater class...
templater: parse template string to tree by templater class The parsed tree could be cached, but it isn't for now. We can add a cache later if that matters.

File last commit:

r38373:e637dc0b default
r38373:e637dc0b default
Show More
schemes.py
134 lines | 4.1 KiB | text/x-python | PythonLexer
Alexander Solovyov
schemes extension
r9964 # Copyright 2009, Alexander Solovyov <piranha@piranha.org.ua>
#
# This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Alexander Solovyov
schemes extension
r9964
"""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/
Benjamin Pollack
schemes: add Kiln On Demand to default schemes
r10777 kiln = https://{1}.kilnhg.com/Repo/
Alexander Solovyov
schemes extension
r9964
Martin Geisler
schemes: fixed typos in module docstring
r9965 You can override a predefined scheme by defining a new scheme with the
same name.
Alexander Solovyov
schemes extension
r9964 """
timeless
schemas: use absolute_import
r28379 from __future__ import absolute_import
Alexander Solovyov
schemes extension
r9964
timeless
schemas: use absolute_import
r28379 import os
import re
Yuya Nishihara
py3: move up symbol imports to enforce import-checker rules...
r29205
from mercurial.i18n import _
timeless
schemas: use absolute_import
r28379 from mercurial import (
error,
extensions,
hg,
Pulkit Goyal
py3: replace os.name with pycompat.osname (part 2 of 2)
r30640 pycompat,
Yuya Nishihara
registrar: move cmdutil.command to registrar module (API)...
r32337 registrar,
timeless
schemas: use absolute_import
r28379 templater,
util,
)
Alexander Solovyov
schemes extension
r9964
Jason R. Coombs
schemes: add debugexpandscheme command, resolving a scheme to canonical form
r27982 cmdtable = {}
Yuya Nishihara
registrar: move cmdutil.command to registrar module (API)...
r32337 command = registrar.command(cmdtable)
Augie Fackler
extensions: change magic "shipped with hg" string...
r29841 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
Augie Fackler
extensions: document that `testedwith = 'internal'` is special...
r25186 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
# be specifying the version(s) of Mercurial they are tested with, or
# leave the attribute unspecified.
Augie Fackler
extensions: change magic "shipped with hg" string...
r29841 testedwith = 'ships-with-hg-core'
Augie Fackler
hgext: mark all first-party extensions as such
r16743
Yuya Nishihara
schemes: use br'' literal to define bytes regexp
r31288 _partre = re.compile(br'\{(\d+)\}')
Alexander Solovyov
schemes extension
r9964
class ShortRepository(object):
def __init__(self, url, scheme, templater):
self.scheme = scheme
self.templater = templater
self.url = url
try:
Augie Fackler
schemes: move re construction to module-level and python3-ify...
r31181 self.parts = max(map(int, _partre.findall(self.url)))
Alexander Solovyov
schemes extension
r9964 except ValueError:
self.parts = 0
def __repr__(self):
return '<ShortRepository: %s>' % self.scheme
Gregory Szorc
hg: pass command intents to repo/peer creation (API)...
r37735 def instance(self, ui, url, create, intents=None):
Jason R. Coombs
schemes: extract scheme expansion as its own method on ShortRepository
r27981 url = self.resolve(url)
Gregory Szorc
hg: pass command intents to repo/peer creation (API)...
r37735 return hg._peerlookup(url).instance(ui, url, create, intents=intents)
Jason R. Coombs
schemes: extract scheme expansion as its own method on ShortRepository
r27981
def resolve(self, url):
Mads Kiilerich
fix wording and not-completely-trivial spelling errors and bad docstrings
r17425 # Should this use the util.url class, or is manual parsing better?
Mads Kiilerich
scheme: don't crash on invalid URLs
r18910 try:
url = url.split('://', 1)[1]
except IndexError:
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_("no '://' in scheme url '%s'") % url)
Alexander Solovyov
schemes extension
r9964 parts = url.split('/', self.parts)
if len(parts) > self.parts:
tail = parts[-1]
parts = parts[:-1]
else:
tail = ''
Pulkit Goyal
py3: use b"%d" to covert integer to bytes instead of str...
r36686 context = dict(('%d' % (i + 1), v) for i, v in enumerate(parts))
Jason R. Coombs
schemes: extract scheme expansion as its own method on ShortRepository
r27981 return ''.join(self.templater.process(self.url, context)) + tail
Alexander Solovyov
schemes extension
r9964
Matt Mackall
url: nuke some newly-introduced underbars in identifiers
r13827 def hasdriveletter(orig, path):
Patrick Mezard
util: fix url.__str__() for windows file URLs...
r15609 if path:
for scheme in schemes:
if path.startswith(scheme + ':'):
return False
Brodie Rao
schemes: prevent one letter schemes from being interpreted as drive letters...
r13822 return orig(path)
Alexander Solovyov
schemes extension
r9964 schemes = {
'py': 'http://hg.python.org/',
'bb': 'https://bitbucket.org/',
'bb+ssh': 'ssh://hg@bitbucket.org/',
Benjamin Pollack
schemes: add Kiln On Demand to default schemes
r10777 'gcode': 'https://{1}.googlecode.com/hg/',
'kiln': 'https://{1}.kilnhg.com/Repo/'
Alexander Solovyov
schemes extension
r9964 }
def extsetup(ui):
schemes.update(dict(ui.configitems('schemes')))
Yuya Nishihara
templater: parse template string to tree by templater class...
r38373 t = templater.engine(templater.parse)
Alexander Solovyov
schemes extension
r9964 for scheme, url in schemes.items():
Jun Wu
codemod: use pycompat.iswindows...
r34646 if (pycompat.iswindows and len(scheme) == 1 and scheme.isalpha()
Brodie Rao
schemes: prevent one letter schemes from being interpreted as drive letters...
r13822 and os.path.exists('%s:\\' % scheme)):
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_('custom scheme %s:// conflicts with drive '
Brodie Rao
schemes: prevent one letter schemes from being interpreted as drive letters...
r13822 'letter %s:\\\n') % (scheme, scheme.upper()))
Matt Mackall
hg: move peerschemes back to schemes...
r14606 hg.schemes[scheme] = ShortRepository(url, scheme, t)
Brodie Rao
schemes: prevent one letter schemes from being interpreted as drive letters...
r13822
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 extensions.wrapfunction(util, 'hasdriveletter', hasdriveletter)
Jason R. Coombs
schemes: add debugexpandscheme command, resolving a scheme to canonical form
r27982
@command('debugexpandscheme', norepo=True)
def expandscheme(ui, url, **opts):
"""given a repo path, provide the scheme-expanded path
"""
repo = hg._peerlookup(url)
if isinstance(repo, ShortRepository):
url = repo.resolve(url)
ui.write(url + '\n')