##// END OF EJS Templates
transplant: stop using the `pycompat.open()` shim
transplant: stop using the `pycompat.open()` shim

File last commit:

r52756:f4733654 default
r53279:ea79fa8a default
Show More
schemes.py
177 lines | 5.2 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 """
Matt Harbison
typing: add `from __future__ import annotations` to most files...
r52756 from __future__ import annotations
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,
urlutil: extract `url` related code from `util` into the new module...
r47669 )
from mercurial.utils import (
urlutil,
timeless
schemas: use absolute_import
r28379 )
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
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 testedwith = b'ships-with-hg-core'
Augie Fackler
hgext: mark all first-party extensions as such
r16743
Matt Harbison
cleanup: drop redundant character escapes outside of `[]`...
r44474 _partre = re.compile(br'{(\d+)\}')
Alexander Solovyov
schemes extension
r9964
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
py3: use class X: instead of class X(object):...
r49801 class ShortRepository:
Alexander Solovyov
schemes extension
r9964 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):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return b'<ShortRepository: %s>' % self.scheme
Alexander Solovyov
schemes extension
r9964
peer: pass the `path` object to `make_peer`...
r50652 def make_peer(self, ui, path, *args, **kwargs):
new_url = self.resolve(path.rawloc)
path = path.copy(new_raw_location=new_url)
cls = hg.peer_schemes.get(path.url.scheme)
peer: use a dedicated name for the `peer` constructor...
r50645 if cls is not None:
peer: pass the `path` object to `make_peer`...
r50652 return cls.make_peer(ui, path, *args, **kwargs)
peer: use a dedicated name for the `peer` constructor...
r50645 return None
Gregory Szorc
hg: allow extra arguments to be passed to repo creation (API)...
r39585 def instance(self, ui, url, create, intents=None, createopts=None):
Jason R. Coombs
schemes: extract scheme expansion as its own method on ShortRepository
r27981 url = self.resolve(url)
peer: dissolve `_peerlookup` into its last two callers...
r50644 u = urlutil.url(url)
scheme = u.scheme or b'file'
if scheme in hg.peer_schemes:
cls = hg.peer_schemes[scheme]
elif scheme in hg.repo_schemes:
cls = hg.repo_schemes[scheme]
else:
cls = hg.LocalFactory
return cls.instance(
Augie Fackler
formatting: blacken the codebase...
r43346 ui, url, create, intents=intents, createopts=createopts
)
Jason R. Coombs
schemes: extract scheme expansion as its own method on ShortRepository
r27981
def resolve(self, url):
urlutil: extract `url` related code from `util` into the new module...
r47669 # Should this use the urlutil.url class, or is manual parsing better?
Mads Kiilerich
scheme: don't crash on invalid URLs
r18910 try:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 url = url.split(b'://', 1)[1]
Mads Kiilerich
scheme: don't crash on invalid URLs
r18910 except IndexError:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"no '://' in scheme url '%s'") % url)
parts = url.split(b'/', self.parts)
Alexander Solovyov
schemes extension
r9964 if len(parts) > self.parts:
tail = parts[-1]
parts = parts[:-1]
else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 tail = b''
Augie Fackler
cleanup: run pyupgrade on our source tree to clean up varying things...
r44937 context = {b'%d' % (i + 1): v for i, v in enumerate(parts)}
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return b''.join(self.templater.process(self.url, context)) + tail
Alexander Solovyov
schemes extension
r9964
Augie Fackler
formatting: blacken the codebase...
r43346
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:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if path.startswith(scheme + b':'):
Patrick Mezard
util: fix url.__str__() for windows file URLs...
r15609 return False
Brodie Rao
schemes: prevent one letter schemes from being interpreted as drive letters...
r13822 return orig(path)
Augie Fackler
formatting: blacken the codebase...
r43346
Alexander Solovyov
schemes extension
r9964 schemes = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'py': b'http://hg.python.org/',
b'bb': b'https://bitbucket.org/',
b'bb+ssh': b'ssh://hg@bitbucket.org/',
b'gcode': b'https://{1}.googlecode.com/hg/',
b'kiln': b'https://{1}.kilnhg.com/Repo/',
Augie Fackler
formatting: blacken the codebase...
r43346 }
Alexander Solovyov
schemes extension
r9964
Matt Harbison
schemes: fix a broken check for drive letter conflicts...
r50745 def _check_drive_letter(scheme: bytes) -> None:
scheme: move the drive letter checking in its own function...
r50585 """check if a scheme conflict with a Windows drive letter"""
if (
pycompat.iswindows
and len(scheme) == 1
and scheme.isalpha()
and os.path.exists(b'%s:\\' % scheme)
):
msg = _(b'custom scheme %s:// conflicts with drive letter %s:\\\n')
msg %= (scheme, scheme.upper())
raise error.Abort(msg)
Alexander Solovyov
schemes extension
r9964 def extsetup(ui):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 schemes.update(dict(ui.configitems(b'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():
Matt Harbison
schemes: fix a broken check for drive letter conflicts...
r50745 _check_drive_letter(scheme)
peer-or-repo: split the scheme between repo and peer...
r50584 url_scheme = urlutil.url(url).scheme
if url_scheme in hg.peer_schemes:
hg.peer_schemes[scheme] = ShortRepository(url, scheme, t)
else:
hg.repo_schemes[scheme] = ShortRepository(url, scheme, t)
Brodie Rao
schemes: prevent one letter schemes from being interpreted as drive letters...
r13822
wrapfunction: use sysstr instead of bytes as argument in "schemes"...
r51684 extensions.wrapfunction(urlutil, 'hasdriveletter', hasdriveletter)
Jason R. Coombs
schemes: add debugexpandscheme command, resolving a scheme to canonical form
r27982
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @command(b'debugexpandscheme', norepo=True)
Jason R. Coombs
schemes: add debugexpandscheme command, resolving a scheme to canonical form
r27982 def expandscheme(ui, url, **opts):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """given a repo path, provide the scheme-expanded path"""
peer-or-repo: split the scheme between repo and peer...
r50584 scheme = urlutil.url(url).scheme
if scheme in hg.peer_schemes:
cls = hg.peer_schemes[scheme]
else:
cls = hg.repo_schemes.get(scheme)
if cls is not None and isinstance(cls, ShortRepository):
url = cls.resolve(url)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(url + b'\n')