mercurial/exchange.py
author Augie Fackler <augie@google.com>
Tue, 13 Feb 2018 10:38:02 -0500
changeset 36153 72d155a792b1
parent 35813 768326377e4d
child 36422 04c319a07c7b
permissions -rw-r--r--
debugcommands: mergestate version is an int, use %d on it Differential Revision: https://phab.mercurial-scm.org/D2227
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
     1
# exchange.py - utility to exchange data between repos.
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     2
#
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     3
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     4
#
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     7
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
     8
from __future__ import absolute_import
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
     9
34322
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
    10
import collections
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    11
import errno
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29064
diff changeset
    12
import hashlib
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    13
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    14
from .i18n import _
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    15
from .node import (
35259
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
    16
    bin,
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    17
    hex,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    18
    nullid,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    19
)
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    20
from . import (
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    21
    bookmarks as bookmod,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    22
    bundle2,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    23
    changegroup,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    24
    discovery,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    25
    error,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    26
    lock as lockmod,
35347
a29fe459fc49 remotenames: rename related file and storage dir to logexchange
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35305
diff changeset
    27
    logexchange,
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    28
    obsolete,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    29
    phases,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    30
    pushkey,
32896
e14484e7f562 py3: use pycompat.strkwargs() to convert kwargs keys to str before passing
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32891
diff changeset
    31
    pycompat,
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    32
    scmutil,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    33
    sslutil,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    34
    streamclone,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    35
    url as urlmod,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    36
    util,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
    37
)
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    38
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
    39
urlerr = util.urlerr
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
    40
urlreq = util.urlreq
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
    41
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    42
# Maps bundle version human names to changegroup versions.
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    43
_bundlespeccgversions = {'v1': '01',
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    44
                         'v2': '02',
26756
9e272a96f764 exchange: support for streaming clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26732
diff changeset
    45
                         'packed1': 's1',
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    46
                         'bundle2': '02', #legacy
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    47
                        }
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    48
31473
ffed3bf5cd4c exchange: reject new compression engines for v1 bundles (issue5506)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30913
diff changeset
    49
# Compression engines allowed in version 1. THIS SHOULD NEVER CHANGE.
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32287
diff changeset
    50
_bundlespecv1compengines = {'gzip', 'bzip2', 'none'}
31473
ffed3bf5cd4c exchange: reject new compression engines for v1 bundles (issue5506)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30913
diff changeset
    51
26646
77769354d4ad exchange: support preserving external names when parsing bundle specs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26645
diff changeset
    52
def parsebundlespec(repo, spec, strict=True, externalnames=False):
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    53
    """Parse a bundle string specification into parts.
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    54
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    55
    Bundle specifications denote a well-defined bundle/exchange format.
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    56
    The content of a given specification should not change over time in
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    57
    order to ensure that bundles produced by a newer version of Mercurial are
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    58
    readable from an older version.
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    59
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    60
    The string currently has the form:
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
    61
26759
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    62
       <compression>-<type>[;<parameter0>[;<parameter1>]]
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    63
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    64
    Where <compression> is one of the supported compression formats
26759
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    65
    and <type> is (currently) a version string. A ";" can follow the type and
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30187
diff changeset
    66
    all text afterwards is interpreted as URI encoded, ";" delimited key=value
26759
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    67
    pairs.
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
    68
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    69
    If ``strict`` is True (the default) <compression> is required. Otherwise,
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    70
    it is optional.
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
    71
26646
77769354d4ad exchange: support preserving external names when parsing bundle specs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26645
diff changeset
    72
    If ``externalnames`` is False (the default), the human-centric names will
77769354d4ad exchange: support preserving external names when parsing bundle specs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26645
diff changeset
    73
    be converted to their internal representation.
77769354d4ad exchange: support preserving external names when parsing bundle specs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26645
diff changeset
    74
26759
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    75
    Returns a 3-tuple of (compression, version, parameters). Compression will
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    76
    be ``None`` if not in strict mode and a compression isn't defined.
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
    77
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    78
    An ``InvalidBundleSpecification`` is raised when the specification is
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    79
    not syntactically well formed.
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    80
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    81
    An ``UnsupportedBundleSpecification`` is raised when the compression or
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    82
    bundle type/version is not recognized.
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
    83
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    84
    Note: this function will likely eventually return a more complex data
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
    85
    structure, including bundle2 part information.
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
    86
    """
26759
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    87
    def parseparams(s):
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    88
        if ';' not in s:
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    89
            return s, {}
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    90
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    91
        params = {}
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    92
        version, paramstr = s.split(';', 1)
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    93
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    94
        for p in paramstr.split(';'):
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    95
            if '=' not in p:
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    96
                raise error.InvalidBundleSpecification(
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    97
                    _('invalid bundle specification: '
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    98
                      'missing "=" in parameter: %s') % p)
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
    99
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
   100
            key, value = p.split('=', 1)
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
   101
            key = urlreq.unquote(key)
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
   102
            value = urlreq.unquote(value)
26759
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
   103
            params[key] = value
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
   104
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
   105
        return version, params
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
   106
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
   107
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   108
    if strict and '-' not in spec:
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   109
        raise error.InvalidBundleSpecification(
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   110
                _('invalid bundle specification; '
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   111
                  'must be prefixed with compression: %s') % spec)
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
   112
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
   113
    if '-' in spec:
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   114
        compression, version = spec.split('-', 1)
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
   115
30440
c3944ab1443a exchange: obtain compression engines from the registrar
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30332
diff changeset
   116
        if compression not in util.compengines.supportedbundlenames:
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   117
            raise error.UnsupportedBundleSpecification(
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   118
                    _('%s compression is not supported') % compression)
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   119
26759
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
   120
        version, params = parseparams(version)
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
   121
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   122
        if version not in _bundlespeccgversions:
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   123
            raise error.UnsupportedBundleSpecification(
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   124
                    _('%s is not a recognized bundle version') % version)
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
   125
    else:
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   126
        # Value could be just the compression or just the version, in which
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   127
        # case some defaults are assumed (but only when not in strict mode).
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   128
        assert not strict
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
   129
26759
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
   130
        spec, params = parseparams(spec)
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
   131
30440
c3944ab1443a exchange: obtain compression engines from the registrar
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30332
diff changeset
   132
        if spec in util.compengines.supportedbundlenames:
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   133
            compression = spec
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   134
            version = 'v1'
31474
10c0ee338535 exchange: use v2 bundles for modern compression engines (issue5506)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
   135
            # Generaldelta repos require v2.
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   136
            if 'generaldelta' in repo.requirements:
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   137
                version = 'v2'
31474
10c0ee338535 exchange: use v2 bundles for modern compression engines (issue5506)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
   138
            # Modern compression engines require v2.
10c0ee338535 exchange: use v2 bundles for modern compression engines (issue5506)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
   139
            if compression not in _bundlespecv1compengines:
10c0ee338535 exchange: use v2 bundles for modern compression engines (issue5506)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
   140
                version = 'v2'
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   141
        elif spec in _bundlespeccgversions:
26756
9e272a96f764 exchange: support for streaming clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26732
diff changeset
   142
            if spec == 'packed1':
9e272a96f764 exchange: support for streaming clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26732
diff changeset
   143
                compression = 'none'
9e272a96f764 exchange: support for streaming clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26732
diff changeset
   144
            else:
9e272a96f764 exchange: support for streaming clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26732
diff changeset
   145
                compression = 'bzip2'
26640
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   146
            version = spec
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   147
        else:
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   148
            raise error.UnsupportedBundleSpecification(
b13fdcc4e700 exchange: refactor bundle specification parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26639
diff changeset
   149
                    _('%s is not a recognized bundle specification') % spec)
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
   150
31473
ffed3bf5cd4c exchange: reject new compression engines for v1 bundles (issue5506)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30913
diff changeset
   151
    # Bundle version 1 only supports a known set of compression engines.
ffed3bf5cd4c exchange: reject new compression engines for v1 bundles (issue5506)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30913
diff changeset
   152
    if version == 'v1' and compression not in _bundlespecv1compengines:
ffed3bf5cd4c exchange: reject new compression engines for v1 bundles (issue5506)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30913
diff changeset
   153
        raise error.UnsupportedBundleSpecification(
ffed3bf5cd4c exchange: reject new compression engines for v1 bundles (issue5506)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30913
diff changeset
   154
            _('compression engine %s is not supported on v1 bundles') %
ffed3bf5cd4c exchange: reject new compression engines for v1 bundles (issue5506)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30913
diff changeset
   155
            compression)
ffed3bf5cd4c exchange: reject new compression engines for v1 bundles (issue5506)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30913
diff changeset
   156
26760
a18ee7da38c2 exchange: parse requirements from stream clone specification string
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26759
diff changeset
   157
    # The specification for packed1 can optionally declare the data formats
a18ee7da38c2 exchange: parse requirements from stream clone specification string
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26759
diff changeset
   158
    # required to apply it. If we see this metadata, compare against what the
a18ee7da38c2 exchange: parse requirements from stream clone specification string
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26759
diff changeset
   159
    # repo supports and error if the bundle isn't compatible.
a18ee7da38c2 exchange: parse requirements from stream clone specification string
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26759
diff changeset
   160
    if version == 'packed1' and 'requirements' in params:
a18ee7da38c2 exchange: parse requirements from stream clone specification string
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26759
diff changeset
   161
        requirements = set(params['requirements'].split(','))
a18ee7da38c2 exchange: parse requirements from stream clone specification string
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26759
diff changeset
   162
        missingreqs = requirements - repo.supportedformats
a18ee7da38c2 exchange: parse requirements from stream clone specification string
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26759
diff changeset
   163
        if missingreqs:
a18ee7da38c2 exchange: parse requirements from stream clone specification string
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26759
diff changeset
   164
            raise error.UnsupportedBundleSpecification(
a18ee7da38c2 exchange: parse requirements from stream clone specification string
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26759
diff changeset
   165
                    _('missing support for repository features: %s') %
a18ee7da38c2 exchange: parse requirements from stream clone specification string
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26759
diff changeset
   166
                      ', '.join(sorted(missingreqs)))
a18ee7da38c2 exchange: parse requirements from stream clone specification string
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26759
diff changeset
   167
26646
77769354d4ad exchange: support preserving external names when parsing bundle specs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26645
diff changeset
   168
    if not externalnames:
30440
c3944ab1443a exchange: obtain compression engines from the registrar
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30332
diff changeset
   169
        engine = util.compengines.forbundlename(compression)
c3944ab1443a exchange: obtain compression engines from the registrar
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30332
diff changeset
   170
        compression = engine.bundletype()[1]
26646
77769354d4ad exchange: support preserving external names when parsing bundle specs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26645
diff changeset
   171
        version = _bundlespeccgversions[version]
26759
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
   172
    return compression, version, params
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
   173
21064
4d9d490d7bbe bundle2: add a ui argument to readbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21063
diff changeset
   174
def readbundle(ui, fh, fname, vfs=None):
21065
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
   175
    header = changegroup.readexactly(fh, 4)
21063
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
   176
21065
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
   177
    alg = None
21063
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
   178
    if not fname:
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
   179
        fname = "stream"
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
   180
        if not header.startswith('HG') and header.startswith('\0'):
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
   181
            fh = changegroup.headerlessfixup(fh, header)
21065
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
   182
            header = "HG10"
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
   183
            alg = 'UN'
21063
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
   184
    elif vfs:
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
   185
        fname = vfs.join(fname)
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
   186
21065
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
   187
    magic, version = header[0:2], header[2:4]
21063
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
   188
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
   189
    if magic != 'HG':
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26566
diff changeset
   190
        raise error.Abort(_('%s: not a Mercurial bundle') % fname)
21065
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
   191
    if version == '10':
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
   192
        if alg is None:
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
   193
            alg = changegroup.readexactly(fh, 2)
22390
e2806b8613ca changegroup: rename bundle-related functions and classes
Sune Foldager <cryo@cyanite.org>
parents: 22354
diff changeset
   194
        return changegroup.cg1unpacker(fh, alg)
24649
2d15c59a001b bundle2: detect bundle2 stream/request on /HG2./ instead of /HG2Y/
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24641
diff changeset
   195
    elif version.startswith('2'):
25640
39f0064a3079 bundle2.getunbundler: rename "header" to "magicstring"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25559
diff changeset
   196
        return bundle2.getunbundler(ui, fh, magicstring=magic + version)
26756
9e272a96f764 exchange: support for streaming clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26732
diff changeset
   197
    elif version == 'S1':
9e272a96f764 exchange: support for streaming clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26732
diff changeset
   198
        return streamclone.streamcloneapplier(fh)
21065
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
   199
    else:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26566
diff changeset
   200
        raise error.Abort(_('%s: unknown bundle version %s') % (fname, version))
21063
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
   201
35812
84965e5f3241 streamclone: extract requirements formatting
Boris Feld <boris.feld@octobus.net>
parents: 35791
diff changeset
   202
def _formatrequirementsspec(requirements):
84965e5f3241 streamclone: extract requirements formatting
Boris Feld <boris.feld@octobus.net>
parents: 35791
diff changeset
   203
    return urlreq.quote(','.join(sorted(requirements)))
84965e5f3241 streamclone: extract requirements formatting
Boris Feld <boris.feld@octobus.net>
parents: 35791
diff changeset
   204
84965e5f3241 streamclone: extract requirements formatting
Boris Feld <boris.feld@octobus.net>
parents: 35791
diff changeset
   205
def _formatrequirementsparams(requirements):
84965e5f3241 streamclone: extract requirements formatting
Boris Feld <boris.feld@octobus.net>
parents: 35791
diff changeset
   206
    requirements = _formatrequirementsspec(requirements)
84965e5f3241 streamclone: extract requirements formatting
Boris Feld <boris.feld@octobus.net>
parents: 35791
diff changeset
   207
    params = "%s%s" % (urlreq.quote("requirements="), requirements)
84965e5f3241 streamclone: extract requirements formatting
Boris Feld <boris.feld@octobus.net>
parents: 35791
diff changeset
   208
    return params
84965e5f3241 streamclone: extract requirements formatting
Boris Feld <boris.feld@octobus.net>
parents: 35791
diff changeset
   209
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   210
def getbundlespec(ui, fh):
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   211
    """Infer the bundlespec from a bundle file handle.
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   212
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   213
    The input file handle is seeked and the original seek position is not
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   214
    restored.
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   215
    """
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   216
    def speccompression(alg):
30440
c3944ab1443a exchange: obtain compression engines from the registrar
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30332
diff changeset
   217
        try:
c3944ab1443a exchange: obtain compression engines from the registrar
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30332
diff changeset
   218
            return util.compengines.forbundletype(alg).bundletype()[0]
c3944ab1443a exchange: obtain compression engines from the registrar
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30332
diff changeset
   219
        except KeyError:
c3944ab1443a exchange: obtain compression engines from the registrar
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30332
diff changeset
   220
            return None
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   221
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   222
    b = readbundle(ui, fh, None)
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   223
    if isinstance(b, changegroup.cg1unpacker):
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   224
        alg = b._type
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   225
        if alg == '_truncatedBZ':
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   226
            alg = 'BZ'
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   227
        comp = speccompression(alg)
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   228
        if not comp:
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   229
            raise error.Abort(_('unknown compression algorithm: %s') % alg)
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   230
        return '%s-v1' % comp
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   231
    elif isinstance(b, bundle2.unbundle20):
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   232
        if 'Compression' in b.params:
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   233
            comp = speccompression(b.params['Compression'])
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   234
            if not comp:
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   235
                raise error.Abort(_('unknown compression algorithm: %s') % comp)
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   236
        else:
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   237
            comp = 'none'
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   238
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   239
        version = None
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   240
        for part in b.iterparts():
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   241
            if part.type == 'changegroup':
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   242
                version = part.params['version']
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   243
                if version in ('01', '02'):
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   244
                    version = 'v2'
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   245
                else:
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   246
                    raise error.Abort(_('changegroup version %s does not have '
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   247
                                        'a known bundlespec') % version,
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   248
                                      hint=_('try upgrading your Mercurial '
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   249
                                              'client'))
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   250
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   251
        if not version:
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   252
            raise error.Abort(_('could not identify changegroup version in '
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   253
                                'bundle'))
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   254
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   255
        return '%s-%s' % (comp, version)
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   256
    elif isinstance(b, streamclone.streamcloneapplier):
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   257
        requirements = streamclone.readbundle1header(fh)[2]
35812
84965e5f3241 streamclone: extract requirements formatting
Boris Feld <boris.feld@octobus.net>
parents: 35791
diff changeset
   258
        return 'none-packed1;%s' % _formatrequirementsparams(requirements)
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   259
    else:
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   260
        raise error.Abort(_('unknown bundle type: %s') % b)
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
   261
29808
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   262
def _computeoutgoing(repo, heads, common):
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   263
    """Computes which revs are outgoing given a set of common
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   264
    and a set of heads.
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   265
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   266
    This is a separate function so extensions can have access to
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   267
    the logic.
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   268
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   269
    Returns a discovery.outgoing object.
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   270
    """
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   271
    cl = repo.changelog
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   272
    if common:
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   273
        hasnode = cl.hasnode
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   274
        common = [n for n in common if hasnode(n)]
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   275
    else:
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   276
        common = [nullid]
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   277
    if not heads:
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   278
        heads = cl.heads()
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   279
    return discovery.outgoing(repo, common, heads)
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
   280
29682
2db085d5f5a2 bundle2: rename the _canusebundle2 method to _forcebundle1
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29389
diff changeset
   281
def _forcebundle1(op):
2db085d5f5a2 bundle2: rename the _canusebundle2 method to _forcebundle1
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29389
diff changeset
   282
    """return true if a pull/push must use bundle1
24650
b83a8f512a80 exchange: introduce a '_canusebundle2' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24649
diff changeset
   283
29683
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
   284
    This function is used to allow testing of the older bundle version"""
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
   285
    ui = op.repo.ui
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
   286
    forcebundle1 = False
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30187
diff changeset
   287
    # The goal is this config is to allow developer to choose the bundle
29683
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
   288
    # version used during exchanged. This is especially handy during test.
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
   289
    # Value is a list of bundle version to be picked from, highest version
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
   290
    # should be used.
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
   291
    #
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
   292
    # developer config: devel.legacy.exchange
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
   293
    exchange = ui.configlist('devel', 'legacy.exchange')
29689
39537bc64442 bundle2: remove 'experimental.bundle2-exp' boolean config (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29683
diff changeset
   294
    forcebundle1 = 'bundle2' not in exchange and 'bundle1' in exchange
29683
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
   295
    return forcebundle1 or not op.remote.capable('bundle2')
24650
b83a8f512a80 exchange: introduce a '_canusebundle2' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24649
diff changeset
   296
20346
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
   297
class pushoperation(object):
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
   298
    """A object that represent a single push operation
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
   299
28456
d9d51da7a850 pushoperation: fix language issues in docstring
Nathan Goldbaum <ngoldbau@illinois.edu>
parents: 28182
diff changeset
   300
    Its purpose is to carry push related state and very common operations.
20346
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
   301
28456
d9d51da7a850 pushoperation: fix language issues in docstring
Nathan Goldbaum <ngoldbau@illinois.edu>
parents: 28182
diff changeset
   302
    A new pushoperation should be created at the beginning of each push and
d9d51da7a850 pushoperation: fix language issues in docstring
Nathan Goldbaum <ngoldbau@illinois.edu>
parents: 28182
diff changeset
   303
    discarded afterward.
20346
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
   304
    """
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
   305
22623
cd7e17aa6040 push: pass list of bookmark to `exchange.push`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22622
diff changeset
   306
    def __init__(self, repo, remote, force=False, revs=None, newbranch=False,
33885
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
   307
                 bookmarks=(), pushvars=None):
20346
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
   308
        # repo we push from
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
   309
        self.repo = repo
20347
3ec5f833348e push: ease access to current ui object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20346
diff changeset
   310
        self.ui = repo.ui
20348
d64c904db55a push: move `remote` argument in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20347
diff changeset
   311
        # repo we push to
d64c904db55a push: move `remote` argument in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20347
diff changeset
   312
        self.remote = remote
20349
89f90457979e push: move `force` argument into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20348
diff changeset
   313
        # force option provided
89f90457979e push: move `force` argument into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20348
diff changeset
   314
        self.force = force
20350
8c85d968ee65 push: move `revs` argument into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20349
diff changeset
   315
        # revs to be pushed (None is "all")
8c85d968ee65 push: move `revs` argument into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20349
diff changeset
   316
        self.revs = revs
22623
cd7e17aa6040 push: pass list of bookmark to `exchange.push`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22622
diff changeset
   317
        # bookmark explicitly pushed
cd7e17aa6040 push: pass list of bookmark to `exchange.push`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22622
diff changeset
   318
        self.bookmarks = bookmarks
20351
c05ad450df23 push: move `newbranch` argument into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20350
diff changeset
   319
        # allow push of new branch
c05ad450df23 push: move `newbranch` argument into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20350
diff changeset
   320
        self.newbranch = newbranch
21901
8612c4ab7f54 push: add a ``pushop.stepsdone`` attribute
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21899
diff changeset
   321
        # step already performed
8612c4ab7f54 push: add a ``pushop.stepsdone`` attribute
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21899
diff changeset
   322
        # (used to check what steps have been already performed through bundle2)
8612c4ab7f54 push: add a ``pushop.stepsdone`` attribute
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21899
diff changeset
   323
        self.stepsdone = set()
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
   324
        # Integer version of the changegroup push result
20439
0d3ccf285ff2 push: move push return value in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20438
diff changeset
   325
        # - None means nothing to push
0d3ccf285ff2 push: move push return value in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20438
diff changeset
   326
        # - 0 means HTTP error
0d3ccf285ff2 push: move push return value in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20438
diff changeset
   327
        # - 1 means we pushed and remote head count is unchanged *or*
0d3ccf285ff2 push: move push return value in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20438
diff changeset
   328
        #   we have outgoing changesets but refused to push
0d3ccf285ff2 push: move push return value in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20438
diff changeset
   329
        # - other values as described by addchangegroup()
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
   330
        self.cgresult = None
22624
eef31f9a4c0f push: add `pushoperation.bkresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22623
diff changeset
   331
        # Boolean value for the bookmark push
eef31f9a4c0f push: add `pushoperation.bkresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22623
diff changeset
   332
        self.bkresult = None
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
   333
        # discover.outgoing object (contains common and outgoing data)
20440
400da8bc7786 push: move outgoing object in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20439
diff changeset
   334
        self.outgoing = None
32709
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   335
        # all remote topological heads before the push
20462
0031ef5df586 push: move `remoteheads` into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20441
diff changeset
   336
        self.remoteheads = None
32709
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   337
        # Details of the remote branch pre and post push
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   338
        #
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   339
        # mapping: {'branch': ([remoteheads],
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   340
        #                      [newheads],
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   341
        #                      [unsyncedheads],
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   342
        #                      [discardedheads])}
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   343
        # - branch: the branch name
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   344
        # - remoteheads: the list of remote heads known locally
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   345
        #                None if the branch is new
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   346
        # - newheads: the new remote heads (known locally) with outgoing pushed
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   347
        # - unsyncedheads: the list of remote heads unknown locally.
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   348
        # - discardedheads: the list of remote heads made obsolete by the push
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   349
        self.pushbranchmap = None
20464
d032417db243 push: move `incoming` into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20463
diff changeset
   350
        # testable as a boolean indicating if any nodes are missing locally.
d032417db243 push: move `incoming` into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20463
diff changeset
   351
        self.incoming = None
34819
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
   352
        # summary of the remote phase situation
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
   353
        self.remotephases = None
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   354
        # phases changes that must be pushed along side the changesets
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   355
        self.outdatedphases = None
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   356
        # phases changes that must be pushed if changeset push fails
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   357
        self.fallbackoutdatedphases = None
22034
5f57bc77657c push: move the list of obsmarker to push into the push operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22033
diff changeset
   358
        # outgoing obsmarkers
22035
24bb01f42e82 push: introduce a discovery step for obsmarker
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22034
diff changeset
   359
        self.outobsmarkers = set()
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   360
        # outgoing bookmarks
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   361
        self.outbookmarks = []
23437
94e2862dbcfb push: elevate phase transaction to cover entire operation
Eric Sumner <ericsumner@fb.com>
parents: 23436
diff changeset
   362
        # transaction manager
94e2862dbcfb push: elevate phase transaction to cover entire operation
Eric Sumner <ericsumner@fb.com>
parents: 23436
diff changeset
   363
        self.trmanager = None
25485
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
   364
        # map { pushkey partid -> callback handling failure}
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
   365
        # used to handle exception from mandatory pushkey part failure
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
   366
        self.pkfailcb = {}
33885
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
   367
        # an iterable of pushvars or None
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
   368
        self.pushvars = pushvars
20346
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
   369
22014
71083b020b4a push: extract future heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21989
diff changeset
   370
    @util.propertycache
71083b020b4a push: extract future heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21989
diff changeset
   371
    def futureheads(self):
71083b020b4a push: extract future heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21989
diff changeset
   372
        """future remote heads if the changeset push succeeds"""
71083b020b4a push: extract future heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21989
diff changeset
   373
        return self.outgoing.missingheads
71083b020b4a push: extract future heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21989
diff changeset
   374
22015
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   375
    @util.propertycache
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   376
    def fallbackheads(self):
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   377
        """future remote heads if the changeset push fails"""
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   378
        if self.revs is None:
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   379
            # not target to push, all common are relevant
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   380
            return self.outgoing.commonheads
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   381
        unfi = self.repo.unfiltered()
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   382
        # I want cheads = heads(::missingheads and ::commonheads)
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   383
        # (missingheads is revs with secret changeset filtered out)
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   384
        #
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   385
        # This can be expressed as:
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   386
        #     cheads = ( (missingheads and ::commonheads)
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   387
        #              + (commonheads and ::missingheads))"
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   388
        #              )
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   389
        #
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   390
        # while trying to push we already computed the following:
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   391
        #     common = (::commonheads)
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   392
        #     missing = ((commonheads::missingheads) - commonheads)
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   393
        #
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   394
        # We can pick:
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   395
        # * missingheads part of common (::commonheads)
26184
327d09f0b5d4 exchange: allow fallbackheads to use lazy set behavior
Durham Goode <durham@fb.com>
parents: 25896
diff changeset
   396
        common = self.outgoing.common
22015
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   397
        nm = self.repo.changelog.nodemap
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   398
        cheads = [node for node in self.revs if nm[node] in common]
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   399
        # and
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   400
        # * commonheads parents on missing
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   401
        revset = unfi.set('%ln and parents(roots(%ln))',
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   402
                         self.outgoing.commonheads,
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   403
                         self.outgoing.missing)
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   404
        cheads.extend(c.node() for c in revset)
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   405
        return cheads
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   406
22016
7d976d71684c push: move common heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22015
diff changeset
   407
    @property
7d976d71684c push: move common heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22015
diff changeset
   408
    def commonheads(self):
7d976d71684c push: move common heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22015
diff changeset
   409
        """set of all common heads after changeset bundle push"""
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
   410
        if self.cgresult:
22016
7d976d71684c push: move common heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22015
diff changeset
   411
            return self.futureheads
7d976d71684c push: move common heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22015
diff changeset
   412
        else:
7d976d71684c push: move common heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22015
diff changeset
   413
            return self.fallbackheads
22015
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
   414
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   415
# mapping of message used when pushing bookmark
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   416
bookmsgmap = {'update': (_("updating bookmark %s\n"),
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   417
                         _('updating bookmark %s failed!\n')),
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   418
              'export': (_("exporting bookmark %s\n"),
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   419
                         _('exporting bookmark %s failed!\n')),
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   420
              'delete': (_("deleting remote bookmark %s\n"),
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   421
                         _('deleting remote bookmark %s failed!\n')),
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   422
              }
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   423
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   424
26729
16e69e6b357b exchange: add oparg to push so that extensions can wrap pushop
Sean Farley <sean@farley.io>
parents: 26700
diff changeset
   425
def push(repo, remote, force=False, revs=None, newbranch=False, bookmarks=(),
16e69e6b357b exchange: add oparg to push so that extensions can wrap pushop
Sean Farley <sean@farley.io>
parents: 26700
diff changeset
   426
         opargs=None):
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   427
    '''Push outgoing changesets (limited by revs) from a local
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   428
    repository to remote. Return an integer:
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   429
      - None means nothing to push
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   430
      - 0 means HTTP error
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   431
      - 1 means we pushed and remote head count is unchanged *or*
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   432
        we have outgoing changesets but refused to push
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   433
      - other values as described by addchangegroup()
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   434
    '''
26729
16e69e6b357b exchange: add oparg to push so that extensions can wrap pushop
Sean Farley <sean@farley.io>
parents: 26700
diff changeset
   435
    if opargs is None:
16e69e6b357b exchange: add oparg to push so that extensions can wrap pushop
Sean Farley <sean@farley.io>
parents: 26700
diff changeset
   436
        opargs = {}
16e69e6b357b exchange: add oparg to push so that extensions can wrap pushop
Sean Farley <sean@farley.io>
parents: 26700
diff changeset
   437
    pushop = pushoperation(repo, remote, force, revs, newbranch, bookmarks,
34220
e3cd724231ff exchange: hit opargs with pycompat.strkwargs before **-ing it
Augie Fackler <raf@durin42.com>
parents: 34203
diff changeset
   438
                           **pycompat.strkwargs(opargs))
20348
d64c904db55a push: move `remote` argument in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20347
diff changeset
   439
    if pushop.remote.local():
d64c904db55a push: move `remote` argument in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20347
diff changeset
   440
        missing = (set(pushop.repo.requirements)
d64c904db55a push: move `remote` argument in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20347
diff changeset
   441
                   - pushop.remote.local().supported)
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   442
        if missing:
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   443
            msg = _("required features are not"
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   444
                    " supported in the destination:"
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   445
                    " %s") % (', '.join(sorted(missing)))
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26566
diff changeset
   446
            raise error.Abort(msg)
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   447
20348
d64c904db55a push: move `remote` argument in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20347
diff changeset
   448
    if not pushop.remote.canpush():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26566
diff changeset
   449
        raise error.Abort(_("destination does not support push"))
33701
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   450
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   451
    if not pushop.remote.capable('unbundle'):
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   452
        raise error.Abort(_('cannot push: destination does not support the '
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   453
                            'unbundle wire protocol command'))
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   454
33791
20d663a104fb exchange: drop now-unnecessary "local" from lock name variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 33790
diff changeset
   455
    # get lock as we might write phase data
20d663a104fb exchange: drop now-unnecessary "local" from lock name variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 33790
diff changeset
   456
    wlock = lock = None
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   457
    try:
24754
5dc5cd7abbf5 push: acquire local 'wlock' if "pushback" is expected (BC) (issue4596)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24752
diff changeset
   458
        # bundle2 push may receive a reply bundle touching bookmarks or other
5dc5cd7abbf5 push: acquire local 'wlock' if "pushback" is expected (BC) (issue4596)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24752
diff changeset
   459
        # things requiring the wlock. Take it now to ensure proper ordering.
5dc5cd7abbf5 push: acquire local 'wlock' if "pushback" is expected (BC) (issue4596)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24752
diff changeset
   460
        maypushback = pushop.ui.configbool('experimental', 'bundle2.pushback')
29682
2db085d5f5a2 bundle2: rename the _canusebundle2 method to _forcebundle1
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29389
diff changeset
   461
        if (not _forcebundle1(pushop)) and maypushback:
33791
20d663a104fb exchange: drop now-unnecessary "local" from lock name variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 33790
diff changeset
   462
            wlock = pushop.repo.wlock()
20d663a104fb exchange: drop now-unnecessary "local" from lock name variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 33790
diff changeset
   463
        lock = pushop.repo.lock()
33792
5904511fc9f8 exchange: remove need for "locked" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 33791
diff changeset
   464
        pushop.trmanager = transactionmanager(pushop.repo,
5904511fc9f8 exchange: remove need for "locked" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 33791
diff changeset
   465
                                              'push-response',
5904511fc9f8 exchange: remove need for "locked" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 33791
diff changeset
   466
                                              pushop.remote.url())
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25640
diff changeset
   467
    except IOError as err:
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   468
        if err.errno != errno.EACCES:
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   469
            raise
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   470
        # source repo cannot be locked.
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   471
        # We do not abort the push, but just disable the local phase
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   472
        # synchronisation.
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   473
        msg = 'cannot lock source repository: %s\n' % err
20347
3ec5f833348e push: ease access to current ui object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20346
diff changeset
   474
        pushop.ui.debug(msg)
33792
5904511fc9f8 exchange: remove need for "locked" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 33791
diff changeset
   475
33794
389f7b17ffb3 exchange: simplify unbundle locking using context managers
Martin von Zweigbergk <martinvonz@google.com>
parents: 33793
diff changeset
   476
    with wlock or util.nullcontextmanager(), \
389f7b17ffb3 exchange: simplify unbundle locking using context managers
Martin von Zweigbergk <martinvonz@google.com>
parents: 33793
diff changeset
   477
            lock or util.nullcontextmanager(), \
389f7b17ffb3 exchange: simplify unbundle locking using context managers
Martin von Zweigbergk <martinvonz@google.com>
parents: 33793
diff changeset
   478
            pushop.trmanager or util.nullcontextmanager():
20924
e10000369b47 push: pass a `pushoperation` object to localrepo.checkpush
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20901
diff changeset
   479
        pushop.repo.checkpush(pushop)
33701
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   480
        _pushdiscovery(pushop)
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   481
        if not _forcebundle1(pushop):
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   482
            _pushbundle2(pushop)
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   483
        _pushchangeset(pushop)
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   484
        _pushsyncphase(pushop)
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   485
        _pushobsolete(pushop)
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   486
        _pushbookmark(pushop)
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
   487
22616
cda85cfc8252 push: `exchange.push` now returns the `pushoperation` object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22615
diff changeset
   488
    return pushop
20352
58300f61b139 push: move bookmarks exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20351
diff changeset
   489
22018
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   490
# list of steps to perform discovery before push
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   491
pushdiscoveryorder = []
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   492
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   493
# Mapping between step name and function
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   494
#
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   495
# This exists to help extensions wrap steps if necessary
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   496
pushdiscoverymapping = {}
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   497
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   498
def pushdiscovery(stepname):
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   499
    """decorator for function performing discovery before push
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   500
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   501
    The function is added to the step -> function mapping and appended to the
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   502
    list of steps.  Beware that decorated function will be added in order (this
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   503
    may matter).
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   504
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   505
    You can only use this decorator for a new step, if you want to wrap a step
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   506
    from an extension, change the pushdiscovery dictionary directly."""
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   507
    def dec(func):
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   508
        assert stepname not in pushdiscoverymapping
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   509
        pushdiscoverymapping[stepname] = func
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   510
        pushdiscoveryorder.append(stepname)
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   511
        return func
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   512
    return dec
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   513
20466
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
   514
def _pushdiscovery(pushop):
22018
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   515
    """Run all discovery steps"""
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   516
    for stepname in pushdiscoveryorder:
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   517
        step = pushdiscoverymapping[stepname]
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   518
        step(pushop)
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   519
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   520
@pushdiscovery('changeset')
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   521
def _pushdiscoverychangeset(pushop):
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
   522
    """discover the changeset that need to be pushed"""
20466
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
   523
    fci = discovery.findcommonincoming
35305
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35268
diff changeset
   524
    if pushop.revs:
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35268
diff changeset
   525
        commoninc = fci(pushop.repo, pushop.remote, force=pushop.force,
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35268
diff changeset
   526
                        ancestorsof=pushop.revs)
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35268
diff changeset
   527
    else:
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35268
diff changeset
   528
        commoninc = fci(pushop.repo, pushop.remote, force=pushop.force)
20466
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
   529
    common, inc, remoteheads = commoninc
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
   530
    fco = discovery.findcommonoutgoing
23848
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
   531
    outgoing = fco(pushop.repo, pushop.remote, onlyheads=pushop.revs,
20466
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
   532
                   commoninc=commoninc, force=pushop.force)
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
   533
    pushop.outgoing = outgoing
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
   534
    pushop.remoteheads = remoteheads
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
   535
    pushop.incoming = inc
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
   536
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   537
@pushdiscovery('phase')
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   538
def _pushdiscoveryphase(pushop):
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   539
    """discover the phase that needs to be pushed
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   540
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   541
    (computed for both success and failure case for changesets push)"""
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   542
    outgoing = pushop.outgoing
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   543
    unfi = pushop.repo.unfiltered()
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   544
    remotephases = pushop.remote.listkeys('phases')
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33138
diff changeset
   545
    if (pushop.ui.configbool('ui', '_usedassubrepo')
25337
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
   546
        and remotephases    # server supports phases
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
   547
        and not pushop.outgoing.missing # no changesets to be pushed
34818
6709b5661d1b phase: simplify the check for issue3781 shortcut in discovery
Boris Feld <boris.feld@octobus.net>
parents: 34817
diff changeset
   548
        and remotephases.get('publishing', False)):
25337
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
   549
        # When:
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
   550
        # - this is a subrepo push
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
   551
        # - and remote support phase
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
   552
        # - and no changeset are to be pushed
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
   553
        # - and remote is publishing
34817
a80142b03552 exchange: fix issue3781 reference in the comment
Boris Feld <boris.feld@octobus.net>
parents: 34374
diff changeset
   554
        # We may be in issue 3781 case!
25337
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
   555
        # We drop the possible phase synchronisation done by
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
   556
        # courtesy to publish changesets possibly locally draft
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
   557
        # on the remote.
34818
6709b5661d1b phase: simplify the check for issue3781 shortcut in discovery
Boris Feld <boris.feld@octobus.net>
parents: 34817
diff changeset
   558
        pushop.outdatedphases = []
6709b5661d1b phase: simplify the check for issue3781 shortcut in discovery
Boris Feld <boris.feld@octobus.net>
parents: 34817
diff changeset
   559
        pushop.fallbackoutdatedphases = []
6709b5661d1b phase: simplify the check for issue3781 shortcut in discovery
Boris Feld <boris.feld@octobus.net>
parents: 34817
diff changeset
   560
        return
34819
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
   561
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
   562
    pushop.remotephases = phases.remotephasessummary(pushop.repo,
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
   563
                                                     pushop.fallbackheads,
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
   564
                                                     remotephases)
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
   565
    droots = pushop.remotephases.draftroots
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
   566
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   567
    extracond = ''
34819
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
   568
    if not pushop.remotephases.publishing:
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   569
        extracond = ' and public()'
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   570
    revset = 'heads((%%ln::%%ln) %s)' % extracond
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   571
    # Get the list of all revs draft on remote by public here.
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   572
    # XXX Beware that revset break if droots is not strictly
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   573
    # XXX root we may want to ensure it is but it is costly
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   574
    fallback = list(unfi.set(revset, droots, pushop.fallbackheads))
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   575
    if not outgoing.missing:
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   576
        future = fallback
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   577
    else:
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   578
        # adds changeset we are going to push as draft
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   579
        #
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23082
diff changeset
   580
        # should not be necessary for publishing server, but because of an
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   581
        # issue fixed in xxxxx we have to do it anyway.
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   582
        fdroots = list(unfi.set('roots(%ln  + %ln::)',
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   583
                       outgoing.missing, droots))
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   584
        fdroots = [f.node() for f in fdroots]
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   585
        future = list(unfi.set(revset, fdroots, pushop.futureheads))
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   586
    pushop.outdatedphases = future
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   587
    pushop.fallbackoutdatedphases = fallback
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
   588
22035
24bb01f42e82 push: introduce a discovery step for obsmarker
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22034
diff changeset
   589
@pushdiscovery('obsmarker')
24bb01f42e82 push: introduce a discovery step for obsmarker
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22034
diff changeset
   590
def _pushdiscoveryobsmarkers(pushop):
22953
b1d694d3975e obsolete: add exchange option
Durham Goode <durham@fb.com>
parents: 22937
diff changeset
   591
    if (obsolete.isenabled(pushop.repo, obsolete.exchangeopt)
22269
03cc81a28228 push: check if local and remote support evolution during discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22244
diff changeset
   592
        and pushop.repo.obsstore
03cc81a28228 push: check if local and remote support evolution during discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22244
diff changeset
   593
        and 'obsolete' in pushop.remote.listkeys('namespaces')):
22350
6d113cc7a31a push: only push obsmarkers relevant to the "pushed subset"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22347
diff changeset
   594
        repo = pushop.repo
6d113cc7a31a push: only push obsmarkers relevant to the "pushed subset"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22347
diff changeset
   595
        # very naive computation, that can be quite expensive on big repo.
6d113cc7a31a push: only push obsmarkers relevant to the "pushed subset"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22347
diff changeset
   596
        # However: evolution is currently slow on them anyway.
6d113cc7a31a push: only push obsmarkers relevant to the "pushed subset"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22347
diff changeset
   597
        nodes = (c.node() for c in repo.set('::%ln', pushop.futureheads))
6d113cc7a31a push: only push obsmarkers relevant to the "pushed subset"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22347
diff changeset
   598
        pushop.outobsmarkers = pushop.repo.obsstore.relevantmarkers(nodes)
22035
24bb01f42e82 push: introduce a discovery step for obsmarker
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22034
diff changeset
   599
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   600
@pushdiscovery('bookmarks')
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   601
def _pushdiscoverybookmarks(pushop):
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   602
    ui = pushop.ui
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   603
    repo = pushop.repo.unfiltered()
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   604
    remote = pushop.remote
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   605
    ui.debug("checking for updated bookmarks\n")
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   606
    ancestors = ()
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   607
    if pushop.revs:
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   608
        revnums = map(repo.changelog.rev, pushop.revs)
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   609
        ancestors = repo.changelog.ancestors(revnums, inclusive=True)
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   610
    remotebookmark = remote.listkeys('bookmarks')
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   611
28182
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27953
diff changeset
   612
    explicit = set([repo._bookmarks.expandname(bookmark)
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27953
diff changeset
   613
                    for bookmark in pushop.bookmarks])
22651
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   614
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   615
    remotebookmark = bookmod.unhexlifybookmarks(remotebookmark)
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   616
    comp = bookmod.comparebookmarks(repo, repo._bookmarks, remotebookmark)
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   617
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   618
    def safehex(x):
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   619
        if x is None:
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   620
            return x
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   621
        return hex(x)
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   622
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   623
    def hexifycompbookmarks(bookmarks):
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   624
        for b, scid, dcid in bookmarks:
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   625
            yield b, safehex(scid), safehex(dcid)
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   626
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   627
    comp = [hexifycompbookmarks(marks) for marks in comp]
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23047
diff changeset
   628
    addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same = comp
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   629
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   630
    for b, scid, dcid in advsrc:
22651
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   631
        if b in explicit:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   632
            explicit.remove(b)
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   633
        if not ancestors or repo[scid].rev() in ancestors:
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   634
            pushop.outbookmarks.append((b, dcid, scid))
22651
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   635
    # search added bookmark
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   636
    for b, scid, dcid in addsrc:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   637
        if b in explicit:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   638
            explicit.remove(b)
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   639
            pushop.outbookmarks.append((b, '', scid))
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   640
    # search for overwritten bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   641
    for b, scid, dcid in list(advdst) + list(diverge) + list(differ):
22651
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   642
        if b in explicit:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   643
            explicit.remove(b)
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   644
            pushop.outbookmarks.append((b, dcid, scid))
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   645
    # search for bookmark to delete
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   646
    for b, scid, dcid in adddst:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   647
        if b in explicit:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   648
            explicit.remove(b)
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   649
            # treat as "deleted locally"
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   650
            pushop.outbookmarks.append((b, dcid, ''))
23082
0fc4686de1d7 exchange: don't report failure from identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23081
diff changeset
   651
    # identical bookmarks shouldn't get reported
0fc4686de1d7 exchange: don't report failure from identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23081
diff changeset
   652
    for b, scid, dcid in same:
0fc4686de1d7 exchange: don't report failure from identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23081
diff changeset
   653
        if b in explicit:
0fc4686de1d7 exchange: don't report failure from identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23081
diff changeset
   654
            explicit.remove(b)
22651
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   655
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   656
    if explicit:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   657
        explicit = sorted(explicit)
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   658
        # we should probably list all of them
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   659
        ui.warn(_('bookmark %s does not exist on the local '
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   660
                  'or remote repository!\n') % explicit[0])
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   661
        pushop.bkresult = 2
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   662
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
   663
    pushop.outbookmarks.sort()
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
   664
20465
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   665
def _pushcheckoutgoing(pushop):
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   666
    outgoing = pushop.outgoing
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   667
    unfi = pushop.repo.unfiltered()
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   668
    if not outgoing.missing:
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   669
        # nothing to push
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   670
        scmutil.nochangesfound(unfi.ui, unfi, outgoing.excluded)
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   671
        return False
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   672
    # something to push
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   673
    if not pushop.force:
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   674
        # if repo.obsstore == False --> no obsolete
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   675
        # then, save the iteration
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   676
        if unfi.obsstore:
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   677
            # this message are here for 80 char limit reason
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   678
            mso = _("push includes obsolete changeset: %s!")
33689
9c27a2891b75 evolution: rename bumped to phase-divergent
Boris Feld <boris.feld@octobus.net>
parents: 33688
diff changeset
   679
            mspd = _("push includes phase-divergent changeset: %s!")
33688
2194a8723138 evolution: rename divergent to content-divergent
Boris Feld <boris.feld@octobus.net>
parents: 33667
diff changeset
   680
            mscd = _("push includes content-divergent changeset: %s!")
33667
03039ff3082b evolution: rename unstable to orphan
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   681
            mst = {"orphan": _("push includes orphan changeset: %s!"),
33689
9c27a2891b75 evolution: rename bumped to phase-divergent
Boris Feld <boris.feld@octobus.net>
parents: 33688
diff changeset
   682
                   "phase-divergent": mspd,
33688
2194a8723138 evolution: rename divergent to content-divergent
Boris Feld <boris.feld@octobus.net>
parents: 33667
diff changeset
   683
                   "content-divergent": mscd}
20465
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   684
            # If we are to push if there is at least one
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   685
            # obsolete or unstable changeset in missing, at
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   686
            # least one of the missinghead will be obsolete or
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   687
            # unstable. So checking heads only is ok
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   688
            for node in outgoing.missingheads:
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   689
                ctx = unfi[node]
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   690
                if ctx.obsolete():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26566
diff changeset
   691
                    raise error.Abort(mso % ctx)
33730
52c5ff856b49 context: rename troubled into isunstable
Boris Feld <boris.feld@octobus.net>
parents: 33726
diff changeset
   692
                elif ctx.isunstable():
33726
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33702
diff changeset
   693
                    # TODO print more than one instability in the abort
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33702
diff changeset
   694
                    # message
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33702
diff changeset
   695
                    raise error.Abort(mst[ctx.instabilities()[0]] % ctx)
25836
dede675dc0c1 bookmarks: mark internal-only config option
Matt Mackall <mpm@selenic.com>
parents: 25668
diff changeset
   696
26935
c4a7bbc78c74 exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26855
diff changeset
   697
        discovery.checkheads(pushop)
20465
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   698
    return True
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
   699
22017
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   700
# List of names of steps to perform for an outgoing bundle2, order matters.
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   701
b2partsgenorder = []
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   702
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   703
# Mapping between step name and function
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   704
#
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   705
# This exists to help extensions wrap steps if necessary
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   706
b2partsgenmapping = {}
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   707
24731
88a36edefea5 bundle2: add an 'idx' argument to the 'b2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24697
diff changeset
   708
def b2partsgenerator(stepname, idx=None):
22017
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   709
    """decorator for function generating bundle2 part
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   710
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   711
    The function is added to the step -> function mapping and appended to the
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   712
    list of steps.  Beware that decorated functions will be added in order
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   713
    (this may matter).
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   714
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   715
    You can only use this decorator for new steps, if you want to wrap a step
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   716
    from an extension, attack the b2partsgenmapping dictionary directly."""
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   717
    def dec(func):
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   718
        assert stepname not in b2partsgenmapping
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   719
        b2partsgenmapping[stepname] = func
24731
88a36edefea5 bundle2: add an 'idx' argument to the 'b2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24697
diff changeset
   720
        if idx is None:
88a36edefea5 bundle2: add an 'idx' argument to the 'b2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24697
diff changeset
   721
            b2partsgenorder.append(stepname)
88a36edefea5 bundle2: add an 'idx' argument to the 'b2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24697
diff changeset
   722
        else:
88a36edefea5 bundle2: add an 'idx' argument to the 'b2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24697
diff changeset
   723
            b2partsgenorder.insert(idx, stepname)
22017
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   724
        return func
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   725
    return dec
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   726
26428
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
   727
def _pushb2ctxcheckheads(pushop, bundler):
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
   728
    """Generate race condition checking parts
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
   729
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26779
diff changeset
   730
    Exists as an independent function to aid extensions
26428
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
   731
    """
32709
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   732
    # * 'force' do not check for push race,
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   733
    # * if we don't push anything, there are nothing to check.
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   734
    if not pushop.force and pushop.outgoing.missingheads:
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   735
        allowunrelated = 'related' in bundler.capabilities.get('checkheads', ())
33138
78fc540c53e1 pushrace: avoid crash on bare push when using concurrent push mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33043
diff changeset
   736
        emptyremote = pushop.pushbranchmap is None
78fc540c53e1 pushrace: avoid crash on bare push when using concurrent push mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33043
diff changeset
   737
        if not allowunrelated or emptyremote:
32709
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   738
            bundler.newpart('check:heads', data=iter(pushop.remoteheads))
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   739
        else:
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   740
            affected = set()
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   741
            for branch, heads in pushop.pushbranchmap.iteritems():
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   742
                remoteheads, newheads, unsyncedheads, discardedheads = heads
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   743
                if remoteheads is not None:
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   744
                    remote = set(remoteheads)
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   745
                    affected |= set(discardedheads) & remote
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   746
                    affected |= remote - set(newheads)
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   747
            if affected:
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   748
                data = iter(sorted(affected))
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
   749
                bundler.newpart('check:updated-heads', data=data)
26428
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
   750
34821
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   751
def _pushing(pushop):
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   752
    """return True if we are pushing anything"""
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   753
    return bool(pushop.outgoing.missing
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   754
                or pushop.outdatedphases
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   755
                or pushop.outobsmarkers
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   756
                or pushop.outbookmarks)
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   757
35259
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   758
@b2partsgenerator('check-bookmarks')
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   759
def _pushb2checkbookmarks(pushop, bundler):
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   760
    """insert bookmark move checking"""
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   761
    if not _pushing(pushop) or pushop.force:
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   762
        return
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   763
    b2caps = bundle2.bundle2caps(pushop.remote)
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   764
    hasbookmarkcheck = 'bookmarks' in b2caps
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   765
    if not (pushop.outbookmarks and hasbookmarkcheck):
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   766
        return
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   767
    data = []
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   768
    for book, old, new in pushop.outbookmarks:
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   769
        old = bin(old)
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   770
        data.append((book, old))
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   771
    checkdata = bookmod.binaryencode(data)
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   772
    bundler.newpart('check:bookmarks', data=checkdata)
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
   773
34821
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   774
@b2partsgenerator('check-phases')
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   775
def _pushb2checkphases(pushop, bundler):
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   776
    """insert phase move checking"""
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   777
    if not _pushing(pushop) or pushop.force:
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   778
        return
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   779
    b2caps = bundle2.bundle2caps(pushop.remote)
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   780
    hasphaseheads = 'heads' in b2caps.get('phases', ())
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   781
    if pushop.remotephases is not None and hasphaseheads:
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   782
        # check that the remote phase has not changed
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   783
        checks = [[] for p in phases.allphases]
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   784
        checks[phases.public].extend(pushop.remotephases.publicheads)
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   785
        checks[phases.draft].extend(pushop.remotephases.draftroots)
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   786
        if any(checks):
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   787
            for nodes in checks:
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   788
                nodes.sort()
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   789
            checkdata = phases.binaryencode(checks)
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   790
            bundler.newpart('check:phases', data=checkdata)
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
   791
22017
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
   792
@b2partsgenerator('changeset')
21899
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
   793
def _pushb2ctx(pushop, bundler):
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
   794
    """handle changegroup push through bundle2
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
   795
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
   796
    addchangegroup result is stored in the ``pushop.cgresult`` attribute.
21899
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
   797
    """
21902
7a7def851ba0 push: use `stepsdone` to control changegroup push through bundle10 or bundle20
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21901
diff changeset
   798
    if 'changesets' in pushop.stepsdone:
7a7def851ba0 push: use `stepsdone` to control changegroup push through bundle10 or bundle20
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21901
diff changeset
   799
        return
7a7def851ba0 push: use `stepsdone` to control changegroup push through bundle10 or bundle20
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21901
diff changeset
   800
    pushop.stepsdone.add('changesets')
21899
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
   801
    # Send known heads to the server for race detection.
21903
48f61cfb7576 bundle2-push: move changegroup push validation inside _pushb2ctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21902
diff changeset
   802
    if not _pushcheckoutgoing(pushop):
48f61cfb7576 bundle2-push: move changegroup push validation inside _pushb2ctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21902
diff changeset
   803
        return
28876
79b8f052ee51 localrepo: refactor prepushoutgoinghook to take a pushop
Mads Kiilerich <madski@unity3d.com>
parents: 28668
diff changeset
   804
    pushop.repo.prepushoutgoinghooks(pushop)
26428
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
   805
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
   806
    _pushb2ctxcheckheads(pushop, bundler)
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
   807
23180
116b80d63815 push: send highest changegroup format supported by both side
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23179
diff changeset
   808
    b2caps = bundle2.bundle2caps(pushop.remote)
28668
07f1fbf1f758 exchange: make _pushb2ctx() look more like _getbundlechangegrouppart()
Martin von Zweigbergk <martinvonz@google.com>
parents: 28667
diff changeset
   809
    version = '01'
24686
e0e28e910fa3 bundle2: rename format, parts and config to final names
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24650
diff changeset
   810
    cgversions = b2caps.get('changegroup')
28668
07f1fbf1f758 exchange: make _pushb2ctx() look more like _getbundlechangegrouppart()
Martin von Zweigbergk <martinvonz@google.com>
parents: 28667
diff changeset
   811
    if cgversions:  # 3.1 and 3.2 ship with an empty value
27751
a40e2f7fe49d changegroup: hide packermap behind methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 27738
diff changeset
   812
        cgversions = [v for v in cgversions
27953
88609cfa3745 changegroup: fix pulling to treemanifest repo from flat repo (issue5066)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27938
diff changeset
   813
                      if v in changegroup.supportedoutgoingversions(
88609cfa3745 changegroup: fix pulling to treemanifest repo from flat repo (issue5066)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27938
diff changeset
   814
                          pushop.repo)]
23180
116b80d63815 push: send highest changegroup format supported by both side
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23179
diff changeset
   815
        if not cgversions:
116b80d63815 push: send highest changegroup format supported by both side
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23179
diff changeset
   816
            raise ValueError(_('no common changegroup version'))
116b80d63815 push: send highest changegroup format supported by both side
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23179
diff changeset
   817
        version = max(cgversions)
34098
d8245139e720 changegroup: replace getlocalchangegroupraw with makestream
Durham Goode <durham@fb.com>
parents: 34096
diff changeset
   818
    cgstream = changegroup.makestream(pushop.repo, pushop.outgoing, version,
d8245139e720 changegroup: replace getlocalchangegroupraw with makestream
Durham Goode <durham@fb.com>
parents: 34096
diff changeset
   819
                                      'push')
d8245139e720 changegroup: replace getlocalchangegroupraw with makestream
Durham Goode <durham@fb.com>
parents: 34096
diff changeset
   820
    cgpart = bundler.newpart('changegroup', data=cgstream)
28668
07f1fbf1f758 exchange: make _pushb2ctx() look more like _getbundlechangegrouppart()
Martin von Zweigbergk <martinvonz@google.com>
parents: 28667
diff changeset
   821
    if cgversions:
23180
116b80d63815 push: send highest changegroup format supported by both side
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23179
diff changeset
   822
        cgpart.addparam('version', version)
27938
cabac7dfc621 exchange: set 'treemanifest' param on pushed changegroups too
Martin von Zweigbergk <martinvonz@google.com>
parents: 27883
diff changeset
   823
    if 'treemanifest' in pushop.repo.requirements:
cabac7dfc621 exchange: set 'treemanifest' param on pushed changegroups too
Martin von Zweigbergk <martinvonz@google.com>
parents: 27883
diff changeset
   824
        cgpart.addparam('treemanifest', '1')
21899
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
   825
    def handlereply(op):
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23082
diff changeset
   826
        """extract addchangegroup returns from server reply"""
21899
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
   827
        cgreplies = op.records.getreplies(cgpart.id)
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
   828
        assert len(cgreplies['changegroup']) == 1
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
   829
        pushop.cgresult = cgreplies['changegroup'][0]['return']
21899
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
   830
    return handlereply
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
   831
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   832
@b2partsgenerator('phase')
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   833
def _pushb2phases(pushop, bundler):
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   834
    """handle phase push through bundle2"""
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   835
    if 'phases' in pushop.stepsdone:
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   836
        return
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   837
    b2caps = bundle2.bundle2caps(pushop.remote)
34836
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   838
    ui = pushop.repo.ui
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   839
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   840
    legacyphase = 'phases' in ui.configlist('devel', 'legacy.exchange')
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   841
    haspushkey = 'pushkey' in b2caps
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   842
    hasphaseheads = 'heads' in b2caps.get('phases', ())
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   843
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   844
    if hasphaseheads and not legacyphase:
34910
498697fe41f2 exchange: propagate the subfunctions return
Boris Feld <boris.feld@octobus.net>
parents: 34836
diff changeset
   845
        return _pushb2phaseheads(pushop, bundler)
34836
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   846
    elif haspushkey:
34910
498697fe41f2 exchange: propagate the subfunctions return
Boris Feld <boris.feld@octobus.net>
parents: 34836
diff changeset
   847
        return _pushb2phasespushkey(pushop, bundler)
34822
c1e7ce11db9b phase: isolate logic to update remote phrase through bundle2 pushkey
Boris Feld <boris.feld@octobus.net>
parents: 34821
diff changeset
   848
34836
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   849
def _pushb2phaseheads(pushop, bundler):
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   850
    """push phase information through a bundle2 - binary part"""
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   851
    pushop.stepsdone.add('phases')
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   852
    if pushop.outdatedphases:
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   853
        updates = [[] for p in phases.allphases]
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   854
        updates[0].extend(h.node() for h in pushop.outdatedphases)
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   855
        phasedata = phases.binaryencode(updates)
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   856
        bundler.newpart('phase-heads', data=phasedata)
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
   857
34822
c1e7ce11db9b phase: isolate logic to update remote phrase through bundle2 pushkey
Boris Feld <boris.feld@octobus.net>
parents: 34821
diff changeset
   858
def _pushb2phasespushkey(pushop, bundler):
c1e7ce11db9b phase: isolate logic to update remote phrase through bundle2 pushkey
Boris Feld <boris.feld@octobus.net>
parents: 34821
diff changeset
   859
    """push phase information through a bundle2 - pushkey part"""
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   860
    pushop.stepsdone.add('phases')
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   861
    part2node = []
25502
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
   862
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
   863
    def handlefailure(pushop, exc):
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
   864
        targetid = int(exc.partid)
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
   865
        for partid, node in part2node:
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
   866
            if partid == targetid:
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
   867
                raise error.Abort(_('updating %s to public failed') % node)
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
   868
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   869
    enc = pushkey.encode
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   870
    for newremotehead in pushop.outdatedphases:
25502
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
   871
        part = bundler.newpart('pushkey')
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   872
        part.addparam('namespace', enc('phases'))
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   873
        part.addparam('key', enc(newremotehead.hex()))
34203
3a5d8e2996f8 exchange: use '%d' % x instead of str(x) to encode ints
Augie Fackler <raf@durin42.com>
parents: 34127
diff changeset
   874
        part.addparam('old', enc('%d' % phases.draft))
3a5d8e2996f8 exchange: use '%d' % x instead of str(x) to encode ints
Augie Fackler <raf@durin42.com>
parents: 34127
diff changeset
   875
        part.addparam('new', enc('%d' % phases.public))
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   876
        part2node.append((part.id, newremotehead))
25502
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
   877
        pushop.pkfailcb[part.id] = handlefailure
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
   878
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   879
    def handlereply(op):
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   880
        for partid, node in part2node:
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   881
            partrep = op.records.getreplies(partid)
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   882
            results = partrep['pushkey']
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   883
            assert len(results) <= 1
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   884
            msg = None
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   885
            if not results:
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   886
                msg = _('server ignored update of %s to public!\n') % node
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   887
            elif not int(results[0]['return']):
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   888
                msg = _('updating %s to public failed!\n') % node
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   889
            if msg is not None:
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   890
                pushop.ui.warn(msg)
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
   891
    return handlereply
21904
5fbccbcc07ea bundle2-push: introduce a list of part generating functions
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21903
diff changeset
   892
22347
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
   893
@b2partsgenerator('obsmarkers')
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
   894
def _pushb2obsmarkers(pushop, bundler):
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
   895
    if 'obsmarkers' in pushop.stepsdone:
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
   896
        return
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
   897
    remoteversions = bundle2.obsmarkersversion(bundler.capabilities)
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
   898
    if obsolete.commonversion(remoteversions) is None:
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
   899
        return
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
   900
    pushop.stepsdone.add('obsmarkers')
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
   901
    if pushop.outobsmarkers:
25118
e632a2429982 obsolete: sort obsmarkers during exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24878
diff changeset
   902
        markers = sorted(pushop.outobsmarkers)
32515
e70d6dbde713 bundle2: move function building obsmarker-part in the bundle2 module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32291
diff changeset
   903
        bundle2.buildobsmarkerspart(bundler, markers)
22347
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
   904
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   905
@b2partsgenerator('bookmarks')
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   906
def _pushb2bookmarks(pushop, bundler):
25895
c30b739c322f exchange: s/phase/bookmark/ in _pushb2bookmarks()
Martin von Zweigbergk <martinvonz@google.com>
parents: 25836
diff changeset
   907
    """handle bookmark push through bundle2"""
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   908
    if 'bookmarks' in pushop.stepsdone:
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   909
        return
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   910
    b2caps = bundle2.bundle2caps(pushop.remote)
35264
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   911
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   912
    legacy = pushop.repo.ui.configlist('devel', 'legacy.exchange')
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   913
    legacybooks = 'bookmarks' in legacy
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   914
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   915
    if not legacybooks and 'bookmarks' in b2caps:
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   916
        return _pushb2bookmarkspart(pushop, bundler)
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   917
    elif 'pushkey' in b2caps:
35262
3fd5f05a5b87 push: move bundle2-pushkey based bookmarks exchange in its own function
Boris Feld <boris.feld@octobus.net>
parents: 35259
diff changeset
   918
        return _pushb2bookmarkspushkey(pushop, bundler)
3fd5f05a5b87 push: move bundle2-pushkey based bookmarks exchange in its own function
Boris Feld <boris.feld@octobus.net>
parents: 35259
diff changeset
   919
35264
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   920
def _bmaction(old, new):
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   921
    """small utility for bookmark pushing"""
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   922
    if not old:
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   923
        return 'export'
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   924
    elif not new:
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   925
        return 'delete'
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   926
    return 'update'
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   927
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   928
def _pushb2bookmarkspart(pushop, bundler):
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   929
    pushop.stepsdone.add('bookmarks')
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   930
    if not pushop.outbookmarks:
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   931
        return
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   932
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   933
    allactions = []
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   934
    data = []
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   935
    for book, old, new in pushop.outbookmarks:
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   936
        new = bin(new)
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   937
        data.append((book, new))
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   938
        allactions.append((book, _bmaction(old, new)))
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   939
    checkdata = bookmod.binaryencode(data)
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   940
    bundler.newpart('bookmarks', data=checkdata)
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   941
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   942
    def handlereply(op):
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   943
        ui = pushop.ui
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   944
        # if success
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   945
        for book, action in allactions:
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   946
            ui.status(bookmsgmap[action][0] % book)
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   947
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   948
    return handlereply
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
   949
35262
3fd5f05a5b87 push: move bundle2-pushkey based bookmarks exchange in its own function
Boris Feld <boris.feld@octobus.net>
parents: 35259
diff changeset
   950
def _pushb2bookmarkspushkey(pushop, bundler):
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   951
    pushop.stepsdone.add('bookmarks')
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   952
    part2book = []
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   953
    enc = pushkey.encode
25501
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
   954
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
   955
    def handlefailure(pushop, exc):
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
   956
        targetid = int(exc.partid)
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
   957
        for partid, book, action in part2book:
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
   958
            if partid == targetid:
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
   959
                raise error.Abort(bookmsgmap[action][1].rstrip() % book)
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
   960
        # we should not be called for part we did not generated
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
   961
        assert False
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
   962
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   963
    for book, old, new in pushop.outbookmarks:
25501
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
   964
        part = bundler.newpart('pushkey')
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   965
        part.addparam('namespace', enc('bookmarks'))
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   966
        part.addparam('key', enc(book))
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   967
        part.addparam('old', enc(old))
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   968
        part.addparam('new', enc(new))
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   969
        action = 'update'
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   970
        if not old:
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   971
            action = 'export'
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   972
        elif not new:
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   973
            action = 'delete'
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   974
        part2book.append((part.id, book, action))
25501
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
   975
        pushop.pkfailcb[part.id] = handlefailure
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   976
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   977
    def handlereply(op):
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   978
        ui = pushop.ui
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   979
        for partid, book, action in part2book:
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   980
            partrep = op.records.getreplies(partid)
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   981
            results = partrep['pushkey']
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   982
            assert len(results) <= 1
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   983
            if not results:
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   984
                pushop.ui.warn(_('server ignored bookmark %s update\n') % book)
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   985
            else:
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   986
                ret = int(results[0]['return'])
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   987
                if ret:
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   988
                    ui.status(bookmsgmap[action][0] % book)
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   989
                else:
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
   990
                    ui.warn(bookmsgmap[action][1] % book)
22649
1d7a2422b90c push: set bkresult when pushing bookmarks through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22645
diff changeset
   991
                    if pushop.bkresult is not None:
1d7a2422b90c push: set bkresult when pushing bookmarks through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22645
diff changeset
   992
                        pushop.bkresult = 1
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   993
    return handlereply
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
   994
33693
db3dc11356ed pushvars: move fb extension pushvars to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33689
diff changeset
   995
@b2partsgenerator('pushvars', idx=0)
db3dc11356ed pushvars: move fb extension pushvars to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33689
diff changeset
   996
def _getbundlesendvars(pushop, bundler):
db3dc11356ed pushvars: move fb extension pushvars to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33689
diff changeset
   997
    '''send shellvars via bundle2'''
33885
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
   998
    pushvars = pushop.pushvars
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
   999
    if pushvars:
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
  1000
        shellvars = {}
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
  1001
        for raw in pushvars:
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
  1002
            if '=' not in raw:
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
  1003
                msg = ("unable to parse variable '%s', should follow "
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
  1004
                        "'KEY=VALUE' or 'KEY=' format")
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
  1005
                raise error.Abort(msg % raw)
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
  1006
            k, v = raw.split('=', 1)
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
  1007
            shellvars[k] = v
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
  1008
33693
db3dc11356ed pushvars: move fb extension pushvars to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33689
diff changeset
  1009
        part = bundler.newpart('pushvars')
db3dc11356ed pushvars: move fb extension pushvars to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33689
diff changeset
  1010
33885
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
  1011
        for key, value in shellvars.iteritems():
33693
db3dc11356ed pushvars: move fb extension pushvars to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33689
diff changeset
  1012
            part.addparam(key, value, mandatory=False)
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
  1013
21061
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
  1014
def _pushbundle2(pushop):
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
  1015
    """push data to the remote using bundle2
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
  1016
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
  1017
    The only currently supported type of data is changegroup but this will
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
  1018
    evolve in the future."""
21644
17755dd8c509 bundle2: introduce a bundle2caps function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21643
diff changeset
  1019
    bundler = bundle2.bundle20(pushop.ui, bundle2.bundle2caps(pushop.remote))
23439
743736fc7c41 bundle2-push: provide transaction to reply unbundler
Eric Sumner <ericsumner@fb.com>
parents: 23437
diff changeset
  1020
    pushback = (pushop.trmanager
743736fc7c41 bundle2-push: provide transaction to reply unbundler
Eric Sumner <ericsumner@fb.com>
parents: 23437
diff changeset
  1021
                and pushop.ui.configbool('experimental', 'bundle2.pushback'))
743736fc7c41 bundle2-push: provide transaction to reply unbundler
Eric Sumner <ericsumner@fb.com>
parents: 23437
diff changeset
  1022
21142
15039ce3e4a3 bundle2: include client capabilities in the pushed bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21141
diff changeset
  1023
    # create reply capability
23439
743736fc7c41 bundle2-push: provide transaction to reply unbundler
Eric Sumner <ericsumner@fb.com>
parents: 23437
diff changeset
  1024
    capsblob = bundle2.encodecaps(bundle2.getrepocaps(pushop.repo,
35783
c97639ad6874 bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35765
diff changeset
  1025
                                                      allowpushback=pushback,
c97639ad6874 bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35765
diff changeset
  1026
                                                      role='client'))
24686
e0e28e910fa3 bundle2: rename format, parts and config to final names
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24650
diff changeset
  1027
    bundler.newpart('replycaps', data=capsblob)
21904
5fbccbcc07ea bundle2-push: introduce a list of part generating functions
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21903
diff changeset
  1028
    replyhandlers = []
22017
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
  1029
    for partgenname in b2partsgenorder:
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
  1030
        partgen = b2partsgenmapping[partgenname]
21904
5fbccbcc07ea bundle2-push: introduce a list of part generating functions
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21903
diff changeset
  1031
        ret = partgen(pushop, bundler)
21941
dab31290c7eb bundle2: only use callable return as reply handler
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21906
diff changeset
  1032
        if callable(ret):
dab31290c7eb bundle2: only use callable return as reply handler
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21906
diff changeset
  1033
            replyhandlers.append(ret)
21904
5fbccbcc07ea bundle2-push: introduce a list of part generating functions
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21903
diff changeset
  1034
    # do not push if nothing to push
21903
48f61cfb7576 bundle2-push: move changegroup push validation inside _pushb2ctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21902
diff changeset
  1035
    if bundler.nbparts <= 1:
48f61cfb7576 bundle2-push: move changegroup push validation inside _pushb2ctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21902
diff changeset
  1036
        return
21061
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
  1037
    stream = util.chunkbuffer(bundler.getchunks())
21182
08c84fd99aac bundle2: catch UnknownPartError during local push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21181
diff changeset
  1038
    try:
25485
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
  1039
        try:
29704
b8f9cdca8807 exchange: correctly specify url to unbundle (issue5145)
Augie Fackler <augie@google.com>
parents: 29389
diff changeset
  1040
            reply = pushop.remote.unbundle(
b8f9cdca8807 exchange: correctly specify url to unbundle (issue5145)
Augie Fackler <augie@google.com>
parents: 29389
diff changeset
  1041
                stream, ['force'], pushop.remote.url())
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25640
diff changeset
  1042
        except error.BundleValueError as exc:
29389
98e8313dcd9e i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents: 29376
diff changeset
  1043
            raise error.Abort(_('missing support for %s') % exc)
25485
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
  1044
        try:
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
  1045
            trgetter = None
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
  1046
            if pushback:
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
  1047
                trgetter = pushop.trmanager.transaction
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
  1048
            op = bundle2.processbundle(pushop.repo, reply, trgetter)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25640
diff changeset
  1049
        except error.BundleValueError as exc:
29389
98e8313dcd9e i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents: 29376
diff changeset
  1050
            raise error.Abort(_('missing support for %s') % exc)
26829
58f1645f72c3 bundle2: attribute remote failures to remote (issue4788)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
  1051
        except bundle2.AbortFromPart as exc:
58f1645f72c3 bundle2: attribute remote failures to remote (issue4788)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
  1052
            pushop.ui.status(_('remote: %s\n') % exc)
30908
4c8dcb491974 bundle2: keep hint close to the primary message when remote abort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30685
diff changeset
  1053
            if exc.hint is not None:
4c8dcb491974 bundle2: keep hint close to the primary message when remote abort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30685
diff changeset
  1054
                pushop.ui.status(_('remote: %s\n') % ('(%s)' % exc.hint))
4c8dcb491974 bundle2: keep hint close to the primary message when remote abort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30685
diff changeset
  1055
            raise error.Abort(_('push failed on remote'))
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25640
diff changeset
  1056
    except error.PushkeyFailed as exc:
25485
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
  1057
        partid = int(exc.partid)
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
  1058
        if partid not in pushop.pkfailcb:
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
  1059
            raise
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
  1060
        pushop.pkfailcb[partid](pushop, exc)
21904
5fbccbcc07ea bundle2-push: introduce a list of part generating functions
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21903
diff changeset
  1061
    for rephand in replyhandlers:
5fbccbcc07ea bundle2-push: introduce a list of part generating functions
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21903
diff changeset
  1062
        rephand(op)
21061
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
  1063
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1064
def _pushchangeset(pushop):
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1065
    """Make the actual push of changeset bundle to remote repo"""
21902
7a7def851ba0 push: use `stepsdone` to control changegroup push through bundle10 or bundle20
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21901
diff changeset
  1066
    if 'changesets' in pushop.stepsdone:
7a7def851ba0 push: use `stepsdone` to control changegroup push through bundle10 or bundle20
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21901
diff changeset
  1067
        return
7a7def851ba0 push: use `stepsdone` to control changegroup push through bundle10 or bundle20
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21901
diff changeset
  1068
    pushop.stepsdone.add('changesets')
21903
48f61cfb7576 bundle2-push: move changegroup push validation inside _pushb2ctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21902
diff changeset
  1069
    if not _pushcheckoutgoing(pushop):
48f61cfb7576 bundle2-push: move changegroup push validation inside _pushb2ctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21902
diff changeset
  1070
        return
33701
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1071
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1072
    # Should have verified this in push().
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1073
    assert pushop.remote.capable('unbundle')
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1074
28876
79b8f052ee51 localrepo: refactor prepushoutgoinghook to take a pushop
Mads Kiilerich <madski@unity3d.com>
parents: 28668
diff changeset
  1075
    pushop.repo.prepushoutgoinghooks(pushop)
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1076
    outgoing = pushop.outgoing
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1077
    # TODO: get bundlecaps from remote
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1078
    bundlecaps = None
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1079
    # create a changegroup from local
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1080
    if pushop.revs is None and not (outgoing.excluded
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1081
                            or pushop.repo.changelog.filteredrevs):
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1082
        # push everything,
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1083
        # use the fast path, no race possible on push
34096
f85dfde1731a changegroup: replace getsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33886
diff changeset
  1084
        cg = changegroup.makechangegroup(pushop.repo, outgoing, '01', 'push',
f85dfde1731a changegroup: replace getsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33886
diff changeset
  1085
                fastpath=True, bundlecaps=bundlecaps)
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1086
    else:
34101
5ede882c249c changegroup: replace getchangegroup with makechangegroup
Durham Goode <durham@fb.com>
parents: 34098
diff changeset
  1087
        cg = changegroup.makechangegroup(pushop.repo, outgoing, '01',
5ede882c249c changegroup: replace getchangegroup with makechangegroup
Durham Goode <durham@fb.com>
parents: 34098
diff changeset
  1088
                                        'push', bundlecaps=bundlecaps)
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1089
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1090
    # apply changegroup to remote
33701
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1091
    # local repo finds heads on server, finds out what
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1092
    # revs it must push. once revs transferred, if server
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1093
    # finds it has different heads (someone else won
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1094
    # commit/push race), server aborts.
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1095
    if pushop.force:
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1096
        remoteheads = ['force']
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1097
    else:
33701
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1098
        remoteheads = pushop.remoteheads
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1099
    # ssh: return remote's addchangegroup()
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1100
    # http: return remote's addchangegroup() or 0 for error
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1101
    pushop.cgresult = pushop.remote.unbundle(cg, remoteheads,
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
  1102
                                        pushop.repo.url())
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
  1103
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1104
def _pushsyncphase(pushop):
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
  1105
    """synchronise phase information locally and remotely"""
20468
7d0bbb6dd730 push: extract new common set computation from phase synchronisation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20467
diff changeset
  1106
    cheads = pushop.commonheads
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1107
    # even when we don't push, exchanging phase data is useful
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1108
    remotephases = pushop.remote.listkeys('phases')
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33138
diff changeset
  1109
    if (pushop.ui.configbool('ui', '_usedassubrepo')
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1110
        and remotephases    # server supports phases
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
  1111
        and pushop.cgresult is None # nothing was pushed
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1112
        and remotephases.get('publishing', False)):
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1113
        # When:
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1114
        # - this is a subrepo push
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1115
        # - and remote support phase
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1116
        # - and no changeset was pushed
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1117
        # - and remote is publishing
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1118
        # We may be in issue 3871 case!
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1119
        # We drop the possible phase synchronisation done by
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1120
        # courtesy to publish changesets possibly locally draft
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1121
        # on the remote.
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1122
        remotephases = {'publishing': 'True'}
21012
c827a0028e6f exchange: restore truncated comment
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21005
diff changeset
  1123
    if not remotephases: # old server or public only reply from non-publishing
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1124
        _localphasemove(pushop, cheads)
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1125
        # don't push any phase data as there is nothing to push
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1126
    else:
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1127
        ana = phases.analyzeremotephases(pushop.repo, cheads,
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1128
                                         remotephases)
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1129
        pheads, droots = ana
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1130
        ### Apply remote phase on local
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1131
        if remotephases.get('publishing', False):
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1132
            _localphasemove(pushop, cheads)
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1133
        else: # publish = False
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1134
            _localphasemove(pushop, pheads)
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1135
            _localphasemove(pushop, cheads, phases.draft)
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1136
        ### Apply local phase on remote
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1137
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
  1138
        if pushop.cgresult:
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
  1139
            if 'phases' in pushop.stepsdone:
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
  1140
                # phases already pushed though bundle2
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
  1141
                return
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
  1142
            outdated = pushop.outdatedphases
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
  1143
        else:
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
  1144
            outdated = pushop.fallbackoutdatedphases
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
  1145
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
  1146
        pushop.stepsdone.add('phases')
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
  1147
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
  1148
        # filter heads already turned public by the push
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
  1149
        outdated = [c for c in outdated if c.node() not in pheads]
23376
2e65da5f80df push: stop independent usage of bundle2 in syncphase (issue4454)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23082
diff changeset
  1150
        # fallback to independent pushkey command
2e65da5f80df push: stop independent usage of bundle2 in syncphase (issue4454)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23082
diff changeset
  1151
        for newremotehead in outdated:
2e65da5f80df push: stop independent usage of bundle2 in syncphase (issue4454)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23082
diff changeset
  1152
            r = pushop.remote.pushkey('phases',
2e65da5f80df push: stop independent usage of bundle2 in syncphase (issue4454)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23082
diff changeset
  1153
                                      newremotehead.hex(),
2e65da5f80df push: stop independent usage of bundle2 in syncphase (issue4454)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23082
diff changeset
  1154
                                      str(phases.draft),
2e65da5f80df push: stop independent usage of bundle2 in syncphase (issue4454)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23082
diff changeset
  1155
                                      str(phases.public))
2e65da5f80df push: stop independent usage of bundle2 in syncphase (issue4454)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23082
diff changeset
  1156
            if not r:
2e65da5f80df push: stop independent usage of bundle2 in syncphase (issue4454)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23082
diff changeset
  1157
                pushop.ui.warn(_('updating %s to public failed!\n')
2e65da5f80df push: stop independent usage of bundle2 in syncphase (issue4454)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23082
diff changeset
  1158
                               % newremotehead)
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
  1159
20438
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
  1160
def _localphasemove(pushop, nodes, phase=phases.public):
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
  1161
    """move <nodes> to <phase> in the local source repo"""
23437
94e2862dbcfb push: elevate phase transaction to cover entire operation
Eric Sumner <ericsumner@fb.com>
parents: 23436
diff changeset
  1162
    if pushop.trmanager:
94e2862dbcfb push: elevate phase transaction to cover entire operation
Eric Sumner <ericsumner@fb.com>
parents: 23436
diff changeset
  1163
        phases.advanceboundary(pushop.repo,
94e2862dbcfb push: elevate phase transaction to cover entire operation
Eric Sumner <ericsumner@fb.com>
parents: 23436
diff changeset
  1164
                               pushop.trmanager.transaction(),
94e2862dbcfb push: elevate phase transaction to cover entire operation
Eric Sumner <ericsumner@fb.com>
parents: 23436
diff changeset
  1165
                               phase,
94e2862dbcfb push: elevate phase transaction to cover entire operation
Eric Sumner <ericsumner@fb.com>
parents: 23436
diff changeset
  1166
                               nodes)
20438
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
  1167
    else:
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
  1168
        # repo is not locked, do not change any phases!
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
  1169
        # Informs the user that phases should have been moved when
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
  1170
        # applicable.
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
  1171
        actualmoves = [n for n in nodes if phase < pushop.repo[n].phase()]
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
  1172
        phasestr = phases.phasenames[phase]
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
  1173
        if actualmoves:
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
  1174
            pushop.ui.status(_('cannot lock source repo, skipping '
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
  1175
                               'local %s phase update\n') % phasestr)
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
  1176
20433
6af248474224 push: feed pushoperation object to _pushobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20432
diff changeset
  1177
def _pushobsolete(pushop):
20434
e009e59e4566 push: drop now outdated comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20433
diff changeset
  1178
    """utility function to push obsolete markers to a remote"""
22036
f1528ef123f4 push: use stepsdone for obsmarkers push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22035
diff changeset
  1179
    if 'obsmarkers' in pushop.stepsdone:
f1528ef123f4 push: use stepsdone for obsmarkers push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22035
diff changeset
  1180
        return
20433
6af248474224 push: feed pushoperation object to _pushobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20432
diff changeset
  1181
    repo = pushop.repo
6af248474224 push: feed pushoperation object to _pushobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20432
diff changeset
  1182
    remote = pushop.remote
22036
f1528ef123f4 push: use stepsdone for obsmarkers push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22035
diff changeset
  1183
    pushop.stepsdone.add('obsmarkers')
22350
6d113cc7a31a push: only push obsmarkers relevant to the "pushed subset"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22347
diff changeset
  1184
    if pushop.outobsmarkers:
25559
521c1a3139c9 push: only say we are trying to push obsmarkers when we actually try
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25516
diff changeset
  1185
        pushop.ui.debug('try to push obsolete markers to remote\n')
20432
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
  1186
        rslts = []
25118
e632a2429982 obsolete: sort obsmarkers during exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24878
diff changeset
  1187
        remotedata = obsolete._pushkeyescape(sorted(pushop.outobsmarkers))
20432
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
  1188
        for key in sorted(remotedata, reverse=True):
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
  1189
            # reverse sort to ensure we end with dump0
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
  1190
            data = remotedata[key]
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
  1191
            rslts.append(remote.pushkey('obsolete', key, '', data))
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
  1192
        if [r for r in rslts if not r]:
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
  1193
            msg = _('failed to push some obsolete markers!\n')
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
  1194
            repo.ui.warn(msg)
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
  1195
20431
bebf8b8479f3 push: feed pushoperation object to _pushbookmark function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20352
diff changeset
  1196
def _pushbookmark(pushop):
20352
58300f61b139 push: move bookmarks exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20351
diff changeset
  1197
    """Update bookmark position on remote"""
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
  1198
    if pushop.cgresult == 0 or 'bookmarks' in pushop.stepsdone:
22228
a3dc2d385490 pushbookmark: do not attempt to update bookmarks if the push failed (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22227
diff changeset
  1199
        return
22240
d092f4b68fb6 push: use stepsdone to control bookmark push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22239
diff changeset
  1200
    pushop.stepsdone.add('bookmarks')
20431
bebf8b8479f3 push: feed pushoperation object to _pushbookmark function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20352
diff changeset
  1201
    ui = pushop.ui
bebf8b8479f3 push: feed pushoperation object to _pushbookmark function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20352
diff changeset
  1202
    remote = pushop.remote
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
  1203
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
  1204
    for b, old, new in pushop.outbookmarks:
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
  1205
        action = 'update'
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
  1206
        if not old:
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
  1207
            action = 'export'
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
  1208
        elif not new:
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
  1209
            action = 'delete'
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
  1210
        if remote.pushkey('bookmarks', b, old, new):
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
  1211
            ui.status(bookmsgmap[action][0] % b)
20352
58300f61b139 push: move bookmarks exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20351
diff changeset
  1212
        else:
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
  1213
            ui.warn(bookmsgmap[action][1] % b)
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
  1214
            # discovery can have set the value form invalid entry
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
  1215
            if pushop.bkresult is not None:
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
  1216
                pushop.bkresult = 1
20469
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
  1217
20472
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
  1218
class pulloperation(object):
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
  1219
    """A object that represent a single pull operation
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
  1220
23219
61cd79ac4b99 exchange: swap "push" for "pull" in pulloperation docstring
Mike Edgar <adgar@google.com>
parents: 23218
diff changeset
  1221
    It purpose is to carry pull related state and very common operation.
20472
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
  1222
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
  1223
    A new should be created at the beginning of each pull and discarded
20472
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
  1224
    afterward.
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
  1225
    """
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
  1226
25446
b5311068077e pull: prevent race condition in bookmark update when using -B (issue4689)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25445
diff changeset
  1227
    def __init__(self, repo, remote, heads=None, force=False, bookmarks=(),
26448
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
  1228
                 remotebookmarks=None, streamclonerequested=None):
20596
004a1744088d exchange: fix docs for pulloperation
Siddharth Agarwal <sid0@fb.com>
parents: 20489
diff changeset
  1229
        # repo we pull into
20472
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
  1230
        self.repo = repo
20596
004a1744088d exchange: fix docs for pulloperation
Siddharth Agarwal <sid0@fb.com>
parents: 20489
diff changeset
  1231
        # repo we pull from
20473
1516daaca632 pull: move `remote` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20472
diff changeset
  1232
        self.remote = remote
20474
c9bceafc61be pull: move `heads` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20473
diff changeset
  1233
        # revision we try to pull (None is "all")
c9bceafc61be pull: move `heads` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20473
diff changeset
  1234
        self.heads = heads
22654
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
  1235
        # bookmark pulled explicitly
29376
113d0b23321a bookmarks: add 'hg pull -B .' for pulling the active bookmark (issue5258)
liscju <piotr.listkiewicz@gmail.com>
parents: 29341
diff changeset
  1236
        self.explicitbookmarks = [repo._bookmarks.expandname(bookmark)
113d0b23321a bookmarks: add 'hg pull -B .' for pulling the active bookmark (issue5258)
liscju <piotr.listkiewicz@gmail.com>
parents: 29341
diff changeset
  1237
                                  for bookmark in bookmarks]
20475
b79b405583af pull: move `force` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20474
diff changeset
  1238
        # do we force pull?
b79b405583af pull: move `force` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20474
diff changeset
  1239
        self.force = force
26448
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
  1240
        # whether a streaming clone was requested
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
  1241
        self.streamclonerequested = streamclonerequested
23436
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1242
        # transaction manager
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1243
        self.trmanager = None
20487
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1244
        # set of common changeset between local and remote before pull
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1245
        self.common = None
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1246
        # set of pulled head
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1247
        self.rheads = None
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
  1248
        # list of missing changeset to fetch remotely
20488
76e66654f74e pull: move `fetch` subset into the object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20487
diff changeset
  1249
        self.fetch = None
22654
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
  1250
        # remote bookmarks data
25446
b5311068077e pull: prevent race condition in bookmark update when using -B (issue4689)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25445
diff changeset
  1251
        self.remotebookmarks = remotebookmarks
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
  1252
        # result of changegroup pulling (used as return code by pull)
20898
f295b2ac3579 pull: move return code in the pull operation object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20878
diff changeset
  1253
        self.cgresult = None
22937
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1254
        # list of step already done
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1255
        self.stepsdone = set()
26689
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
  1256
        # Whether we attempted a clone from pre-generated bundles.
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
  1257
        self.clonebundleattempted = False
20487
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1258
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1259
    @util.propertycache
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1260
    def pulledsubset(self):
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1261
        """heads of the set of changeset target by the pull"""
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1262
        # compute target subset
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1263
        if self.heads is None:
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1264
            # We pulled every thing possible
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1265
            # sync on everything common
20878
09e7118715eb pull: prevent duplicated entry in `op.pulledsubset`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20596
diff changeset
  1266
            c = set(self.common)
09e7118715eb pull: prevent duplicated entry in `op.pulledsubset`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20596
diff changeset
  1267
            ret = list(self.common)
09e7118715eb pull: prevent duplicated entry in `op.pulledsubset`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20596
diff changeset
  1268
            for n in self.rheads:
09e7118715eb pull: prevent duplicated entry in `op.pulledsubset`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20596
diff changeset
  1269
                if n not in c:
09e7118715eb pull: prevent duplicated entry in `op.pulledsubset`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20596
diff changeset
  1270
                    ret.append(n)
09e7118715eb pull: prevent duplicated entry in `op.pulledsubset`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20596
diff changeset
  1271
            return ret
20487
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1272
        else:
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1273
            # We pulled a specific subset
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1274
            # sync on this subset
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
  1275
            return self.heads
20477
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
  1276
26464
9a7fc6d48898 exchange: expose bundle2 capabilities on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26462
diff changeset
  1277
    @util.propertycache
26465
eda32ee9962f exchange: expose bundle2 availability on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26464
diff changeset
  1278
    def canusebundle2(self):
29682
2db085d5f5a2 bundle2: rename the _canusebundle2 method to _forcebundle1
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29389
diff changeset
  1279
        return not _forcebundle1(self)
26465
eda32ee9962f exchange: expose bundle2 availability on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26464
diff changeset
  1280
eda32ee9962f exchange: expose bundle2 availability on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26464
diff changeset
  1281
    @util.propertycache
26464
9a7fc6d48898 exchange: expose bundle2 capabilities on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26462
diff changeset
  1282
    def remotebundle2caps(self):
9a7fc6d48898 exchange: expose bundle2 capabilities on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26462
diff changeset
  1283
        return bundle2.bundle2caps(self.remote)
9a7fc6d48898 exchange: expose bundle2 capabilities on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26462
diff changeset
  1284
20477
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
  1285
    def gettransaction(self):
23436
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1286
        # deprecated; talk to trmanager directly
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1287
        return self.trmanager.transaction()
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1288
33793
bbbbd3c30bfc util: add base class for transactional context managers
Martin von Zweigbergk <martinvonz@google.com>
parents: 33792
diff changeset
  1289
class transactionmanager(util.transactional):
23543
4dd8a6a1240d spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23439
diff changeset
  1290
    """An object to manage the life cycle of a transaction
23436
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1291
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1292
    It creates the transaction on demand and calls the appropriate hooks when
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1293
    closing the transaction."""
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1294
    def __init__(self, repo, source, url):
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1295
        self.repo = repo
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1296
        self.source = source
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1297
        self.url = url
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1298
        self._tr = None
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1299
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1300
    def transaction(self):
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1301
        """Return an open transaction object, constructing if necessary"""
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1302
        if not self._tr:
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1303
            trname = '%s\n%s' % (self.source, util.hidepassword(self.url))
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1304
            self._tr = self.repo.transaction(trname)
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1305
            self._tr.hookargs['source'] = self.source
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1306
            self._tr.hookargs['url'] = self.url
20477
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
  1307
        return self._tr
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
  1308
23436
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1309
    def close(self):
20477
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
  1310
        """close transaction if created"""
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
  1311
        if self._tr is not None:
23222
6b7e60fb0b38 exchange: use the postclose API on transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23219
diff changeset
  1312
            self._tr.close()
20477
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
  1313
23436
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
  1314
    def release(self):
20477
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
  1315
        """release transaction if created"""
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
  1316
        if self._tr is not None:
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
  1317
            self._tr.release()
20469
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
  1318
26448
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
  1319
def pull(repo, remote, heads=None, force=False, bookmarks=(), opargs=None,
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
  1320
         streamclonerequested=None):
26440
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1321
    """Fetch repository data from a remote.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1322
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1323
    This is the main function used to retrieve data from a remote repository.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1324
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1325
    ``repo`` is the local repository to clone into.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1326
    ``remote`` is a peer instance.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1327
    ``heads`` is an iterable of revisions we want to pull. ``None`` (the
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1328
    default) means to pull everything from the remote.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1329
    ``bookmarks`` is an iterable of bookmarks requesting to be pulled. By
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1330
    default, all remote bookmarks are pulled.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1331
    ``opargs`` are additional keyword arguments to pass to ``pulloperation``
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1332
    initialization.
26448
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
  1333
    ``streamclonerequested`` is a boolean indicating whether a "streaming
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
  1334
    clone" is requested. A "streaming clone" is essentially a raw file copy
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
  1335
    of revlogs from the server. This only works when the local repository is
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
  1336
    empty. The default value of ``None`` means to respect the server
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
  1337
    configuration for preferring stream clones.
26440
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1338
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1339
    Returns the ``pulloperation`` created for this pull.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
  1340
    """
25445
1457c1f28c92 pull: allow a generic way to pass parameters to the pull operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25444
diff changeset
  1341
    if opargs is None:
1457c1f28c92 pull: allow a generic way to pass parameters to the pull operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25444
diff changeset
  1342
        opargs = {}
1457c1f28c92 pull: allow a generic way to pass parameters to the pull operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25444
diff changeset
  1343
    pullop = pulloperation(repo, remote, heads, force, bookmarks=bookmarks,
35355
a119e97b6caf py3: handle keyword arguments correctly in exchange.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
  1344
                           streamclonerequested=streamclonerequested,
a119e97b6caf py3: handle keyword arguments correctly in exchange.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
  1345
                           **pycompat.strkwargs(opargs))
33702
033484935391 exchange: access requirements on repo instead of peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33701
diff changeset
  1346
033484935391 exchange: access requirements on repo instead of peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33701
diff changeset
  1347
    peerlocal = pullop.remote.local()
033484935391 exchange: access requirements on repo instead of peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33701
diff changeset
  1348
    if peerlocal:
033484935391 exchange: access requirements on repo instead of peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33701
diff changeset
  1349
        missing = set(peerlocal.requirements) - pullop.repo.supported
20469
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
  1350
        if missing:
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
  1351
            msg = _("required features are not"
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
  1352
                    " supported in the destination:"
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
  1353
                    " %s") % (', '.join(sorted(missing)))
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26566
diff changeset
  1354
            raise error.Abort(msg)
20469
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
  1355
35578
86f9aabed67b exchange: use context manager for locks and transaction in unbundle()
Martin von Zweigbergk <martinvonz@google.com>
parents: 35355
diff changeset
  1356
    pullop.trmanager = transactionmanager(repo, 'pull', remote.url())
86f9aabed67b exchange: use context manager for locks and transaction in unbundle()
Martin von Zweigbergk <martinvonz@google.com>
parents: 35355
diff changeset
  1357
    with repo.wlock(), repo.lock(), pullop.trmanager:
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  1358
        # This should ideally be in _pullbundle2(). However, it needs to run
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  1359
        # before discovery to avoid extra work.
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  1360
        _maybeapplyclonebundle(pullop)
34364
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  1361
        streamclone.maybeperformlegacystreamclone(pullop)
20900
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
  1362
        _pulldiscovery(pullop)
26465
eda32ee9962f exchange: expose bundle2 availability on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26464
diff changeset
  1363
        if pullop.canusebundle2:
20955
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
  1364
            _pullbundle2(pullop)
22653
d94f5bec9c8e pull: perform the todostep inside functions handling old way of pulling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22651
diff changeset
  1365
        _pullchangeset(pullop)
d94f5bec9c8e pull: perform the todostep inside functions handling old way of pulling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22651
diff changeset
  1366
        _pullphase(pullop)
22655
f48ac29c2a9e pull: retrieve bookmarks before obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22654
diff changeset
  1367
        _pullbookmarks(pullop)
22653
d94f5bec9c8e pull: perform the todostep inside functions handling old way of pulling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22651
diff changeset
  1368
        _pullobsolete(pullop)
20469
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
  1369
35236
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35041
diff changeset
  1370
    # storing remotenames
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35041
diff changeset
  1371
    if repo.ui.configbool('experimental', 'remotenames'):
35347
a29fe459fc49 remotenames: rename related file and storage dir to logexchange
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35305
diff changeset
  1372
        logexchange.pullremotenames(repo, remote)
35236
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35041
diff changeset
  1373
22693
68439b154063 exchange: have `pull` return the pulloperation object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
  1374
    return pullop
20476
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1375
22936
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1376
# list of steps to perform discovery before pull
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1377
pulldiscoveryorder = []
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1378
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1379
# Mapping between step name and function
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1380
#
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1381
# This exists to help extensions wrap steps if necessary
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1382
pulldiscoverymapping = {}
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1383
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1384
def pulldiscovery(stepname):
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1385
    """decorator for function performing discovery before pull
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1386
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1387
    The function is added to the step -> function mapping and appended to the
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1388
    list of steps.  Beware that decorated function will be added in order (this
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1389
    may matter).
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1390
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1391
    You can only use this decorator for a new step, if you want to wrap a step
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1392
    from an extension, change the pulldiscovery dictionary directly."""
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1393
    def dec(func):
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1394
        assert stepname not in pulldiscoverymapping
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1395
        pulldiscoverymapping[stepname] = func
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1396
        pulldiscoveryorder.append(stepname)
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1397
        return func
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1398
    return dec
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1399
20900
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
  1400
def _pulldiscovery(pullop):
22936
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1401
    """Run all discovery steps"""
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1402
    for stepname in pulldiscoveryorder:
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1403
        step = pulldiscoverymapping[stepname]
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1404
        step(pullop)
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1405
25369
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
  1406
@pulldiscovery('b1:bookmarks')
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
  1407
def _pullbookmarkbundle1(pullop):
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
  1408
    """fetch bookmark data in bundle1 case
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
  1409
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
  1410
    If not using bundle2, we have to fetch bookmarks before changeset
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
  1411
    discovery to reduce the chance and impact of race conditions."""
25443
443d3decbdde pull: skip pulling remote bookmarks with bundle1 if a value already exist
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25423
diff changeset
  1412
    if pullop.remotebookmarks is not None:
443d3decbdde pull: skip pulling remote bookmarks with bundle1 if a value already exist
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25423
diff changeset
  1413
        return
26465
eda32ee9962f exchange: expose bundle2 availability on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26464
diff changeset
  1414
    if pullop.canusebundle2 and 'listkeys' in pullop.remotebundle2caps:
25479
f00a63a43c4b bundle2: pull bookmark the old way if no bundle2 listkeys support (issue4701)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25446
diff changeset
  1415
        # all known bundle2 servers now support listkeys, but lets be nice with
f00a63a43c4b bundle2: pull bookmark the old way if no bundle2 listkeys support (issue4701)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25446
diff changeset
  1416
        # new implementation.
f00a63a43c4b bundle2: pull bookmark the old way if no bundle2 listkeys support (issue4701)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25446
diff changeset
  1417
        return
35039
d7a4384d2d87 pull: store binary node in pullop.remotebookmarks
Boris Feld <boris.feld@octobus.net>
parents: 34910
diff changeset
  1418
    books = pullop.remote.listkeys('bookmarks')
d7a4384d2d87 pull: store binary node in pullop.remotebookmarks
Boris Feld <boris.feld@octobus.net>
parents: 34910
diff changeset
  1419
    pullop.remotebookmarks = bookmod.unhexlifybookmarks(books)
25369
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
  1420
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
  1421
22936
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1422
@pulldiscovery('changegroup')
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
  1423
def _pulldiscoverychangegroup(pullop):
20900
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
  1424
    """discovery phase for the pull
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
  1425
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
  1426
    Current handle changeset discovery only, will change handle all discovery
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
  1427
    at some point."""
23848
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1428
    tmp = discovery.findcommonincoming(pullop.repo,
20900
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
  1429
                                       pullop.remote,
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
  1430
                                       heads=pullop.heads,
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
  1431
                                       force=pullop.force)
23848
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1432
    common, fetch, rheads = tmp
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1433
    nm = pullop.repo.unfiltered().changelog.nodemap
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1434
    if fetch and rheads:
34317
e45ec589f962 discovery: avoid dropping remote heads hidden locally
Boris Feld <boris.feld@octobus.net>
parents: 34221
diff changeset
  1435
        # If a remote heads is filtered locally, put in back in common.
23848
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1436
        #
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1437
        # This is a hackish solution to catch most of "common but locally
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1438
        # hidden situation".  We do not performs discovery on unfiltered
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1439
        # repository because it end up doing a pathological amount of round
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1440
        # trip for w huge amount of changeset we do not care about.
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1441
        #
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1442
        # If a set of such "common but filtered" changeset exist on the server
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1443
        # but are not including a remote heads, we'll not be able to detect it,
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1444
        scommon = set(common)
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1445
        for n in rheads:
23975
3b7088a5c64c discovery: properly exclude locally known but filtered heads
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23890
diff changeset
  1446
            if n in nm:
3b7088a5c64c discovery: properly exclude locally known but filtered heads
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23890
diff changeset
  1447
                if n not in scommon:
3b7088a5c64c discovery: properly exclude locally known but filtered heads
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23890
diff changeset
  1448
                    common.append(n)
34317
e45ec589f962 discovery: avoid dropping remote heads hidden locally
Boris Feld <boris.feld@octobus.net>
parents: 34221
diff changeset
  1449
        if set(rheads).issubset(set(common)):
23848
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1450
            fetch = []
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1451
    pullop.common = common
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1452
    pullop.fetch = fetch
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
  1453
    pullop.rheads = rheads
20900
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
  1454
20955
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
  1455
def _pullbundle2(pullop):
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
  1456
    """pull data using bundle2
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
  1457
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
  1458
    For now, the only supported data are changegroup."""
35783
c97639ad6874 bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35765
diff changeset
  1459
    kwargs = {'bundlecaps': caps20to10(pullop.repo, role='client')}
26471
41dd7b2c7e15 exchange: add "streaming all changes" to bundle2 pulling
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26465
diff changeset
  1460
35761
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
  1461
    # make ui easier to access
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
  1462
    ui = pullop.repo.ui
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
  1463
32257
205bd3936179 bundle2: don't check for whether we can do stream clones
Siddharth Agarwal <sid0@fb.com>
parents: 32222
diff changeset
  1464
    # At the moment we don't do stream clones over bundle2. If that is
205bd3936179 bundle2: don't check for whether we can do stream clones
Siddharth Agarwal <sid0@fb.com>
parents: 32222
diff changeset
  1465
    # implemented then here's where the check for that will go.
35763
7eedbd5d4880 streamclone: add support for bundle2 based stream clone
Boris Feld <boris.feld@octobus.net>
parents: 35762
diff changeset
  1466
    streaming = streamclone.canperformstreamclone(pullop, bundle2=True)[0]
26471
41dd7b2c7e15 exchange: add "streaming all changes" to bundle2 pulling
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26465
diff changeset
  1467
35761
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
  1468
    # declare pull perimeters
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
  1469
    kwargs['common'] = pullop.common
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
  1470
    kwargs['heads'] = pullop.heads or pullop.rheads
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
  1471
35763
7eedbd5d4880 streamclone: add support for bundle2 based stream clone
Boris Feld <boris.feld@octobus.net>
parents: 35762
diff changeset
  1472
    if streaming:
7eedbd5d4880 streamclone: add support for bundle2 based stream clone
Boris Feld <boris.feld@octobus.net>
parents: 35762
diff changeset
  1473
        kwargs['cg'] = False
7eedbd5d4880 streamclone: add support for bundle2 based stream clone
Boris Feld <boris.feld@octobus.net>
parents: 35762
diff changeset
  1474
        kwargs['stream'] = True
7eedbd5d4880 streamclone: add support for bundle2 based stream clone
Boris Feld <boris.feld@octobus.net>
parents: 35762
diff changeset
  1475
        pullop.stepsdone.add('changegroup')
35765
56c30b31afbe streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents: 35763
diff changeset
  1476
        pullop.stepsdone.add('phases')
35763
7eedbd5d4880 streamclone: add support for bundle2 based stream clone
Boris Feld <boris.feld@octobus.net>
parents: 35762
diff changeset
  1477
7eedbd5d4880 streamclone: add support for bundle2 based stream clone
Boris Feld <boris.feld@octobus.net>
parents: 35762
diff changeset
  1478
    else:
35762
40df727b6f4f pull: preindent some code
Boris Feld <boris.feld@octobus.net>
parents: 35761
diff changeset
  1479
        # pulling changegroup
40df727b6f4f pull: preindent some code
Boris Feld <boris.feld@octobus.net>
parents: 35761
diff changeset
  1480
        pullop.stepsdone.add('changegroup')
21259
ab5040cd5749 bundle2: fix bundle2 pulling all revs on empty pulls
Durham Goode <durham@fb.com>
parents: 21258
diff changeset
  1481
35762
40df727b6f4f pull: preindent some code
Boris Feld <boris.feld@octobus.net>
parents: 35761
diff changeset
  1482
        kwargs['cg'] = pullop.fetch
34322
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1483
35765
56c30b31afbe streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents: 35763
diff changeset
  1484
        legacyphase = 'phases' in ui.configlist('devel', 'legacy.exchange')
56c30b31afbe streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents: 35763
diff changeset
  1485
        hasbinaryphase = 'heads' in pullop.remotebundle2caps.get('phases', ())
56c30b31afbe streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents: 35763
diff changeset
  1486
        if (not legacyphase and hasbinaryphase):
56c30b31afbe streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents: 35763
diff changeset
  1487
            kwargs['phases'] = True
56c30b31afbe streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents: 35763
diff changeset
  1488
            pullop.stepsdone.add('phases')
34322
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1489
35765
56c30b31afbe streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents: 35763
diff changeset
  1490
        if 'listkeys' in pullop.remotebundle2caps:
56c30b31afbe streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents: 35763
diff changeset
  1491
            if 'phases' not in pullop.stepsdone:
56c30b31afbe streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents: 35763
diff changeset
  1492
                kwargs['listkeys'] = ['phases']
35761
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
  1493
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1494
    bookmarksrequested = False
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1495
    legacybookmark = 'bookmarks' in ui.configlist('devel', 'legacy.exchange')
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1496
    hasbinarybook = 'bookmarks' in pullop.remotebundle2caps
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1497
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1498
    if pullop.remotebookmarks is not None:
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1499
        pullop.stepsdone.add('request-bookmarks')
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1500
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1501
    if ('request-bookmarks' not in pullop.stepsdone
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1502
        and pullop.remotebookmarks is None
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1503
        and not legacybookmark and hasbinarybook):
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1504
        kwargs['bookmarks'] = True
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1505
        bookmarksrequested = True
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1506
26464
9a7fc6d48898 exchange: expose bundle2 capabilities on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26462
diff changeset
  1507
    if 'listkeys' in pullop.remotebundle2caps:
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1508
        if 'request-bookmarks' not in pullop.stepsdone:
25444
1d1fd5d44f57 pull: skip pulling remote bookmarks with bundle2 if a value already exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25443
diff changeset
  1509
            # make sure to always includes bookmark data when migrating
1d1fd5d44f57 pull: skip pulling remote bookmarks with bundle2 if a value already exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25443
diff changeset
  1510
            # `hg incoming --bundle` to using this function.
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1511
            pullop.stepsdone.add('request-bookmarks')
34322
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1512
            kwargs.setdefault('listkeys', []).append('bookmarks')
26690
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
  1513
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
  1514
    # If this is a full pull / clone and the server supports the clone bundles
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
  1515
    # feature, tell the server whether we attempted a clone bundle. The
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
  1516
    # presence of this flag indicates the client supports clone bundles. This
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
  1517
    # will enable the server to treat clients that support clone bundles
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
  1518
    # differently from those that don't.
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
  1519
    if (pullop.remote.capable('clonebundles')
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
  1520
        and pullop.heads is None and list(pullop.common) == [nullid]):
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
  1521
        kwargs['cbattempted'] = pullop.clonebundleattempted
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
  1522
26471
41dd7b2c7e15 exchange: add "streaming all changes" to bundle2 pulling
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26465
diff changeset
  1523
    if streaming:
41dd7b2c7e15 exchange: add "streaming all changes" to bundle2 pulling
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26465
diff changeset
  1524
        pullop.repo.ui.status(_('streaming all changes\n'))
41dd7b2c7e15 exchange: add "streaming all changes" to bundle2 pulling
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26465
diff changeset
  1525
    elif not pullop.fetch:
21258
71931b789424 exchange: fix bad indentation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21257
diff changeset
  1526
        pullop.repo.ui.status(_("no changes found\n"))
71931b789424 exchange: fix bad indentation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21257
diff changeset
  1527
        pullop.cgresult = 0
20955
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
  1528
    else:
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
  1529
        if pullop.heads is None and list(pullop.common) == [nullid]:
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
  1530
            pullop.repo.ui.status(_("requesting all changes\n"))
22953
b1d694d3975e obsolete: add exchange option
Durham Goode <durham@fb.com>
parents: 22937
diff changeset
  1531
    if obsolete.isenabled(pullop.repo, obsolete.exchangeopt):
26464
9a7fc6d48898 exchange: expose bundle2 capabilities on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26462
diff changeset
  1532
        remoteversions = bundle2.obsmarkersversion(pullop.remotebundle2caps)
22354
a89add6c6b2f bundle2: pull obsmarkers relevant to the pulled set through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22353
diff changeset
  1533
        if obsolete.commonversion(remoteversions) is not None:
a89add6c6b2f bundle2: pull obsmarkers relevant to the pulled set through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22353
diff changeset
  1534
            kwargs['obsmarkers'] = True
22937
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1535
            pullop.stepsdone.add('obsmarkers')
21159
024f38f6d5f6 bundle2: allow extensions to extend the getbundle request
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21158
diff changeset
  1536
    _pullbundle2extraprepare(pullop, kwargs)
32896
e14484e7f562 py3: use pycompat.strkwargs() to convert kwargs keys to str before passing
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32891
diff changeset
  1537
    bundle = pullop.remote.getbundle('pull', **pycompat.strkwargs(kwargs))
20955
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
  1538
    try:
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1539
        op = bundle2.bundleoperation(pullop.repo, pullop.gettransaction)
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1540
        op.modes['bookmarks'] = 'records'
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1541
        bundle2.processbundle(pullop.repo, bundle, op=op)
30913
d70971a3ae80 getbundle: cleanly handle remote abort during getbundle
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30908
diff changeset
  1542
    except bundle2.AbortFromPart as exc:
d70971a3ae80 getbundle: cleanly handle remote abort during getbundle
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30908
diff changeset
  1543
        pullop.repo.ui.status(_('remote: abort: %s\n') % exc)
d70971a3ae80 getbundle: cleanly handle remote abort during getbundle
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30908
diff changeset
  1544
        raise error.Abort(_('pull failed on remote'), hint=exc.hint)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25640
diff changeset
  1545
    except error.BundleValueError as exc:
29389
98e8313dcd9e i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents: 29376
diff changeset
  1546
        raise error.Abort(_('missing support for %s') % exc)
21259
ab5040cd5749 bundle2: fix bundle2 pulling all revs on empty pulls
Durham Goode <durham@fb.com>
parents: 21258
diff changeset
  1547
ab5040cd5749 bundle2: fix bundle2 pulling all revs on empty pulls
Durham Goode <durham@fb.com>
parents: 21258
diff changeset
  1548
    if pullop.fetch:
33037
d765ad56081f bundle: make combinechangegroupresults() take a bundleoperation
Martin von Zweigbergk <martinvonz@google.com>
parents: 33036
diff changeset
  1549
        pullop.cgresult = bundle2.combinechangegroupresults(op)
20955
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
  1550
21658
0696ca0a685b pull: when remote supports it, pull phase data alongside changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21657
diff changeset
  1551
    # processing phases change
0696ca0a685b pull: when remote supports it, pull phase data alongside changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21657
diff changeset
  1552
    for namespace, value in op.records['listkeys']:
0696ca0a685b pull: when remote supports it, pull phase data alongside changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21657
diff changeset
  1553
        if namespace == 'phases':
0696ca0a685b pull: when remote supports it, pull phase data alongside changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21657
diff changeset
  1554
            _pullapplyphases(pullop, value)
0696ca0a685b pull: when remote supports it, pull phase data alongside changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21657
diff changeset
  1555
22656
c9276945eba3 pull: retrieve bookmarks through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22655
diff changeset
  1556
    # processing bookmark update
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1557
    if bookmarksrequested:
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1558
        books = {}
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1559
        for record in op.records['bookmarks']:
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1560
            books[record['bookmark']] = record["node"]
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1561
        pullop.remotebookmarks = books
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1562
    else:
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1563
        for namespace, value in op.records['listkeys']:
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1564
            if namespace == 'bookmarks':
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
  1565
                pullop.remotebookmarks = bookmod.unhexlifybookmarks(value)
25444
1d1fd5d44f57 pull: skip pulling remote bookmarks with bundle2 if a value already exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25443
diff changeset
  1566
1d1fd5d44f57 pull: skip pulling remote bookmarks with bundle2 if a value already exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25443
diff changeset
  1567
    # bookmark data were either already there or pulled in the bundle
1d1fd5d44f57 pull: skip pulling remote bookmarks with bundle2 if a value already exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25443
diff changeset
  1568
    if pullop.remotebookmarks is not None:
1d1fd5d44f57 pull: skip pulling remote bookmarks with bundle2 if a value already exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25443
diff changeset
  1569
        _pullbookmarks(pullop)
22656
c9276945eba3 pull: retrieve bookmarks through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22655
diff changeset
  1570
21159
024f38f6d5f6 bundle2: allow extensions to extend the getbundle request
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21158
diff changeset
  1571
def _pullbundle2extraprepare(pullop, kwargs):
024f38f6d5f6 bundle2: allow extensions to extend the getbundle request
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21158
diff changeset
  1572
    """hook function so that extensions can extend the getbundle call"""
024f38f6d5f6 bundle2: allow extensions to extend the getbundle request
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21158
diff changeset
  1573
20489
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1574
def _pullchangeset(pullop):
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1575
    """pull changeset from unbundle into the local repo"""
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1576
    # We delay the open of the transaction as late as possible so we
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1577
    # don't open transaction for nothing or you break future useful
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1578
    # rollback call
22937
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1579
    if 'changegroup' in pullop.stepsdone:
22653
d94f5bec9c8e pull: perform the todostep inside functions handling old way of pulling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22651
diff changeset
  1580
        return
22937
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1581
    pullop.stepsdone.add('changegroup')
20899
d62319f91cb7 pull: move the cgresult logic in _pullchangeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20898
diff changeset
  1582
    if not pullop.fetch:
23217
2f12ac53b528 exchange: fix indentation in _pullchangeset
Mike Edgar <adgar@google.com>
parents: 23208
diff changeset
  1583
        pullop.repo.ui.status(_("no changes found\n"))
2f12ac53b528 exchange: fix indentation in _pullchangeset
Mike Edgar <adgar@google.com>
parents: 23208
diff changeset
  1584
        pullop.cgresult = 0
2f12ac53b528 exchange: fix indentation in _pullchangeset
Mike Edgar <adgar@google.com>
parents: 23208
diff changeset
  1585
        return
32930
af31d531dda0 changegroup: let callers pass in transaction to apply() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32927
diff changeset
  1586
    tr = pullop.gettransaction()
20489
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1587
    if pullop.heads is None and list(pullop.common) == [nullid]:
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1588
        pullop.repo.ui.status(_("requesting all changes\n"))
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1589
    elif pullop.heads is None and pullop.remote.capable('changegroupsubset'):
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1590
        # issue1320, avoid a race if remote changed after discovery
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1591
        pullop.heads = pullop.rheads
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1592
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1593
    if pullop.remote.capable('getbundle'):
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1594
        # TODO: get bundlecaps from remote
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1595
        cg = pullop.remote.getbundle('pull', common=pullop.common,
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1596
                                     heads=pullop.heads or pullop.rheads)
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1597
    elif pullop.heads is None:
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1598
        cg = pullop.remote.changegroup(pullop.fetch, 'pull')
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1599
    elif not pullop.remote.capable('changegroupsubset'):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26566
diff changeset
  1600
        raise error.Abort(_("partial pull cannot be done because "
21554
7bcf4adadd2d exchange: fix indentation level
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21259
diff changeset
  1601
                           "other repository doesn't support "
7bcf4adadd2d exchange: fix indentation level
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21259
diff changeset
  1602
                           "changegroupsubset."))
20489
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1603
    else:
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1604
        cg = pullop.remote.changegroupsubset(pullop.fetch, pullop.heads, 'pull')
33043
18c2489ac96d bundle: make applybundle() delegate v1 bundles to applybundle1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33040
diff changeset
  1605
    bundleop = bundle2.applybundle(pullop.repo, cg, tr, 'pull',
18c2489ac96d bundle: make applybundle() delegate v1 bundles to applybundle1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33040
diff changeset
  1606
                                   pullop.remote.url())
33040
2baef42a2881 bundle: make applybundle1() return a bundleoperation
Martin von Zweigbergk <martinvonz@google.com>
parents: 33039
diff changeset
  1607
    pullop.cgresult = bundle2.combinechangegroupresults(bundleop)
20489
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
  1608
20486
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
  1609
def _pullphase(pullop):
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
  1610
    # Get remote phases data from remote
22937
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1611
    if 'phases' in pullop.stepsdone:
22653
d94f5bec9c8e pull: perform the todostep inside functions handling old way of pulling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22651
diff changeset
  1612
        return
21654
ddf9a00c1239 pull: split remote phases retrieval from actual application
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21645
diff changeset
  1613
    remotephases = pullop.remote.listkeys('phases')
ddf9a00c1239 pull: split remote phases retrieval from actual application
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21645
diff changeset
  1614
    _pullapplyphases(pullop, remotephases)
ddf9a00c1239 pull: split remote phases retrieval from actual application
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21645
diff changeset
  1615
ddf9a00c1239 pull: split remote phases retrieval from actual application
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21645
diff changeset
  1616
def _pullapplyphases(pullop, remotephases):
ddf9a00c1239 pull: split remote phases retrieval from actual application
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21645
diff changeset
  1617
    """apply phase movement from observed remote state"""
22937
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1618
    if 'phases' in pullop.stepsdone:
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1619
        return
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1620
    pullop.stepsdone.add('phases')
20486
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
  1621
    publishing = bool(remotephases.get('publishing', False))
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
  1622
    if remotephases and not publishing:
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30187
diff changeset
  1623
        # remote is new and non-publishing
20486
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
  1624
        pheads, _dr = phases.analyzeremotephases(pullop.repo,
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
  1625
                                                 pullop.pulledsubset,
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
  1626
                                                 remotephases)
22068
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1627
        dheads = pullop.pulledsubset
20486
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
  1628
    else:
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
  1629
        # Remote is old or publishing all common changesets
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
  1630
        # should be seen as public
22068
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1631
        pheads = pullop.pulledsubset
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1632
        dheads = []
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1633
    unfi = pullop.repo.unfiltered()
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1634
    phase = unfi._phasecache.phase
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1635
    rev = unfi.changelog.nodemap.get
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1636
    public = phases.public
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1637
    draft = phases.draft
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1638
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1639
    # exclude changesets already public locally and update the others
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1640
    pheads = [pn for pn in pheads if phase(unfi, rev(pn)) > public]
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1641
    if pheads:
22069
616a455b02ca phase: add a transaction argument to advanceboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22068
diff changeset
  1642
        tr = pullop.gettransaction()
616a455b02ca phase: add a transaction argument to advanceboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22068
diff changeset
  1643
        phases.advanceboundary(pullop.repo, tr, public, pheads)
22068
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1644
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1645
    # exclude changesets already draft locally and update the others
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1646
    dheads = [pn for pn in dheads if phase(unfi, rev(pn)) > draft]
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
  1647
    if dheads:
22069
616a455b02ca phase: add a transaction argument to advanceboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22068
diff changeset
  1648
        tr = pullop.gettransaction()
616a455b02ca phase: add a transaction argument to advanceboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22068
diff changeset
  1649
        phases.advanceboundary(pullop.repo, tr, draft, dheads)
20486
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
  1650
22654
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
  1651
def _pullbookmarks(pullop):
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
  1652
    """process the remote bookmark information to update the local one"""
22937
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1653
    if 'bookmarks' in pullop.stepsdone:
22654
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
  1654
        return
22937
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1655
    pullop.stepsdone.add('bookmarks')
22654
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
  1656
    repo = pullop.repo
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
  1657
    remotebookmarks = pullop.remotebookmarks
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
  1658
    bookmod.updatefromremote(repo.ui, repo, remotebookmarks,
22658
a8f0d8e4c80a pull: gather explicit bookmark pulls with bookmark updates
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22656
diff changeset
  1659
                             pullop.remote.url(),
22666
0f8120c1ecf5 pull: perform bookmark updates in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
  1660
                             pullop.gettransaction,
22658
a8f0d8e4c80a pull: gather explicit bookmark pulls with bookmark updates
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22656
diff changeset
  1661
                             explicit=pullop.explicitbookmarks)
22654
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
  1662
20478
80628d4069be push: feed pulloperation object to _pullobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20477
diff changeset
  1663
def _pullobsolete(pullop):
20476
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1664
    """utility function to pull obsolete markers from a remote
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1665
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1666
    The `gettransaction` is function that return the pull transaction, creating
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1667
    one if necessary. We return the transaction to inform the calling code that
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1668
    a new transaction have been created (when applicable).
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1669
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1670
    Exists mostly to allow overriding for experimentation purpose"""
22937
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1671
    if 'obsmarkers' in pullop.stepsdone:
22653
d94f5bec9c8e pull: perform the todostep inside functions handling old way of pulling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22651
diff changeset
  1672
        return
22937
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
  1673
    pullop.stepsdone.add('obsmarkers')
20476
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1674
    tr = None
22953
b1d694d3975e obsolete: add exchange option
Durham Goode <durham@fb.com>
parents: 22937
diff changeset
  1675
    if obsolete.isenabled(pullop.repo, obsolete.exchangeopt):
20478
80628d4069be push: feed pulloperation object to _pullobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20477
diff changeset
  1676
        pullop.repo.ui.debug('fetching remote obsolete markers\n')
80628d4069be push: feed pulloperation object to _pullobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20477
diff changeset
  1677
        remoteobs = pullop.remote.listkeys('obsolete')
20476
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1678
        if 'dump0' in remoteobs:
20478
80628d4069be push: feed pulloperation object to _pullobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20477
diff changeset
  1679
            tr = pullop.gettransaction()
27558
b5b54825de6b pull: make a single call to obsstore.add (issue5006)
Matt Mackall <mpm@selenic.com>
parents: 27523
diff changeset
  1680
            markers = []
20476
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1681
            for key in sorted(remoteobs, reverse=True):
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1682
                if key.startswith('dump'):
32201
4462a981e8df base85: proxy through util module
Yuya Nishihara <yuya@tcha.org>
parents: 32166
diff changeset
  1683
                    data = util.b85decode(remoteobs[key])
27558
b5b54825de6b pull: make a single call to obsstore.add (issue5006)
Matt Mackall <mpm@selenic.com>
parents: 27523
diff changeset
  1684
                    version, newmarks = obsolete._readmarkers(data)
b5b54825de6b pull: make a single call to obsstore.add (issue5006)
Matt Mackall <mpm@selenic.com>
parents: 27523
diff changeset
  1685
                    markers += newmarks
b5b54825de6b pull: make a single call to obsstore.add (issue5006)
Matt Mackall <mpm@selenic.com>
parents: 27523
diff changeset
  1686
            if markers:
b5b54825de6b pull: make a single call to obsstore.add (issue5006)
Matt Mackall <mpm@selenic.com>
parents: 27523
diff changeset
  1687
                pullop.repo.obsstore.add(tr, markers)
20478
80628d4069be push: feed pulloperation object to _pullobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20477
diff changeset
  1688
            pullop.repo.invalidatevolatilesets()
20476
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1689
    return tr
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
  1690
35783
c97639ad6874 bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35765
diff changeset
  1691
def caps20to10(repo, role):
21645
aed14bb165f3 bundle2: introduce a ``caps20to10`` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21644
diff changeset
  1692
    """return a set with appropriate options to use bundle20 during getbundle"""
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32287
diff changeset
  1693
    caps = {'HG20'}
35783
c97639ad6874 bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35765
diff changeset
  1694
    capsblob = bundle2.encodecaps(bundle2.getrepocaps(repo, role=role))
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
  1695
    caps.add('bundle2=' + urlreq.quote(capsblob))
21645
aed14bb165f3 bundle2: introduce a ``caps20to10`` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21644
diff changeset
  1696
    return caps
aed14bb165f3 bundle2: introduce a ``caps20to10`` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21644
diff changeset
  1697
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1698
# List of names of steps to perform for a bundle2 for getbundle, order matters.
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1699
getbundle2partsorder = []
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1700
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1701
# Mapping between step name and function
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1702
#
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1703
# This exists to help extensions wrap steps if necessary
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1704
getbundle2partsmapping = {}
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1705
24732
8f70b529cb0c bundle2: add an 'idx' argument to the 'getbundle2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24731
diff changeset
  1706
def getbundle2partsgenerator(stepname, idx=None):
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1707
    """decorator for function generating bundle2 part for getbundle
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1708
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1709
    The function is added to the step -> function mapping and appended to the
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1710
    list of steps.  Beware that decorated functions will be added in order
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1711
    (this may matter).
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1712
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1713
    You can only use this decorator for new steps, if you want to wrap a step
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1714
    from an extension, attack the getbundle2partsmapping dictionary directly."""
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1715
    def dec(func):
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1716
        assert stepname not in getbundle2partsmapping
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1717
        getbundle2partsmapping[stepname] = func
24732
8f70b529cb0c bundle2: add an 'idx' argument to the 'getbundle2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24731
diff changeset
  1718
        if idx is None:
8f70b529cb0c bundle2: add an 'idx' argument to the 'getbundle2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24731
diff changeset
  1719
            getbundle2partsorder.append(stepname)
8f70b529cb0c bundle2: add an 'idx' argument to the 'getbundle2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24731
diff changeset
  1720
        else:
8f70b529cb0c bundle2: add an 'idx' argument to the 'getbundle2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24731
diff changeset
  1721
            getbundle2partsorder.insert(idx, stepname)
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1722
        return func
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1723
    return dec
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1724
27244
709977a4fc9d exchange: standalone function to determine if bundle2 is requested
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26935
diff changeset
  1725
def bundle2requested(bundlecaps):
709977a4fc9d exchange: standalone function to determine if bundle2 is requested
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26935
diff changeset
  1726
    if bundlecaps is not None:
709977a4fc9d exchange: standalone function to determine if bundle2 is requested
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26935
diff changeset
  1727
        return any(cap.startswith('HG2') for cap in bundlecaps)
709977a4fc9d exchange: standalone function to determine if bundle2 is requested
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26935
diff changeset
  1728
    return False
709977a4fc9d exchange: standalone function to determine if bundle2 is requested
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26935
diff changeset
  1729
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30068
diff changeset
  1730
def getbundlechunks(repo, source, heads=None, common=None, bundlecaps=None,
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30068
diff changeset
  1731
                    **kwargs):
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30068
diff changeset
  1732
    """Return chunks constituting a bundle's raw data.
20954
dba91f8060eb bundle2: add an exchange.getbundle function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20933
diff changeset
  1733
24686
e0e28e910fa3 bundle2: rename format, parts and config to final names
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24650
diff changeset
  1734
    Could be a bundle HG10 or a bundle HG20 depending on bundlecaps
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30068
diff changeset
  1735
    passed.
20954
dba91f8060eb bundle2: add an exchange.getbundle function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20933
diff changeset
  1736
35785
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35784
diff changeset
  1737
    Returns a 2-tuple of a dict with metadata about the generated bundle
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35784
diff changeset
  1738
    and an iterator over raw chunks (of varying sizes).
20954
dba91f8060eb bundle2: add an exchange.getbundle function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20933
diff changeset
  1739
    """
33016
4e6dc34b5d7a py3: convert kwargs keys' back to bytes using pycompat.byteskwargs()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32991
diff changeset
  1740
    kwargs = pycompat.byteskwargs(kwargs)
35785
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35784
diff changeset
  1741
    info = {}
27244
709977a4fc9d exchange: standalone function to determine if bundle2 is requested
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26935
diff changeset
  1742
    usebundle2 = bundle2requested(bundlecaps)
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1743
    # bundle10 case
24649
2d15c59a001b bundle2: detect bundle2 stream/request on /HG2./ instead of /HG2Y/
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24641
diff changeset
  1744
    if not usebundle2:
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1745
        if bundlecaps and not kwargs.get('cg', True):
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1746
            raise ValueError(_('request for bundle10 must include changegroup'))
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1747
21656
36200dc6b3bd getbundle: raise error if extra arguments are provided for bundle10
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21654
diff changeset
  1748
        if kwargs:
36200dc6b3bd getbundle: raise error if extra arguments are provided for bundle10
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21654
diff changeset
  1749
            raise ValueError(_('unsupported getbundle arguments: %s')
36200dc6b3bd getbundle: raise error if extra arguments are provided for bundle10
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21654
diff changeset
  1750
                             % ', '.join(sorted(kwargs.keys())))
29808
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
  1751
        outgoing = _computeoutgoing(repo, heads, common)
35785
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35784
diff changeset
  1752
        info['bundleversion'] = 1
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35784
diff changeset
  1753
        return info, changegroup.makestream(repo, outgoing, '01', source,
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35784
diff changeset
  1754
                                            bundlecaps=bundlecaps)
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1755
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1756
    # bundle20 case
35785
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35784
diff changeset
  1757
    info['bundleversion'] = 2
21143
5bb5d4ba14e5 bundle2: transmit capabilities to getbundle during pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21142
diff changeset
  1758
    b2caps = {}
5bb5d4ba14e5 bundle2: transmit capabilities to getbundle during pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21142
diff changeset
  1759
    for bcaps in bundlecaps:
5bb5d4ba14e5 bundle2: transmit capabilities to getbundle during pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21142
diff changeset
  1760
        if bcaps.startswith('bundle2='):
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
  1761
            blob = urlreq.unquote(bcaps[len('bundle2='):])
21143
5bb5d4ba14e5 bundle2: transmit capabilities to getbundle during pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21142
diff changeset
  1762
            b2caps.update(bundle2.decodecaps(blob))
5bb5d4ba14e5 bundle2: transmit capabilities to getbundle during pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21142
diff changeset
  1763
    bundler = bundle2.bundle20(repo.ui, b2caps)
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1764
23218
0e78ea8e592a exchange: prepare kwargs for bundle2 part generation exactly once
Mike Edgar <adgar@google.com>
parents: 23217
diff changeset
  1765
    kwargs['heads'] = heads
0e78ea8e592a exchange: prepare kwargs for bundle2 part generation exactly once
Mike Edgar <adgar@google.com>
parents: 23217
diff changeset
  1766
    kwargs['common'] = common
0e78ea8e592a exchange: prepare kwargs for bundle2 part generation exactly once
Mike Edgar <adgar@google.com>
parents: 23217
diff changeset
  1767
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1768
    for name in getbundle2partsorder:
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1769
        func = getbundle2partsmapping[name]
22543
6a669d5a62b8 bundle2: remove heads and common arguments to getbundle parts generators
Mike Hommey <mh@glandium.org>
parents: 22542
diff changeset
  1770
        func(bundler, repo, source, bundlecaps=bundlecaps, b2caps=b2caps,
33017
c31d45623304 py3: convert kwargs' keys' to str using pycompat.strkwargs()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33016
diff changeset
  1771
             **pycompat.strkwargs(kwargs))
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1772
35787
a84dbc87dae9 exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35785
diff changeset
  1773
    info['prefercompressed'] = bundler.prefercompressed
a84dbc87dae9 exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35785
diff changeset
  1774
35785
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35784
diff changeset
  1775
    return info, bundler.getchunks()
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1776
35788
b116a66bcc44 bundle2: move version of stream clone into part name
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35787
diff changeset
  1777
@getbundle2partsgenerator('stream2')
b116a66bcc44 bundle2: move version of stream clone into part name
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35787
diff changeset
  1778
def _getbundlestream2(bundler, repo, source, bundlecaps=None,
b116a66bcc44 bundle2: move version of stream clone into part name
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35787
diff changeset
  1779
                      b2caps=None, heads=None, common=None, **kwargs):
35759
c24dad55ac19 bundle2: add support for a 'stream' parameter to 'getbundle'
Boris Feld <boris.feld@octobus.net>
parents: 35578
diff changeset
  1780
    if not kwargs.get('stream', False):
c24dad55ac19 bundle2: add support for a 'stream' parameter to 'getbundle'
Boris Feld <boris.feld@octobus.net>
parents: 35578
diff changeset
  1781
        return
35787
a84dbc87dae9 exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35785
diff changeset
  1782
35791
9adae6a20e1f exchange: don't send stream data when server.uncompressed is set
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35788
diff changeset
  1783
    if not streamclone.allowservergeneration(repo):
9adae6a20e1f exchange: don't send stream data when server.uncompressed is set
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35788
diff changeset
  1784
        raise error.Abort(_('stream data requested but server does not allow '
9adae6a20e1f exchange: don't send stream data when server.uncompressed is set
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35788
diff changeset
  1785
                            'this feature'),
9adae6a20e1f exchange: don't send stream data when server.uncompressed is set
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35788
diff changeset
  1786
                          hint=_('well-behaved clients should not be '
9adae6a20e1f exchange: don't send stream data when server.uncompressed is set
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35788
diff changeset
  1787
                                 'requesting stream data from servers not '
9adae6a20e1f exchange: don't send stream data when server.uncompressed is set
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35788
diff changeset
  1788
                                 'advertising it; the client may be buggy'))
9adae6a20e1f exchange: don't send stream data when server.uncompressed is set
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35788
diff changeset
  1789
35787
a84dbc87dae9 exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35785
diff changeset
  1790
    # Stream clones don't compress well. And compression undermines a
a84dbc87dae9 exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35785
diff changeset
  1791
    # goal of stream clones, which is to be fast. Communicate the desire
a84dbc87dae9 exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35785
diff changeset
  1792
    # to avoid compression to consumers of the bundle.
a84dbc87dae9 exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35785
diff changeset
  1793
    bundler.prefercompressed = False
a84dbc87dae9 exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35785
diff changeset
  1794
35759
c24dad55ac19 bundle2: add support for a 'stream' parameter to 'getbundle'
Boris Feld <boris.feld@octobus.net>
parents: 35578
diff changeset
  1795
    filecount, bytecount, it = streamclone.generatev2(repo)
35813
768326377e4d bundle2: fix the formatting of the stream part requirements
Boris Feld <boris.feld@octobus.net>
parents: 35812
diff changeset
  1796
    requirements = _formatrequirementsspec(repo.requirements)
35788
b116a66bcc44 bundle2: move version of stream clone into part name
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35787
diff changeset
  1797
    part = bundler.newpart('stream2', data=it)
35759
c24dad55ac19 bundle2: add support for a 'stream' parameter to 'getbundle'
Boris Feld <boris.feld@octobus.net>
parents: 35578
diff changeset
  1798
    part.addparam('bytecount', '%d' % bytecount, mandatory=True)
c24dad55ac19 bundle2: add support for a 'stream' parameter to 'getbundle'
Boris Feld <boris.feld@octobus.net>
parents: 35578
diff changeset
  1799
    part.addparam('filecount', '%d' % filecount, mandatory=True)
c24dad55ac19 bundle2: add support for a 'stream' parameter to 'getbundle'
Boris Feld <boris.feld@octobus.net>
parents: 35578
diff changeset
  1800
    part.addparam('requirements', requirements, mandatory=True)
c24dad55ac19 bundle2: add support for a 'stream' parameter to 'getbundle'
Boris Feld <boris.feld@octobus.net>
parents: 35578
diff changeset
  1801
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1802
@getbundle2partsgenerator('changegroup')
22543
6a669d5a62b8 bundle2: remove heads and common arguments to getbundle parts generators
Mike Hommey <mh@glandium.org>
parents: 22542
diff changeset
  1803
def _getbundlechangegrouppart(bundler, repo, source, bundlecaps=None,
6a669d5a62b8 bundle2: remove heads and common arguments to getbundle parts generators
Mike Hommey <mh@glandium.org>
parents: 22542
diff changeset
  1804
                              b2caps=None, heads=None, common=None, **kwargs):
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1805
    """add a changegroup part to the requested bundle"""
34098
d8245139e720 changegroup: replace getlocalchangegroupraw with makestream
Durham Goode <durham@fb.com>
parents: 34096
diff changeset
  1806
    cgstream = None
35355
a119e97b6caf py3: handle keyword arguments correctly in exchange.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
  1807
    if kwargs.get(r'cg', True):
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1808
        # build changegroup bundle here.
28667
e7bf227e33a5 exchange: get rid of "getcgkwargs" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 28456
diff changeset
  1809
        version = '01'
24686
e0e28e910fa3 bundle2: rename format, parts and config to final names
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24650
diff changeset
  1810
        cgversions = b2caps.get('changegroup')
25503
1b7853a1f04e getbundle: have a single getchangegroupraw call site
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25502
diff changeset
  1811
        if cgversions:  # 3.1 and 3.2 ship with an empty value
27751
a40e2f7fe49d changegroup: hide packermap behind methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 27738
diff changeset
  1812
            cgversions = [v for v in cgversions
27953
88609cfa3745 changegroup: fix pulling to treemanifest repo from flat repo (issue5066)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27938
diff changeset
  1813
                          if v in changegroup.supportedoutgoingversions(repo)]
23179
6bb9533fa8fa getbundle: send highest changegroup format supported by both side
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23177
diff changeset
  1814
            if not cgversions:
6bb9533fa8fa getbundle: send highest changegroup format supported by both side
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23177
diff changeset
  1815
                raise ValueError(_('no common changegroup version'))
28667
e7bf227e33a5 exchange: get rid of "getcgkwargs" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 28456
diff changeset
  1816
            version = max(cgversions)
29808
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
  1817
        outgoing = _computeoutgoing(repo, heads, common)
34127
709b44f38ab9 changegroup: avoid creating empty changegroup part
Durham Goode <durham@fb.com>
parents: 34102
diff changeset
  1818
        if outgoing.missing:
709b44f38ab9 changegroup: avoid creating empty changegroup part
Durham Goode <durham@fb.com>
parents: 34102
diff changeset
  1819
            cgstream = changegroup.makestream(repo, outgoing, version, source,
709b44f38ab9 changegroup: avoid creating empty changegroup part
Durham Goode <durham@fb.com>
parents: 34102
diff changeset
  1820
                                              bundlecaps=bundlecaps)
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1821
34098
d8245139e720 changegroup: replace getlocalchangegroupraw with makestream
Durham Goode <durham@fb.com>
parents: 34096
diff changeset
  1822
    if cgstream:
d8245139e720 changegroup: replace getlocalchangegroupraw with makestream
Durham Goode <durham@fb.com>
parents: 34096
diff changeset
  1823
        part = bundler.newpart('changegroup', data=cgstream)
28667
e7bf227e33a5 exchange: get rid of "getcgkwargs" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 28456
diff changeset
  1824
        if cgversions:
23179
6bb9533fa8fa getbundle: send highest changegroup format supported by both side
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23177
diff changeset
  1825
            part.addparam('version', version)
34221
8e0358024a36 bundles: turn nbchanges int into a bytestr using pycompat.bytestr
Augie Fackler <raf@durin42.com>
parents: 34220
diff changeset
  1826
        part.addparam('nbchanges', '%d' % len(outgoing.missing),
8e0358024a36 bundles: turn nbchanges int into a bytestr using pycompat.bytestr
Augie Fackler <raf@durin42.com>
parents: 34220
diff changeset
  1827
                      mandatory=False)
27734
5c0fd878779c treemanifests: set bundle2 part parameter indicating treemanifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 27558
diff changeset
  1828
        if 'treemanifest' in repo.requirements:
5c0fd878779c treemanifests: set bundle2 part parameter indicating treemanifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 27558
diff changeset
  1829
            part.addparam('treemanifest', '1')
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1830
35267
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
  1831
@getbundle2partsgenerator('bookmarks')
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
  1832
def _getbundlebookmarkpart(bundler, repo, source, bundlecaps=None,
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
  1833
                              b2caps=None, **kwargs):
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
  1834
    """add a bookmark part to the requested bundle"""
35355
a119e97b6caf py3: handle keyword arguments correctly in exchange.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
  1835
    if not kwargs.get(r'bookmarks', False):
35267
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
  1836
        return
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
  1837
    if 'bookmarks' not in b2caps:
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
  1838
        raise ValueError(_('no common bookmarks exchange method'))
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
  1839
    books  = bookmod.listbinbookmarks(repo)
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
  1840
    data = bookmod.binaryencode(books)
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
  1841
    if data:
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
  1842
        bundler.newpart('bookmarks', data=data)
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
  1843
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1844
@getbundle2partsgenerator('listkeys')
22543
6a669d5a62b8 bundle2: remove heads and common arguments to getbundle parts generators
Mike Hommey <mh@glandium.org>
parents: 22542
diff changeset
  1845
def _getbundlelistkeysparts(bundler, repo, source, bundlecaps=None,
6a669d5a62b8 bundle2: remove heads and common arguments to getbundle parts generators
Mike Hommey <mh@glandium.org>
parents: 22542
diff changeset
  1846
                            b2caps=None, **kwargs):
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1847
    """add parts containing listkeys namespaces to the requested bundle"""
35355
a119e97b6caf py3: handle keyword arguments correctly in exchange.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
  1848
    listkeys = kwargs.get(r'listkeys', ())
21657
0ff44e06275d getbundle: support of listkeys argument when bundle2 is used
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21656
diff changeset
  1849
    for namespace in listkeys:
24686
e0e28e910fa3 bundle2: rename format, parts and config to final names
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24650
diff changeset
  1850
        part = bundler.newpart('listkeys')
21657
0ff44e06275d getbundle: support of listkeys argument when bundle2 is used
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21656
diff changeset
  1851
        part.addparam('namespace', namespace)
0ff44e06275d getbundle: support of listkeys argument when bundle2 is used
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21656
diff changeset
  1852
        keys = repo.listkeys(namespace).items()
0ff44e06275d getbundle: support of listkeys argument when bundle2 is used
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21656
diff changeset
  1853
        part.data = pushkey.encodekeys(keys)
20967
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
  1854
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
  1855
@getbundle2partsgenerator('obsmarkers')
22543
6a669d5a62b8 bundle2: remove heads and common arguments to getbundle parts generators
Mike Hommey <mh@glandium.org>
parents: 22542
diff changeset
  1856
def _getbundleobsmarkerpart(bundler, repo, source, bundlecaps=None,
6a669d5a62b8 bundle2: remove heads and common arguments to getbundle parts generators
Mike Hommey <mh@glandium.org>
parents: 22542
diff changeset
  1857
                            b2caps=None, heads=None, **kwargs):
22541
4e1a80c022a4 bundle2: pass b2caps down to functions adding bundle2 parts for getbundle
Mike Hommey <mh@glandium.org>
parents: 22390
diff changeset
  1858
    """add an obsolescence markers part to the requested bundle"""
35355
a119e97b6caf py3: handle keyword arguments correctly in exchange.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
  1859
    if kwargs.get(r'obsmarkers', False):
22353
47e3420ae889 getbundle: add `obsmarkers` argument to getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22352
diff changeset
  1860
        if heads is None:
47e3420ae889 getbundle: add `obsmarkers` argument to getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22352
diff changeset
  1861
            heads = repo.heads()
47e3420ae889 getbundle: add `obsmarkers` argument to getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22352
diff changeset
  1862
        subset = [c.node() for c in repo.set('::%ln', heads)]
47e3420ae889 getbundle: add `obsmarkers` argument to getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22352
diff changeset
  1863
        markers = repo.obsstore.relevantmarkers(subset)
25118
e632a2429982 obsolete: sort obsmarkers during exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24878
diff changeset
  1864
        markers = sorted(markers)
32515
e70d6dbde713 bundle2: move function building obsmarker-part in the bundle2 module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32291
diff changeset
  1865
        bundle2.buildobsmarkerspart(bundler, markers)
22353
47e3420ae889 getbundle: add `obsmarkers` argument to getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22352
diff changeset
  1866
34322
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1867
@getbundle2partsgenerator('phases')
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1868
def _getbundlephasespart(bundler, repo, source, bundlecaps=None,
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1869
                            b2caps=None, heads=None, **kwargs):
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1870
    """add phase heads part to the requested bundle"""
35355
a119e97b6caf py3: handle keyword arguments correctly in exchange.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
  1871
    if kwargs.get(r'phases', False):
34322
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1872
        if not 'heads' in b2caps.get('phases'):
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1873
            raise ValueError(_('no common phases exchange method'))
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1874
        if heads is None:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1875
            heads = repo.heads()
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1876
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1877
        headsbyphase = collections.defaultdict(set)
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1878
        if repo.publishing():
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1879
            headsbyphase[phases.public] = heads
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1880
        else:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1881
            # find the appropriate heads to move
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1882
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1883
            phase = repo._phasecache.phase
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1884
            node = repo.changelog.node
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1885
            rev = repo.changelog.rev
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1886
            for h in heads:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1887
                headsbyphase[phase(repo, rev(h))].add(h)
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1888
            seenphases = list(headsbyphase.keys())
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1889
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1890
            # We do not handle anything but public and draft phase for now)
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1891
            if seenphases:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1892
                assert max(seenphases) <= phases.draft
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1893
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1894
            # if client is pulling non-public changesets, we need to find
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1895
            # intermediate public heads.
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1896
            draftheads = headsbyphase.get(phases.draft, set())
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1897
            if draftheads:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1898
                publicheads = headsbyphase.get(phases.public, set())
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1899
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1900
                revset = 'heads(only(%ln, %ln) and public())'
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1901
                extraheads = repo.revs(revset, draftheads, publicheads)
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1902
                for r in extraheads:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1903
                    headsbyphase[phases.public].add(node(r))
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1904
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1905
        # transform data in a format used by the encoding function
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1906
        phasemapping = []
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1907
        for phase in phases.allphases:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1908
            phasemapping.append(sorted(headsbyphase[phase]))
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1909
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1910
        # generate the actual part
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1911
        phasedata = phases.binaryencode(phasemapping)
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1912
        bundler.newpart('phase-heads', data=phasedata)
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
  1913
25402
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1914
@getbundle2partsgenerator('hgtagsfnodes')
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1915
def _getbundletagsfnodes(bundler, repo, source, bundlecaps=None,
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1916
                         b2caps=None, heads=None, common=None,
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1917
                         **kwargs):
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1918
    """Transfer the .hgtags filenodes mapping.
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1919
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1920
    Only values for heads in this bundle will be transferred.
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1921
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1922
    The part data consists of pairs of 20 byte changeset node and .hgtags
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1923
    filenodes raw values.
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1924
    """
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1925
    # Don't send unless:
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1926
    # - changeset are being exchanged,
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1927
    # - the client supports it.
35355
a119e97b6caf py3: handle keyword arguments correctly in exchange.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
  1928
    if not (kwargs.get(r'cg', True) and 'hgtagsfnodes' in b2caps):
25402
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1929
        return
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1930
29808
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
  1931
    outgoing = _computeoutgoing(repo, heads, common)
32222
6068712cbf03 bundle2: move tagsfnodecache generation in a generic function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32201
diff changeset
  1932
    bundle2.addparttagsfnodescache(repo, bundler, outgoing)
25402
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
  1933
20967
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
  1934
def check_heads(repo, their_heads, context):
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
  1935
    """check if the heads of a repo have been modified
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
  1936
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
  1937
    Used by peer for unbundling.
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
  1938
    """
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
  1939
    heads = repo.heads()
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29064
diff changeset
  1940
    heads_hash = hashlib.sha1(''.join(sorted(heads))).digest()
20967
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
  1941
    if not (their_heads == ['force'] or their_heads == heads or
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
  1942
            their_heads == ['hashed', heads_hash]):
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
  1943
        # someone else committed/pushed/unbundled while we
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
  1944
        # were transferring data
21184
28d76afa1568 bundle2: fix raising errors during heads checking
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21182
diff changeset
  1945
        raise error.PushRaced('repository changed while %s - '
28d76afa1568 bundle2: fix raising errors during heads checking
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21182
diff changeset
  1946
                              'please try again' % context)
20968
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  1947
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  1948
def unbundle(repo, cg, heads, source, url):
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  1949
    """Apply a bundle to a repo.
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  1950
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  1951
    this function makes sure the repo is locked during the application and have
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
  1952
    mechanism to check that no push race occurred between the creation of the
20968
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  1953
    bundle and its application.
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  1954
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  1955
    If the push was raced as PushRaced exception is raised."""
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  1956
    r = 0
21061
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
  1957
    # need a transaction when processing a bundle2 stream
26566
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1958
    # [wlock, lock, tr] - needs to be an array so nested functions can modify it
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1959
    lockandtr = [None, None, None]
24847
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
  1960
    recordout = None
24878
e530cde6d115 bundle2: disable ouput capture unless we use http (issue4613 issue4615)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24851
diff changeset
  1961
    # quick fix for output mismatch with bundle2 in 3.4
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33138
diff changeset
  1962
    captureoutput = repo.ui.configbool('experimental', 'bundle2-output-capture')
25423
525fbf24b51b bundle2: stop capturing output for ssh again
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25404
diff changeset
  1963
    if url.startswith('remote:http:') or url.startswith('remote:https:'):
24878
e530cde6d115 bundle2: disable ouput capture unless we use http (issue4613 issue4615)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24851
diff changeset
  1964
        captureoutput = True
20968
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  1965
    try:
30868
847f06179f60 unbundle: add a small comment to clarify the 'check_heads' call
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30685
diff changeset
  1966
        # note: outside bundle1, 'heads' is expected to be empty and this
847f06179f60 unbundle: add a small comment to clarify the 'check_heads' call
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30685
diff changeset
  1967
        # 'check_heads' call wil be a no-op
20968
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  1968
        check_heads(repo, heads, 'uploading changes')
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  1969
        # push can proceed
32891
7e2eb964a561 exchange: switch to usual way of testing for bundle2-ness
Martin von Zweigbergk <martinvonz@google.com>
parents: 32845
diff changeset
  1970
        if not isinstance(cg, bundle2.unbundle20):
30870
c5bee6aa4971 unbundle: swap conditional branches for clarity
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30869
diff changeset
  1971
            # legacy case: bundle1 (changegroup 01)
32927
febd6bfa770d exchange: create transaction for bundle1 unbundling earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 32896
diff changeset
  1972
            txnname = "\n".join([source, util.hidepassword(url)])
32930
af31d531dda0 changegroup: let callers pass in transaction to apply() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32927
diff changeset
  1973
            with repo.lock(), repo.transaction(txnname) as tr:
33043
18c2489ac96d bundle: make applybundle() delegate v1 bundles to applybundle1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33040
diff changeset
  1974
                op = bundle2.applybundle(repo, cg, tr, source, url)
33040
2baef42a2881 bundle: make applybundle1() return a bundleoperation
Martin von Zweigbergk <martinvonz@google.com>
parents: 33039
diff changeset
  1975
                r = bundle2.combinechangegroupresults(op)
30870
c5bee6aa4971 unbundle: swap conditional branches for clarity
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30869
diff changeset
  1976
        else:
24795
f9aa4cb8f2dd bundle2: store the salvaged output on the exception object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24754
diff changeset
  1977
            r = None
21187
bcfd44abad93 bundle2: gracefully handle hook abort
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21184
diff changeset
  1978
            try:
26566
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1979
                def gettransaction():
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1980
                    if not lockandtr[2]:
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1981
                        lockandtr[0] = repo.wlock()
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1982
                        lockandtr[1] = repo.lock()
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1983
                        lockandtr[2] = repo.transaction(source)
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1984
                        lockandtr[2].hookargs['source'] = source
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1985
                        lockandtr[2].hookargs['url'] = url
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1986
                        lockandtr[2].hookargs['bundle2'] = '1'
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1987
                    return lockandtr[2]
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1988
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1989
                # Do greedy locking by default until we're satisfied with lazy
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1990
                # locking.
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1991
                if not repo.ui.configbool('experimental', 'bundle2lazylocking'):
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1992
                    gettransaction()
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1993
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  1994
                op = bundle2.bundleoperation(repo, gettransaction,
24878
e530cde6d115 bundle2: disable ouput capture unless we use http (issue4613 issue4615)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24851
diff changeset
  1995
                                             captureoutput=captureoutput)
24851
df0ce98c882f bundle2: also save output when error happens during part processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24850
diff changeset
  1996
                try:
25896
6805a4f76cda exchange: fix dead assignment
Martin von Zweigbergk <martinvonz@google.com>
parents: 25895
diff changeset
  1997
                    op = bundle2.processbundle(repo, cg, op=op)
24851
df0ce98c882f bundle2: also save output when error happens during part processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24850
diff changeset
  1998
                finally:
df0ce98c882f bundle2: also save output when error happens during part processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24850
diff changeset
  1999
                    r = op.reply
24878
e530cde6d115 bundle2: disable ouput capture unless we use http (issue4613 issue4615)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24851
diff changeset
  2000
                    if captureoutput and r is not None:
24851
df0ce98c882f bundle2: also save output when error happens during part processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24850
diff changeset
  2001
                        repo.ui.pushbuffer(error=True, subproc=True)
df0ce98c882f bundle2: also save output when error happens during part processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24850
diff changeset
  2002
                        def recordout(output):
df0ce98c882f bundle2: also save output when error happens during part processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24850
diff changeset
  2003
                            r.newpart('output', data=output, mandatory=False)
26566
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  2004
                if lockandtr[2] is not None:
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  2005
                    lockandtr[2].close()
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25640
diff changeset
  2006
            except BaseException as exc:
21187
bcfd44abad93 bundle2: gracefully handle hook abort
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21184
diff changeset
  2007
                exc.duringunbundle2 = True
24878
e530cde6d115 bundle2: disable ouput capture unless we use http (issue4613 issue4615)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24851
diff changeset
  2008
                if captureoutput and r is not None:
24847
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
  2009
                    parts = exc._bundle2salvagedoutput = r.salvageoutput()
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
  2010
                    def recordout(output):
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
  2011
                        part = bundle2.bundlepart('output', data=output,
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
  2012
                                                  mandatory=False)
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
  2013
                        parts.append(part)
21187
bcfd44abad93 bundle2: gracefully handle hook abort
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21184
diff changeset
  2014
                raise
20968
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  2015
    finally:
26566
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
  2016
        lockmod.release(lockandtr[2], lockandtr[1], lockandtr[0])
24847
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
  2017
        if recordout is not None:
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
  2018
            recordout(repo.ui.popbuffer())
20968
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
  2019
    return r
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2020
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2021
def _maybeapplyclonebundle(pullop):
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2022
    """Apply a clone bundle from a remote, if possible."""
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2023
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2024
    repo = pullop.repo
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2025
    remote = pullop.remote
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2026
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33138
diff changeset
  2027
    if not repo.ui.configbool('ui', 'clonebundles'):
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2028
        return
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2029
26855
9350f00a7b23 exchange: do not attempt clone bundle if local repo is non-empty (issue4932)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26829
diff changeset
  2030
    # Only run if local repo is empty.
9350f00a7b23 exchange: do not attempt clone bundle if local repo is non-empty (issue4932)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26829
diff changeset
  2031
    if len(repo):
9350f00a7b23 exchange: do not attempt clone bundle if local repo is non-empty (issue4932)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26829
diff changeset
  2032
        return
9350f00a7b23 exchange: do not attempt clone bundle if local repo is non-empty (issue4932)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26829
diff changeset
  2033
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2034
    if pullop.heads:
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2035
        return
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2036
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2037
    if not remote.capable('clonebundles'):
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2038
        return
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2039
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2040
    res = remote._call('clonebundles')
26689
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
  2041
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
  2042
    # If we call the wire protocol command, that's good enough to record the
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
  2043
    # attempt.
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
  2044
    pullop.clonebundleattempted = True
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
  2045
26647
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2046
    entries = parseclonebundlesmanifest(repo, res)
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2047
    if not entries:
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2048
        repo.ui.note(_('no clone bundles available on remote; '
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2049
                       'falling back to regular clone\n'))
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2050
        return
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2051
34364
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2052
    entries = filterclonebundleentries(
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2053
        repo, entries, streamclonerequested=pullop.streamclonerequested)
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2054
26644
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2055
    if not entries:
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2056
        # There is a thundering herd concern here. However, if a server
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2057
        # operator doesn't advertise bundles appropriate for its clients,
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2058
        # they deserve what's coming. Furthermore, from a client's
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2059
        # perspective, no automatic fallback would mean not being able to
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2060
        # clone!
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2061
        repo.ui.warn(_('no compatible clone bundles available on server; '
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2062
                       'falling back to regular clone\n'))
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2063
        repo.ui.warn(_('(you may want to report this to the server '
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2064
                       'operator)\n'))
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2065
        return
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2066
26648
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2067
    entries = sortclonebundleentries(repo.ui, entries)
26644
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2068
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2069
    url = entries[0]['URL']
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2070
    repo.ui.status(_('applying clone bundle from %s\n') % url)
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2071
    if trypullbundlefromurl(repo.ui, repo, url):
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2072
        repo.ui.status(_('finished applying clone bundle\n'))
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2073
    # Bundle failed.
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2074
    #
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2075
    # We abort by default to avoid the thundering herd of
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2076
    # clients flooding a server that was expecting expensive
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2077
    # clone load to be offloaded.
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33138
diff changeset
  2078
    elif repo.ui.configbool('ui', 'clonebundlefallback'):
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2079
        repo.ui.warn(_('falling back to normal clone\n'))
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2080
    else:
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2081
        raise error.Abort(_('error applying bundle'),
26688
7394536338bb exchange: provide hint on how to disable clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26687
diff changeset
  2082
                          hint=_('if this error persists, consider contacting '
7394536338bb exchange: provide hint on how to disable clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26687
diff changeset
  2083
                                 'the server operator or disable clone '
7394536338bb exchange: provide hint on how to disable clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26687
diff changeset
  2084
                                 'bundles via '
27738
a0e783d26e81 exchange: make clone bundles non-experimental and enabled by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27737
diff changeset
  2085
                                 '"--config ui.clonebundles=false"'))
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2086
26647
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2087
def parseclonebundlesmanifest(repo, s):
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2088
    """Parses the raw text of a clone bundles manifest.
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2089
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2090
    Returns a list of dicts. The dicts have a ``URL`` key corresponding
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2091
    to the URL and other keys are the attributes for the entry.
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2092
    """
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2093
    m = []
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2094
    for line in s.splitlines():
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2095
        fields = line.split()
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2096
        if not fields:
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2097
            continue
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2098
        attrs = {'URL': fields[0]}
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2099
        for rawattr in fields[1:]:
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2100
            key, value = rawattr.split('=', 1)
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
  2101
            key = urlreq.unquote(key)
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
  2102
            value = urlreq.unquote(value)
26647
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2103
            attrs[key] = value
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2104
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2105
            # Parse BUNDLESPEC into components. This makes client-side
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2106
            # preferences easier to specify since you can prefer a single
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2107
            # component of the BUNDLESPEC.
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2108
            if key == 'BUNDLESPEC':
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2109
                try:
26759
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
  2110
                    comp, version, params = parsebundlespec(repo, value,
c0f475ac997e exchange: support parameters in bundle specification strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26756
diff changeset
  2111
                                                            externalnames=True)
26647
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2112
                    attrs['COMPRESSION'] = comp
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2113
                    attrs['VERSION'] = version
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2114
                except error.InvalidBundleSpecification:
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2115
                    pass
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2116
                except error.UnsupportedBundleSpecification:
62b0fa0d8787 exchange: extract bundle specification components into own attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26646
diff changeset
  2117
                    pass
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2118
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2119
        m.append(attrs)
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2120
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2121
    return m
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2122
34364
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2123
def filterclonebundleentries(repo, entries, streamclonerequested=False):
26687
6a854f558926 exchange: document filterclonebundleentries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26672
diff changeset
  2124
    """Remove incompatible clone bundle manifest entries.
6a854f558926 exchange: document filterclonebundleentries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26672
diff changeset
  2125
6a854f558926 exchange: document filterclonebundleentries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26672
diff changeset
  2126
    Accepts a list of entries parsed with ``parseclonebundlesmanifest``
6a854f558926 exchange: document filterclonebundleentries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26672
diff changeset
  2127
    and returns a new list consisting of only the entries that this client
6a854f558926 exchange: document filterclonebundleentries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26672
diff changeset
  2128
    should be able to apply.
6a854f558926 exchange: document filterclonebundleentries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26672
diff changeset
  2129
6a854f558926 exchange: document filterclonebundleentries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26672
diff changeset
  2130
    There is no guarantee we'll be able to apply all returned entries because
6a854f558926 exchange: document filterclonebundleentries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26672
diff changeset
  2131
    the metadata we use to filter on may be missing or wrong.
6a854f558926 exchange: document filterclonebundleentries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26672
diff changeset
  2132
    """
26644
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2133
    newentries = []
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2134
    for entry in entries:
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2135
        spec = entry.get('BUNDLESPEC')
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2136
        if spec:
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2137
            try:
34364
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2138
                comp, version, params = parsebundlespec(repo, spec, strict=True)
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2139
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2140
                # If a stream clone was requested, filter out non-streamclone
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2141
                # entries.
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2142
                if streamclonerequested and (comp != 'UN' or version != 's1'):
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2143
                    repo.ui.debug('filtering %s because not a stream clone\n' %
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2144
                                  entry['URL'])
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2145
                    continue
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2146
26644
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2147
            except error.InvalidBundleSpecification as e:
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2148
                repo.ui.debug(str(e) + '\n')
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2149
                continue
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2150
            except error.UnsupportedBundleSpecification as e:
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2151
                repo.ui.debug('filtering %s because unsupported bundle '
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2152
                              'spec: %s\n' % (entry['URL'], str(e)))
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2153
                continue
34364
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2154
        # If we don't have a spec and requested a stream clone, we don't know
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2155
        # what the entry is so don't attempt to apply it.
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2156
        elif streamclonerequested:
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2157
            repo.ui.debug('filtering %s because cannot determine if a stream '
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2158
                          'clone bundle\n' % entry['URL'])
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
  2159
            continue
26644
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2160
26645
2faa7671a4b3 clonebundles: filter on SNI requirement
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26644
diff changeset
  2161
        if 'REQUIRESNI' in entry and not sslutil.hassni:
2faa7671a4b3 clonebundles: filter on SNI requirement
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26644
diff changeset
  2162
            repo.ui.debug('filtering %s because SNI not supported\n' %
2faa7671a4b3 clonebundles: filter on SNI requirement
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26644
diff changeset
  2163
                          entry['URL'])
2faa7671a4b3 clonebundles: filter on SNI requirement
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26644
diff changeset
  2164
            continue
2faa7671a4b3 clonebundles: filter on SNI requirement
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26644
diff changeset
  2165
26644
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2166
        newentries.append(entry)
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2167
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2168
    return newentries
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
  2169
30685
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2170
class clonebundleentry(object):
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2171
    """Represents an item in a clone bundles manifest.
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2172
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2173
    This rich class is needed to support sorting since sorted() in Python 3
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2174
    doesn't support ``cmp`` and our comparison is complex enough that ``key=``
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2175
    won't work.
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2176
    """
26648
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2177
30685
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2178
    def __init__(self, value, prefers):
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2179
        self.value = value
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2180
        self.prefers = prefers
26648
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2181
30685
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2182
    def _cmp(self, other):
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2183
        for prefkey, prefvalue in self.prefers:
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2184
            avalue = self.value.get(prefkey)
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2185
            bvalue = other.value.get(prefkey)
26648
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2186
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2187
            # Special case for b missing attribute and a matches exactly.
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2188
            if avalue is not None and bvalue is None and avalue == prefvalue:
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2189
                return -1
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2190
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2191
            # Special case for a missing attribute and b matches exactly.
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2192
            if bvalue is not None and avalue is None and bvalue == prefvalue:
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2193
                return 1
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2194
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2195
            # We can't compare unless attribute present on both.
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2196
            if avalue is None or bvalue is None:
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2197
                continue
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2198
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2199
            # Same values should fall back to next attribute.
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2200
            if avalue == bvalue:
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2201
                continue
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2202
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2203
            # Exact matches come first.
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2204
            if avalue == prefvalue:
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2205
                return -1
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2206
            if bvalue == prefvalue:
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2207
                return 1
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2208
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2209
            # Fall back to next attribute.
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2210
            continue
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2211
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2212
        # If we got here we couldn't sort by attributes and prefers. Fall
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2213
        # back to index order.
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2214
        return 0
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2215
30685
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2216
    def __lt__(self, other):
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2217
        return self._cmp(other) < 0
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2218
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2219
    def __gt__(self, other):
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2220
        return self._cmp(other) > 0
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2221
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2222
    def __eq__(self, other):
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2223
        return self._cmp(other) == 0
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2224
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2225
    def __le__(self, other):
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2226
        return self._cmp(other) <= 0
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2227
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2228
    def __ge__(self, other):
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2229
        return self._cmp(other) >= 0
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2230
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2231
    def __ne__(self, other):
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2232
        return self._cmp(other) != 0
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2233
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2234
def sortclonebundleentries(ui, entries):
32991
03608e8d09e9 configitems: register 'ui.clonebundleprefers' as example for 'configlist'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32957
diff changeset
  2235
    prefers = ui.configlist('ui', 'clonebundleprefers')
30685
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2236
    if not prefers:
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2237
        return list(entries)
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2238
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2239
    prefers = [p.split('=', 1) for p in prefers]
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2240
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2241
    items = sorted(clonebundleentry(v, prefers) for v in entries)
95325386cd1a exchange: use rich class for sorting clone bundle entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30583
diff changeset
  2242
    return [i.value for i in items]
26648
c347d532bb56 exchange: support sorting URLs by client-side preferences
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26647
diff changeset
  2243
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2244
def trypullbundlefromurl(ui, repo, url):
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2245
    """Attempt to apply a bundle from a URL."""
32843
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
  2246
    with repo.lock(), repo.transaction('bundleurl') as tr:
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2247
        try:
32843
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
  2248
            fh = urlmod.open(ui, url)
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
  2249
            cg = readbundle(ui, fh, 'stream')
26643
d2e16419d3f4 clonebundle: support bundle2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26640
diff changeset
  2250
33043
18c2489ac96d bundle: make applybundle() delegate v1 bundles to applybundle1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33040
diff changeset
  2251
            if isinstance(cg, streamclone.streamcloneapplier):
32843
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
  2252
                cg.apply(repo)
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
  2253
            else:
33043
18c2489ac96d bundle: make applybundle() delegate v1 bundles to applybundle1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33040
diff changeset
  2254
                bundle2.applybundle(repo, cg, tr, 'clonebundles', url)
32843
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
  2255
            return True
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
  2256
        except urlerr.httperror as e:
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
  2257
            ui.warn(_('HTTP error fetching bundle: %s\n') % str(e))
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
  2258
        except urlerr.urlerror as e:
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
  2259
            ui.warn(_('error fetching bundle: %s\n') % e.reason)
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
  2260
32843
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
  2261
        return False