hgext/schemes.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 07 Mar 2024 10:55:22 +0100
changeset 51531 f85f23f1479b
parent 50791 d51a76b5262b
permissions -rw-r--r--
branchcache: skip entries that are topological heads in the on disk file In the majority of cases, topological heads are also branch heads. We have efficient way to get the topological heads and efficient way to retrieve their branch information. So there is little value in putting them in the branch cache file explicitly. On the contrary, writing them explicitly tend to create very large cache file that are inefficient to read and update. So the branch cache v3 format is no longer including them. This changeset focus on the format aspect and have no focus on the performance aspect. We will cover that later.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     1
# Copyright 2009, Alexander Solovyov <piranha@piranha.org.ua>
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     2
#
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     3
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10070
diff changeset
     4
# GNU General Public License version 2 or any later version.
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     5
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     6
"""extend schemes with shortcuts to repository swarms
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     7
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     8
This extension allows you to specify shortcuts for parent URLs with a
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     9
lot of repositories to act like a scheme, for example::
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    10
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    11
  [schemes]
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    12
  py = http://code.python.org/hg/
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    13
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    14
After that you can use it like::
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    15
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    16
  hg clone py://trunk/
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    17
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    18
Additionally there is support for some more complex schemas, for
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    19
example used by Google Code::
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    20
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    21
  [schemes]
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    22
  gcode = http://{1}.googlecode.com/hg/
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    23
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    24
The syntax is taken from Mercurial templates, and you have unlimited
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    25
number of variables, starting with ``{1}`` and continuing with
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    26
``{2}``, ``{3}`` and so on. This variables will receive parts of URL
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    27
supplied, split by ``/``. Anything not specified as ``{part}`` will be
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    28
just appended to an URL.
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    29
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    30
For convenience, the extension adds these schemes by default::
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    31
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    32
  [schemes]
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    33
  py = http://hg.python.org/
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    34
  bb = https://bitbucket.org/
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    35
  bb+ssh = ssh://hg@bitbucket.org/
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    36
  gcode = https://{1}.googlecode.com/hg/
10777
bdc3256a318e schemes: add Kiln On Demand to default schemes
Benjamin Pollack <benjamin@bitquabit.com>
parents: 10282
diff changeset
    37
  kiln = https://{1}.kilnhg.com/Repo/
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    38
9965
963ed04a8fde schemes: fixed typos in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 9964
diff changeset
    39
You can override a predefined scheme by defining a new scheme with the
963ed04a8fde schemes: fixed typos in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 9964
diff changeset
    40
same name.
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    41
"""
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    42
28379
27a9032374a7 schemas: use absolute_import
timeless <timeless@mozdev.org>
parents: 27982
diff changeset
    43
import os
27a9032374a7 schemas: use absolute_import
timeless <timeless@mozdev.org>
parents: 27982
diff changeset
    44
import re
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28379
diff changeset
    45
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28379
diff changeset
    46
from mercurial.i18n import _
28379
27a9032374a7 schemas: use absolute_import
timeless <timeless@mozdev.org>
parents: 27982
diff changeset
    47
from mercurial import (
27a9032374a7 schemas: use absolute_import
timeless <timeless@mozdev.org>
parents: 27982
diff changeset
    48
    error,
27a9032374a7 schemas: use absolute_import
timeless <timeless@mozdev.org>
parents: 27982
diff changeset
    49
    extensions,
27a9032374a7 schemas: use absolute_import
timeless <timeless@mozdev.org>
parents: 27982
diff changeset
    50
    hg,
30640
7a3e67bfa417 py3: replace os.name with pycompat.osname (part 2 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29841
diff changeset
    51
    pycompat,
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31288
diff changeset
    52
    registrar,
28379
27a9032374a7 schemas: use absolute_import
timeless <timeless@mozdev.org>
parents: 27982
diff changeset
    53
    templater,
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
    54
)
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
    55
from mercurial.utils import (
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
    56
    urlutil,
28379
27a9032374a7 schemas: use absolute_import
timeless <timeless@mozdev.org>
parents: 27982
diff changeset
    57
)
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    58
27982
bf1d5c223ac0 schemes: add debugexpandscheme command, resolving a scheme to canonical form
Jason R. Coombs <jaraco@jaraco.com>
parents: 27981
diff changeset
    59
cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31288
diff changeset
    60
command = registrar.command(cmdtable)
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29205
diff changeset
    61
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 18910
diff changeset
    62
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 18910
diff changeset
    63
# be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 18910
diff changeset
    64
# leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    65
testedwith = b'ships-with-hg-core'
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 15609
diff changeset
    66
44022
c1ccefb513e4 cleanup: drop redundant character escapes outside of `[]`
Matt Harbison <matt_harbison@yahoo.com>
parents: 43077
diff changeset
    67
_partre = re.compile(br'{(\d+)\}')
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    68
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 39549
diff changeset
    69
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
    70
class ShortRepository:
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    71
    def __init__(self, url, scheme, templater):
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    72
        self.scheme = scheme
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    73
        self.templater = templater
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    74
        self.url = url
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    75
        try:
31181
150cd5125722 schemes: move re construction to module-level and python3-ify
Augie Fackler <raf@durin42.com>
parents: 30640
diff changeset
    76
            self.parts = max(map(int, _partre.findall(self.url)))
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    77
        except ValueError:
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    78
            self.parts = 0
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    79
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    80
    def __repr__(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    81
        return b'<ShortRepository: %s>' % self.scheme
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    82
49757
5f71fff8dc74 peer: pass the `path` object to `make_peer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49750
diff changeset
    83
    def make_peer(self, ui, path, *args, **kwargs):
5f71fff8dc74 peer: pass the `path` object to `make_peer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49750
diff changeset
    84
        new_url = self.resolve(path.rawloc)
5f71fff8dc74 peer: pass the `path` object to `make_peer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49750
diff changeset
    85
        path = path.copy(new_raw_location=new_url)
5f71fff8dc74 peer: pass the `path` object to `make_peer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49750
diff changeset
    86
        cls = hg.peer_schemes.get(path.url.scheme)
49750
f075a9463ee7 peer: use a dedicated name for the `peer` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49749
diff changeset
    87
        if cls is not None:
49757
5f71fff8dc74 peer: pass the `path` object to `make_peer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49750
diff changeset
    88
            return cls.make_peer(ui, path, *args, **kwargs)
49750
f075a9463ee7 peer: use a dedicated name for the `peer` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49749
diff changeset
    89
        return None
f075a9463ee7 peer: use a dedicated name for the `peer` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49749
diff changeset
    90
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38354
diff changeset
    91
    def instance(self, ui, url, create, intents=None, createopts=None):
27981
d630eac3a5db schemes: extract scheme expansion as its own method on ShortRepository
Jason R. Coombs <jaraco@jaraco.com>
parents: 26587
diff changeset
    92
        url = self.resolve(url)
49749
be3fcd9e5e52 peer: dissolve `_peerlookup` into its last two callers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49690
diff changeset
    93
        u = urlutil.url(url)
be3fcd9e5e52 peer: dissolve `_peerlookup` into its last two callers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49690
diff changeset
    94
        scheme = u.scheme or b'file'
be3fcd9e5e52 peer: dissolve `_peerlookup` into its last two callers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49690
diff changeset
    95
        if scheme in hg.peer_schemes:
be3fcd9e5e52 peer: dissolve `_peerlookup` into its last two callers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49690
diff changeset
    96
            cls = hg.peer_schemes[scheme]
be3fcd9e5e52 peer: dissolve `_peerlookup` into its last two callers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49690
diff changeset
    97
        elif scheme in hg.repo_schemes:
be3fcd9e5e52 peer: dissolve `_peerlookup` into its last two callers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49690
diff changeset
    98
            cls = hg.repo_schemes[scheme]
be3fcd9e5e52 peer: dissolve `_peerlookup` into its last two callers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49690
diff changeset
    99
        else:
be3fcd9e5e52 peer: dissolve `_peerlookup` into its last two callers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49690
diff changeset
   100
            cls = hg.LocalFactory
be3fcd9e5e52 peer: dissolve `_peerlookup` into its last two callers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49690
diff changeset
   101
        return cls.instance(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 39549
diff changeset
   102
            ui, url, create, intents=intents, createopts=createopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 39549
diff changeset
   103
        )
27981
d630eac3a5db schemes: extract scheme expansion as its own method on ShortRepository
Jason R. Coombs <jaraco@jaraco.com>
parents: 26587
diff changeset
   104
d630eac3a5db schemes: extract scheme expansion as its own method on ShortRepository
Jason R. Coombs <jaraco@jaraco.com>
parents: 26587
diff changeset
   105
    def resolve(self, url):
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
   106
        # Should this use the urlutil.url class, or is manual parsing better?
18910
b52404a914a9 scheme: don't crash on invalid URLs
Mads Kiilerich <madski@unity3d.com>
parents: 17425
diff changeset
   107
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   108
            url = url.split(b'://', 1)[1]
18910
b52404a914a9 scheme: don't crash on invalid URLs
Mads Kiilerich <madski@unity3d.com>
parents: 17425
diff changeset
   109
        except IndexError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   110
            raise error.Abort(_(b"no '://' in scheme url '%s'") % url)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   111
        parts = url.split(b'/', self.parts)
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   112
        if len(parts) > self.parts:
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   113
            tail = parts[-1]
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   114
            parts = parts[:-1]
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   115
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   116
            tail = b''
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44022
diff changeset
   117
        context = {b'%d' % (i + 1): v for i, v in enumerate(parts)}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   118
        return b''.join(self.templater.process(self.url, context)) + tail
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   119
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 39549
diff changeset
   120
13827
f1823b9f073b url: nuke some newly-introduced underbars in identifiers
Matt Mackall <mpm@selenic.com>
parents: 13822
diff changeset
   121
def hasdriveletter(orig, path):
15609
8f4bad72d8b1 util: fix url.__str__() for windows file URLs
Patrick Mezard <pmezard@gmail.com>
parents: 14606
diff changeset
   122
    if path:
8f4bad72d8b1 util: fix url.__str__() for windows file URLs
Patrick Mezard <pmezard@gmail.com>
parents: 14606
diff changeset
   123
        for scheme in schemes:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   124
            if path.startswith(scheme + b':'):
15609
8f4bad72d8b1 util: fix url.__str__() for windows file URLs
Patrick Mezard <pmezard@gmail.com>
parents: 14606
diff changeset
   125
                return False
13822
fbf32a6c903e schemes: prevent one letter schemes from being interpreted as drive letters
Brodie Rao <brodie@bitheap.org>
parents: 10777
diff changeset
   126
    return orig(path)
fbf32a6c903e schemes: prevent one letter schemes from being interpreted as drive letters
Brodie Rao <brodie@bitheap.org>
parents: 10777
diff changeset
   127
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 39549
diff changeset
   128
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   129
schemes = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   130
    b'py': b'http://hg.python.org/',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   131
    b'bb': b'https://bitbucket.org/',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   132
    b'bb+ssh': b'ssh://hg@bitbucket.org/',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   133
    b'gcode': b'https://{1}.googlecode.com/hg/',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   134
    b'kiln': b'https://{1}.kilnhg.com/Repo/',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 39549
diff changeset
   135
}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 39549
diff changeset
   136
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   137
49850
bcc45b33efb2 schemes: fix a broken check for drive letter conflicts
Matt Harbison <matt_harbison@yahoo.com>
parents: 49757
diff changeset
   138
def _check_drive_letter(scheme: bytes) -> None:
49690
1863584f2fba scheme: move the drive letter checking in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49689
diff changeset
   139
    """check if a scheme conflict with a Windows drive letter"""
1863584f2fba scheme: move the drive letter checking in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49689
diff changeset
   140
    if (
1863584f2fba scheme: move the drive letter checking in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49689
diff changeset
   141
        pycompat.iswindows
1863584f2fba scheme: move the drive letter checking in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49689
diff changeset
   142
        and len(scheme) == 1
1863584f2fba scheme: move the drive letter checking in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49689
diff changeset
   143
        and scheme.isalpha()
1863584f2fba scheme: move the drive letter checking in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49689
diff changeset
   144
        and os.path.exists(b'%s:\\' % scheme)
1863584f2fba scheme: move the drive letter checking in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49689
diff changeset
   145
    ):
1863584f2fba scheme: move the drive letter checking in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49689
diff changeset
   146
        msg = _(b'custom scheme %s:// conflicts with drive letter %s:\\\n')
1863584f2fba scheme: move the drive letter checking in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49689
diff changeset
   147
        msg %= (scheme, scheme.upper())
1863584f2fba scheme: move the drive letter checking in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49689
diff changeset
   148
        raise error.Abort(msg)
1863584f2fba scheme: move the drive letter checking in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49689
diff changeset
   149
1863584f2fba scheme: move the drive letter checking in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49689
diff changeset
   150
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   151
def extsetup(ui):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   152
    schemes.update(dict(ui.configitems(b'schemes')))
38354
e637dc0b3b1f templater: parse template string to tree by templater class
Yuya Nishihara <yuya@tcha.org>
parents: 37717
diff changeset
   153
    t = templater.engine(templater.parse)
9964
e600ad9bc257 schemes extension
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   154
    for scheme, url in schemes.items():
49850
bcc45b33efb2 schemes: fix a broken check for drive letter conflicts
Matt Harbison <matt_harbison@yahoo.com>
parents: 49757
diff changeset
   155
        _check_drive_letter(scheme)
49689
f73f02ef8cb6 peer-or-repo: split the scheme between repo and peer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   156
        url_scheme = urlutil.url(url).scheme
f73f02ef8cb6 peer-or-repo: split the scheme between repo and peer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   157
        if url_scheme in hg.peer_schemes:
f73f02ef8cb6 peer-or-repo: split the scheme between repo and peer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   158
            hg.peer_schemes[scheme] = ShortRepository(url, scheme, t)
f73f02ef8cb6 peer-or-repo: split the scheme between repo and peer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   159
        else:
f73f02ef8cb6 peer-or-repo: split the scheme between repo and peer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   160
            hg.repo_schemes[scheme] = ShortRepository(url, scheme, t)
13822
fbf32a6c903e schemes: prevent one letter schemes from being interpreted as drive letters
Brodie Rao <brodie@bitheap.org>
parents: 10777
diff changeset
   161
50791
d51a76b5262b wrapfunction: use sysstr instead of bytes as argument in "schemes"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49850
diff changeset
   162
    extensions.wrapfunction(urlutil, 'hasdriveletter', hasdriveletter)
27982
bf1d5c223ac0 schemes: add debugexpandscheme command, resolving a scheme to canonical form
Jason R. Coombs <jaraco@jaraco.com>
parents: 27981
diff changeset
   163
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 39549
diff changeset
   164
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   165
@command(b'debugexpandscheme', norepo=True)
27982
bf1d5c223ac0 schemes: add debugexpandscheme command, resolving a scheme to canonical form
Jason R. Coombs <jaraco@jaraco.com>
parents: 27981
diff changeset
   166
def expandscheme(ui, url, **opts):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44452
diff changeset
   167
    """given a repo path, provide the scheme-expanded path"""
49689
f73f02ef8cb6 peer-or-repo: split the scheme between repo and peer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   168
    scheme = urlutil.url(url).scheme
f73f02ef8cb6 peer-or-repo: split the scheme between repo and peer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   169
    if scheme in hg.peer_schemes:
f73f02ef8cb6 peer-or-repo: split the scheme between repo and peer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   170
        cls = hg.peer_schemes[scheme]
f73f02ef8cb6 peer-or-repo: split the scheme between repo and peer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   171
    else:
f73f02ef8cb6 peer-or-repo: split the scheme between repo and peer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   172
        cls = hg.repo_schemes.get(scheme)
f73f02ef8cb6 peer-or-repo: split the scheme between repo and peer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   173
    if cls is not None and isinstance(cls, ShortRepository):
f73f02ef8cb6 peer-or-repo: split the scheme between repo and peer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   174
        url = cls.resolve(url)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   175
    ui.write(url + b'\n')