mercurial/bundlecaches.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 24 Sep 2024 15:44:10 +0200
changeset 51907 bd7359c18d69
parent 51864 1c5810ce737e
child 51982 aa7f4a45d8fa
permissions -rw-r--r--
rev-branch-cache: fallback on "v1" data if no v2 is found This will help smooth the transition to the v2 format for existing large repository.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     1
# bundlecaches.py - utility to deal with pre-computed bundle for servers
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     2
#
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     3
# This software may be used and distributed according to the terms of the
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     4
# GNU General Public License version 2 or any later version.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     5
51864
1c5810ce737e typing: add `from __future__ import annotations` to remaining source files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51729
diff changeset
     6
from __future__ import annotations
1c5810ce737e typing: add `from __future__ import annotations` to remaining source files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51729
diff changeset
     7
49325
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
     8
import collections
51729
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51672
diff changeset
     9
import typing
49325
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    10
49648
9be765b82a90 typing: minor tweaks to allow updating to pytype 2022.11.18
Matt Harbison <matt_harbison@yahoo.com>
parents: 49332
diff changeset
    11
from typing import (
51574
9b51a4fb0f96 bundlespec: type the _bundlespeccontentopts dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51573
diff changeset
    12
    Dict,
9b51a4fb0f96 bundlespec: type the _bundlespeccontentopts dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51573
diff changeset
    13
    Union,
49648
9be765b82a90 typing: minor tweaks to allow updating to pytype 2022.11.18
Matt Harbison <matt_harbison@yahoo.com>
parents: 49332
diff changeset
    14
    cast,
9be765b82a90 typing: minor tweaks to allow updating to pytype 2022.11.18
Matt Harbison <matt_harbison@yahoo.com>
parents: 49332
diff changeset
    15
)
9be765b82a90 typing: minor tweaks to allow updating to pytype 2022.11.18
Matt Harbison <matt_harbison@yahoo.com>
parents: 49332
diff changeset
    16
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    17
from .i18n import _
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    18
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    19
from .thirdparty import attr
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    20
51729
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51672
diff changeset
    21
# Force pytype to use the non-vendored package
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51672
diff changeset
    22
if typing.TYPE_CHECKING:
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51672
diff changeset
    23
    # noinspection PyPackageRequirements
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51672
diff changeset
    24
    import attr
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51672
diff changeset
    25
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    26
from . import (
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    27
    error,
46627
f4c325bf80fc requirements: also add a generaldelta constant
Raphaël Gomès <rgomes@octobus.net>
parents: 45785
diff changeset
    28
    requirements as requirementsmod,
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    29
    sslutil,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    30
    util,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    31
)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    32
from .utils import stringutil
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    33
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    34
urlreq = util.urlreq
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    35
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    36
BUNDLE_CACHE_DIR = b'bundle-cache'
45785
80f32ec8653a clonebundle: move the manifest filename to a constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45784
diff changeset
    37
CB_MANIFEST_FILE = b'clonebundles.manifest'
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    38
CLONEBUNDLESCHEME = b"peer-bundle-cache://"
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    39
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    40
51672
138ab7c6a6ff typing: add some trivial type hints to `mercurial/bundlecaches.py`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51600
diff changeset
    41
def get_manifest(repo) -> bytes:
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    42
    """get the bundle manifest to be served to a client from a server"""
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    43
    raw_text = repo.vfs.tryread(CB_MANIFEST_FILE)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    44
    entries = [e.split(b' ', 1) for e in raw_text.splitlines()]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    45
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    46
    new_lines = []
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    47
    for e in entries:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    48
        url = alter_bundle_url(repo, e[0])
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    49
        if len(e) == 1:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    50
            line = url + b'\n'
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    51
        else:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    52
            line = b"%s %s\n" % (url, e[1])
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    53
        new_lines.append(line)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    54
    return b''.join(new_lines)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    55
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    56
51672
138ab7c6a6ff typing: add some trivial type hints to `mercurial/bundlecaches.py`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51600
diff changeset
    57
def alter_bundle_url(repo, url: bytes) -> bytes:
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    58
    """a function that exist to help extension and hosting to alter the url
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    59
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    60
    This will typically be used to inject authentication information in the url
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    61
    of cached bundles."""
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    62
    return url
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    63
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    64
50542
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
    65
SUPPORTED_CLONEBUNDLE_SCHEMES = [
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
    66
    b"http://",
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
    67
    b"https://",
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
    68
    b"largefile://",
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
    69
    CLONEBUNDLESCHEME,
50542
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
    70
]
45785
80f32ec8653a clonebundle: move the manifest filename to a constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45784
diff changeset
    71
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    72
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    73
@attr.s
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48601
diff changeset
    74
class bundlespec:
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    75
    compression = attr.ib()
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    76
    wirecompression = attr.ib()
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    77
    version = attr.ib()
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    78
    wireversion = attr.ib()
49325
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    79
    # parameters explicitly overwritten by the config or the specification
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    80
    _explicit_params = attr.ib()
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    81
    # default parameter for the version
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    82
    #
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    83
    # Keeping it separated is useful to check what was actually overwritten.
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    84
    _default_opts = attr.ib()
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    85
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    86
    @property
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    87
    def params(self):
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    88
        return collections.ChainMap(self._explicit_params, self._default_opts)
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    89
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    90
    @property
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    91
    def contentopts(self):
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    92
        # kept for Backward Compatibility concerns.
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    93
        return self.params
bf66f7a1e3f8 bundlespec: merge the contentopts and params dictionnary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49322
diff changeset
    94
49326
3840d16595cf bundlespec: add a `overwrite` parameter to set_param
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49325
diff changeset
    95
    def set_param(self, key, value, overwrite=True):
3840d16595cf bundlespec: add a `overwrite` parameter to set_param
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49325
diff changeset
    96
        """Set a bundle parameter value.
3840d16595cf bundlespec: add a `overwrite` parameter to set_param
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49325
diff changeset
    97
3840d16595cf bundlespec: add a `overwrite` parameter to set_param
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49325
diff changeset
    98
        Will only overwrite if overwrite is true"""
3840d16595cf bundlespec: add a `overwrite` parameter to set_param
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49325
diff changeset
    99
        if overwrite or key not in self._explicit_params:
3840d16595cf bundlespec: add a `overwrite` parameter to set_param
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49325
diff changeset
   100
            self._explicit_params[key] = value
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   101
50712
0913a49e020c bundle-spec: add an official method to format a spec into a string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50686
diff changeset
   102
    def as_spec(self):
0913a49e020c bundle-spec: add an official method to format a spec into a string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50686
diff changeset
   103
        parts = [b"%s-%s" % (self.compression, self.version)]
0913a49e020c bundle-spec: add an official method to format a spec into a string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50686
diff changeset
   104
        for param in sorted(self._explicit_params.items()):
0913a49e020c bundle-spec: add an official method to format a spec into a string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50686
diff changeset
   105
            parts.append(b'%s=%s' % param)
0913a49e020c bundle-spec: add an official method to format a spec into a string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50686
diff changeset
   106
        return b';'.join(parts)
0913a49e020c bundle-spec: add an official method to format a spec into a string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50686
diff changeset
   107
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   108
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   109
# Maps bundle version human names to changegroup versions.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   110
_bundlespeccgversions = {
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   111
    b'v1': b'01',
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   112
    b'v2': b'02',
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   113
    b'v3': b'03',
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   114
    b'packed1': b's1',
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   115
    b'bundle2': b'02',  # legacy
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   116
}
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   117
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   118
# Maps bundle version with content opts to choose which part to bundle
51574
9b51a4fb0f96 bundlespec: type the _bundlespeccontentopts dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51573
diff changeset
   119
_bundlespeccontentopts: Dict[bytes, Dict[bytes, Union[bool, bytes]]] = {
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   120
    b'v1': {
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   121
        b'changegroup': True,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   122
        b'cg.version': b'01',
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   123
        b'obsolescence': False,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   124
        b'phases': False,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   125
        b'tagsfnodescache': False,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   126
        b'revbranchcache': False,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   127
    },
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   128
    b'v2': {
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   129
        b'changegroup': True,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   130
        b'cg.version': b'02',
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   131
        b'obsolescence': False,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   132
        b'phases': False,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   133
        b'tagsfnodescache': True,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   134
        b'revbranchcache': True,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   135
    },
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   136
    b'v3': {
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   137
        b'changegroup': True,
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   138
        b'cg.version': b'03',
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   139
        b'obsolescence': False,
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   140
        b'phases': True,
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   141
        b'tagsfnodescache': True,
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   142
        b'revbranchcache': True,
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   143
    },
49322
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   144
    b'streamv2': {
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   145
        b'changegroup': False,
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   146
        b'cg.version': b'02',
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   147
        b'obsolescence': False,
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   148
        b'phases': False,
51573
4a9d0898bf16 bundlespec: fix the "streamv2" and "streamv3-exp" variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51558
diff changeset
   149
        b"stream": b"v2",
49322
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   150
        b'tagsfnodescache': False,
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   151
        b'revbranchcache': False,
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   152
    },
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   153
    b'streamv3-exp': {
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   154
        b'changegroup': False,
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   155
        b'cg.version': b'03',
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   156
        b'obsolescence': False,
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   157
        b'phases': False,
51573
4a9d0898bf16 bundlespec: fix the "streamv2" and "streamv3-exp" variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51558
diff changeset
   158
        b"stream": b"v3-exp",
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   159
        b'tagsfnodescache': False,
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   160
        b'revbranchcache': False,
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   161
    },
49321
c12c843f0db7 bundlespec: phase out the `_bundlespeccgversions` mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   162
    b'packed1': {
c12c843f0db7 bundlespec: phase out the `_bundlespeccgversions` mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   163
        b'cg.version': b's1',
c12c843f0db7 bundlespec: phase out the `_bundlespeccgversions` mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   164
    },
c12c843f0db7 bundlespec: phase out the `_bundlespeccgversions` mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   165
    b'bundle2': {  # legacy
c12c843f0db7 bundlespec: phase out the `_bundlespeccgversions` mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   166
        b'cg.version': b'02',
c12c843f0db7 bundlespec: phase out the `_bundlespeccgversions` mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   167
    },
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   168
}
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   169
_bundlespeccontentopts[b'bundle2'] = _bundlespeccontentopts[b'v2']
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   170
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   171
# Compression engines allowed in version 1. THIS SHOULD NEVER CHANGE.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   172
_bundlespecv1compengines = {b'gzip', b'bzip2', b'none'}
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   173
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   174
49331
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   175
def param_bool(key, value):
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   176
    """make a boolean out of a parameter value"""
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   177
    b = stringutil.parsebool(value)
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   178
    if b is None:
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   179
        msg = _(b"parameter %s should be a boolean ('%s')")
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   180
        msg %= (key, value)
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   181
        raise error.InvalidBundleSpecification(msg)
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   182
    return b
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   183
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   184
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   185
# mapping of known parameter name need their value processed
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   186
bundle_spec_param_processing = {
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   187
    b"obsolescence": param_bool,
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   188
    b"obsolescence-mandatory": param_bool,
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   189
    b"phases": param_bool,
51562
eac84af0c8cc bundle-spec: properly parse boolean configuration as boolean
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50712
diff changeset
   190
    b"changegroup": param_bool,
eac84af0c8cc bundle-spec: properly parse boolean configuration as boolean
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50712
diff changeset
   191
    b"tagsfnodescache": param_bool,
eac84af0c8cc bundle-spec: properly parse boolean configuration as boolean
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50712
diff changeset
   192
    b"revbranchcache": param_bool,
49331
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   193
}
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   194
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   195
49330
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   196
def _parseparams(s):
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   197
    """parse bundlespec parameter section
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   198
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   199
    input: "comp-version;params" string
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   200
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   201
    return: (spec; {param_key: param_value})
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   202
    """
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   203
    if b';' not in s:
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   204
        return s, {}
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   205
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   206
    params = {}
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   207
    version, paramstr = s.split(b';', 1)
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   208
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   209
    err = _(b'invalid bundle specification: missing "=" in parameter: %s')
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   210
    for p in paramstr.split(b';'):
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   211
        if b'=' not in p:
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   212
            msg = err % p
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   213
            raise error.InvalidBundleSpecification(msg)
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   214
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   215
        key, value = p.split(b'=', 1)
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   216
        key = urlreq.unquote(key)
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   217
        value = urlreq.unquote(value)
49331
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   218
        process = bundle_spec_param_processing.get(key)
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   219
        if process is not None:
1b04d5213d0f bundlespec: add processing of some parameter value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49330
diff changeset
   220
            value = process(key, value)
49330
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   221
        params[key] = value
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   222
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   223
    return version, params
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   224
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   225
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   226
def parsebundlespec(repo, spec, strict=True):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   227
    """Parse a bundle string specification into parts.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   228
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   229
    Bundle specifications denote a well-defined bundle/exchange format.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   230
    The content of a given specification should not change over time in
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   231
    order to ensure that bundles produced by a newer version of Mercurial are
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   232
    readable from an older version.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   233
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   234
    The string currently has the form:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   235
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   236
       <compression>-<type>[;<parameter0>[;<parameter1>]]
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   237
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   238
    Where <compression> is one of the supported compression formats
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   239
    and <type> is (currently) a version string. A ";" can follow the type and
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   240
    all text afterwards is interpreted as URI encoded, ";" delimited key=value
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   241
    pairs.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   242
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   243
    If ``strict`` is True (the default) <compression> is required. Otherwise,
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   244
    it is optional.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   245
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   246
    Returns a bundlespec object of (compression, version, parameters).
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   247
    Compression will be ``None`` if not in strict mode and a compression isn't
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   248
    defined.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   249
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   250
    An ``InvalidBundleSpecification`` is raised when the specification is
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   251
    not syntactically well formed.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   252
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   253
    An ``UnsupportedBundleSpecification`` is raised when the compression or
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   254
    bundle type/version is not recognized.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   255
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   256
    Note: this function will likely eventually return a more complex data
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   257
    structure, including bundle2 part information.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   258
    """
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   259
    if strict and b'-' not in spec:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   260
        raise error.InvalidBundleSpecification(
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   261
            _(
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   262
                b'invalid bundle specification; '
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   263
                b'must be prefixed with compression: %s'
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   264
            )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   265
            % spec
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   266
        )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   267
49332
d89bfc075289 bundlespec: do not check for `-` in the params portion of the bundlespec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49331
diff changeset
   268
    pre_args = spec.split(b';', 1)[0]
d89bfc075289 bundlespec: do not check for `-` in the params portion of the bundlespec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49331
diff changeset
   269
    if b'-' in pre_args:
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   270
        compression, version = spec.split(b'-', 1)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   271
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   272
        if compression not in util.compengines.supportedbundlenames:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   273
            raise error.UnsupportedBundleSpecification(
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   274
                _(b'%s compression is not supported') % compression
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   275
            )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   276
49330
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   277
        version, params = _parseparams(version)
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   278
49321
c12c843f0db7 bundlespec: phase out the `_bundlespeccgversions` mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   279
        if version not in _bundlespeccontentopts:
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   280
            raise error.UnsupportedBundleSpecification(
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   281
                _(b'%s is not a recognized bundle version') % version
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   282
            )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   283
    else:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   284
        # Value could be just the compression or just the version, in which
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   285
        # case some defaults are assumed (but only when not in strict mode).
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   286
        assert not strict
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   287
49330
5d17dd74177d bundlespec: extract the parseparams closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49326
diff changeset
   288
        spec, params = _parseparams(spec)
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   289
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   290
        if spec in util.compengines.supportedbundlenames:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   291
            compression = spec
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   292
            version = b'v1'
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   293
            # Generaldelta repos require v2.
46627
f4c325bf80fc requirements: also add a generaldelta constant
Raphaël Gomès <rgomes@octobus.net>
parents: 45785
diff changeset
   294
            if requirementsmod.GENERALDELTA_REQUIREMENT in repo.requirements:
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   295
                version = b'v2'
47342
dc3800569157 revlogv2: make sure bundling pick a compatible bundle format
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46627
diff changeset
   296
            elif requirementsmod.REVLOGV2_REQUIREMENT in repo.requirements:
dc3800569157 revlogv2: make sure bundling pick a compatible bundle format
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46627
diff changeset
   297
                version = b'v2'
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   298
            # Modern compression engines require v2.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   299
            if compression not in _bundlespecv1compengines:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   300
                version = b'v2'
49321
c12c843f0db7 bundlespec: phase out the `_bundlespeccgversions` mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   301
        elif spec in _bundlespeccontentopts:
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   302
            if spec == b'packed1':
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   303
                compression = b'none'
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   304
            else:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   305
                compression = b'bzip2'
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   306
            version = spec
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   307
        else:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   308
            raise error.UnsupportedBundleSpecification(
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   309
                _(b'%s is not a recognized bundle specification') % spec
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   310
            )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   311
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   312
    # Bundle version 1 only supports a known set of compression engines.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   313
    if version == b'v1' and compression not in _bundlespecv1compengines:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   314
        raise error.UnsupportedBundleSpecification(
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   315
            _(b'compression engine %s is not supported on v1 bundles')
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   316
            % compression
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   317
        )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   318
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   319
    # The specification for packed1 can optionally declare the data formats
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   320
    # required to apply it. If we see this metadata, compare against what the
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   321
    # repo supports and error if the bundle isn't compatible.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   322
    if version == b'packed1' and b'requirements' in params:
49648
9be765b82a90 typing: minor tweaks to allow updating to pytype 2022.11.18
Matt Harbison <matt_harbison@yahoo.com>
parents: 49332
diff changeset
   323
        requirements = set(cast(bytes, params[b'requirements']).split(b','))
48601
baddab229b86 stream-clone: add a explicit set list requirements relevant to stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47342
diff changeset
   324
        missingreqs = requirements - requirementsmod.STREAM_FIXED_REQUIREMENTS
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   325
        if missingreqs:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   326
            raise error.UnsupportedBundleSpecification(
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   327
                _(b'missing support for repository features: %s')
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   328
                % b', '.join(sorted(missingreqs))
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   329
            )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   330
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   331
    # Compute contentopts based on the version
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   332
    if b"stream" in params:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   333
        # This case is fishy as this mostly derails the version selection
49322
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   334
        # mechanism. `stream` bundles are quite specific and used differently
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   335
        # as "normal" bundles.
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   336
        #
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   337
        # (we should probably define a cleaner way to do this and raise a
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   338
        # warning when the old way is encountered)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   339
        if params[b"stream"] == b"v2":
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   340
            version = b"streamv2"
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   341
        if params[b"stream"] == b"v3-exp":
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   342
            version = b"streamv3-exp"
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   343
    contentopts = _bundlespeccontentopts.get(version, {}).copy()
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50542
diff changeset
   344
    if version == b"streamv2" or version == b"streamv3-exp":
49322
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   345
        # streamv2 have been reported as "v2" for a while.
d587f09cad98 bundlespec: make the `stream` case less special
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49321
diff changeset
   346
        version = b"v2"
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   347
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   348
    engine = util.compengines.forbundlename(compression)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   349
    compression, wirecompression = engine.bundletype()
49321
c12c843f0db7 bundlespec: phase out the `_bundlespeccgversions` mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
   350
    wireversion = _bundlespeccontentopts[version][b'cg.version']
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   351
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   352
    return bundlespec(
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   353
        compression, wirecompression, version, wireversion, params, contentopts
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   354
    )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   355
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   356
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   357
def parseclonebundlesmanifest(repo, s):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   358
    """Parses the raw text of a clone bundles manifest.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   359
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   360
    Returns a list of dicts. The dicts have a ``URL`` key corresponding
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   361
    to the URL and other keys are the attributes for the entry.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   362
    """
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   363
    m = []
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   364
    for line in s.splitlines():
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   365
        fields = line.split()
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   366
        if not fields:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   367
            continue
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   368
        attrs = {b'URL': fields[0]}
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   369
        for rawattr in fields[1:]:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   370
            key, value = rawattr.split(b'=', 1)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   371
            key = util.urlreq.unquote(key)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   372
            value = util.urlreq.unquote(value)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   373
            attrs[key] = value
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   374
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   375
            # Parse BUNDLESPEC into components. This makes client-side
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   376
            # preferences easier to specify since you can prefer a single
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   377
            # component of the BUNDLESPEC.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   378
            if key == b'BUNDLESPEC':
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   379
                try:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   380
                    bundlespec = parsebundlespec(repo, value)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   381
                    attrs[b'COMPRESSION'] = bundlespec.compression
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   382
                    attrs[b'VERSION'] = bundlespec.version
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   383
                except error.InvalidBundleSpecification:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   384
                    pass
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   385
                except error.UnsupportedBundleSpecification:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   386
                    pass
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   387
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   388
        m.append(attrs)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   389
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   390
    return m
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   391
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   392
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   393
def isstreamclonespec(bundlespec):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   394
    # Stream clone v1
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   395
    if bundlespec.wirecompression == b'UN' and bundlespec.wireversion == b's1':
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   396
        return True
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   397
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   398
    # Stream clone v2
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   399
    if (
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   400
        bundlespec.wirecompression == b'UN'
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   401
        and bundlespec.wireversion == b'02'
51558
c4aab3661f25 bundlespec: rationalize the way we specify stream bundle version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50712
diff changeset
   402
        and bundlespec.contentopts.get(b'stream', None) in (b"v2", b"v3-exp")
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   403
    ):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   404
        return True
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   405
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   406
    return False
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   407
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   408
50542
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   409
def filterclonebundleentries(
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   410
    repo, entries, streamclonerequested=False, pullbundles=False
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   411
):
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   412
    """Remove incompatible clone bundle manifest entries.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   413
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   414
    Accepts a list of entries parsed with ``parseclonebundlesmanifest``
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   415
    and returns a new list consisting of only the entries that this client
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   416
    should be able to apply.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   417
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   418
    There is no guarantee we'll be able to apply all returned entries because
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   419
    the metadata we use to filter on may be missing or wrong.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   420
    """
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   421
    newentries = []
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   422
    for entry in entries:
50542
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   423
        url = entry.get(b'URL')
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   424
        if not pullbundles and not any(
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   425
            [url.startswith(scheme) for scheme in SUPPORTED_CLONEBUNDLE_SCHEMES]
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   426
        ):
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   427
            repo.ui.debug(
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   428
                b'filtering %s because not a supported clonebundle scheme\n'
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   429
                % url
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   430
            )
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   431
            continue
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   432
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   433
        spec = entry.get(b'BUNDLESPEC')
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   434
        if spec:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   435
            try:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   436
                bundlespec = parsebundlespec(repo, spec, strict=True)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   437
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   438
                # If a stream clone was requested, filter out non-streamclone
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   439
                # entries.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   440
                if streamclonerequested and not isstreamclonespec(bundlespec):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   441
                    repo.ui.debug(
50542
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   442
                        b'filtering %s because not a stream clone\n' % url
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   443
                    )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   444
                    continue
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   445
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   446
            except error.InvalidBundleSpecification as e:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   447
                repo.ui.debug(stringutil.forcebytestr(e) + b'\n')
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   448
                continue
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   449
            except error.UnsupportedBundleSpecification as e:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   450
                repo.ui.debug(
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   451
                    b'filtering %s because unsupported bundle '
50542
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   452
                    b'spec: %s\n' % (url, stringutil.forcebytestr(e))
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   453
                )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   454
                continue
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   455
        # If we don't have a spec and requested a stream clone, we don't know
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   456
        # what the entry is so don't attempt to apply it.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   457
        elif streamclonerequested:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   458
            repo.ui.debug(
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   459
                b'filtering %s because cannot determine if a stream '
50542
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   460
                b'clone bundle\n' % url
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   461
            )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   462
            continue
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   463
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   464
        if b'REQUIRESNI' in entry and not sslutil.hassni:
50542
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   465
            repo.ui.debug(b'filtering %s because SNI not supported\n' % url)
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   466
            continue
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   467
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   468
        if b'REQUIREDRAM' in entry:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   469
            try:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   470
                requiredram = util.sizetoint(entry[b'REQUIREDRAM'])
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   471
            except error.ParseError:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   472
                repo.ui.debug(
50542
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   473
                    b'filtering %s due to a bad REQUIREDRAM attribute\n' % url
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   474
                )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   475
                continue
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   476
            actualram = repo.ui.estimatememory()
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   477
            if actualram is not None and actualram * 0.66 < requiredram:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   478
                repo.ui.debug(
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   479
                    b'filtering %s as it needs more than 2/3 of system memory\n'
50542
7b723217d368 clonebundles: filter out invalid schemes instead of failing on them
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 49648
diff changeset
   480
                    % url
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   481
                )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   482
                continue
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   483
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   484
        newentries.append(entry)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   485
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   486
    return newentries
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   487
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   488
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48601
diff changeset
   489
class clonebundleentry:
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   490
    """Represents an item in a clone bundles manifest.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   491
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   492
    This rich class is needed to support sorting since sorted() in Python 3
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   493
    doesn't support ``cmp`` and our comparison is complex enough that ``key=``
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   494
    won't work.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   495
    """
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   496
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   497
    def __init__(self, value, prefers):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   498
        self.value = value
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   499
        self.prefers = prefers
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   500
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   501
    def _cmp(self, other):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   502
        for prefkey, prefvalue in self.prefers:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   503
            avalue = self.value.get(prefkey)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   504
            bvalue = other.value.get(prefkey)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   505
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   506
            # Special case for b missing attribute and a matches exactly.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   507
            if avalue is not None and bvalue is None and avalue == prefvalue:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   508
                return -1
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   509
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   510
            # Special case for a missing attribute and b matches exactly.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   511
            if bvalue is not None and avalue is None and bvalue == prefvalue:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   512
                return 1
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   513
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   514
            # We can't compare unless attribute present on both.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   515
            if avalue is None or bvalue is None:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   516
                continue
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   517
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   518
            # Same values should fall back to next attribute.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   519
            if avalue == bvalue:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   520
                continue
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   521
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   522
            # Exact matches come first.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   523
            if avalue == prefvalue:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   524
                return -1
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   525
            if bvalue == prefvalue:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   526
                return 1
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   527
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   528
            # Fall back to next attribute.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   529
            continue
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   530
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   531
        # If we got here we couldn't sort by attributes and prefers. Fall
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   532
        # back to index order.
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   533
        return 0
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   534
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   535
    def __lt__(self, other):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   536
        return self._cmp(other) < 0
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   537
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   538
    def __gt__(self, other):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   539
        return self._cmp(other) > 0
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   540
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   541
    def __eq__(self, other):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   542
        return self._cmp(other) == 0
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   543
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   544
    def __le__(self, other):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   545
        return self._cmp(other) <= 0
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   546
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   547
    def __ge__(self, other):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   548
        return self._cmp(other) >= 0
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   549
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   550
    def __ne__(self, other):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   551
        return self._cmp(other) != 0
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   552
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   553
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   554
def sortclonebundleentries(ui, entries):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   555
    prefers = ui.configlist(b'ui', b'clonebundleprefers')
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   556
    if not prefers:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   557
        return list(entries)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   558
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   559
    def _split(p):
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   560
        if b'=' not in p:
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   561
            hint = _(b"each comma separated item should be key=value pairs")
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   562
            raise error.Abort(
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   563
                _(b"invalid ui.clonebundleprefers item: %s") % p, hint=hint
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   564
            )
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   565
        return p.split(b'=', 1)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   566
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   567
    prefers = [_split(p) for p in prefers]
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   568
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   569
    items = sorted(clonebundleentry(v, prefers) for v in entries)
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   570
    return [i.value for i in items]