hgext/narrow/narrowbundle2.py
author Martin von Zweigbergk <martinvonz@google.com>
Tue, 02 Oct 2018 09:11:18 -0700
changeset 39986 825a636812a4
parent 39963 fa2395659828
child 40071 8feae5b989bc
permissions -rw-r--r--
narrow: avoid overwriting a variable I don't like to overwrite variables, especially not with a different type (because it makes it harder to explain what the variable is for, and, therefore, to name it well). Differential Revision: https://phab.mercurial-scm.org/D4846
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
     1
# narrowbundle2.py - bundle2 extensions for narrow repository support
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
     2
#
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
     3
# Copyright 2017 Google, Inc.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
     4
#
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
     7
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
     8
from __future__ import absolute_import
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
     9
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    10
import errno
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    11
import struct
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    12
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    13
from mercurial.i18n import _
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    14
from mercurial.node import (
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    15
    bin,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    16
    nullid,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    17
)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    18
from mercurial import (
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    19
    bundle2,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    20
    changegroup,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    21
    error,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    22
    exchange,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    23
    extensions,
39681
c73c7653dfb9 narrow: use diffmatcher to send only new filelogs in non-ellipses widening
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39557
diff changeset
    24
    match as matchmod,
36198
9fd8c2a3db5a narrowspec: move module into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36138
diff changeset
    25
    narrowspec,
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    26
    repair,
38874
a232e6744ba3 narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents: 38848
diff changeset
    27
    repository,
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    28
    util,
37613
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
    29
    wireprototypes,
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    30
)
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36973
diff changeset
    31
from mercurial.utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36973
diff changeset
    32
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36973
diff changeset
    33
)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    34
36124
bc01f48c18cc narrowbundle2: make constants ALLCAPS to be a bit more readable
Augie Fackler <augie@google.com>
parents: 36119
diff changeset
    35
NARROWCAP = 'narrow'
36125
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
    36
_NARROWACL_SECTION = 'narrowhgacl'
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
    37
_CHANGESPECPART = NARROWCAP + ':changespec'
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
    38
_SPECPART = NARROWCAP + ':spec'
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
    39
_SPECPART_INCLUDE = 'include'
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
    40
_SPECPART_EXCLUDE = 'exclude'
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
    41
_KILLNODESIGNAL = 'KILL'
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
    42
_DONESIGNAL = 'DONE'
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
    43
_ELIDEDCSHEADER = '>20s20s20sl' # cset id, p1, p2, len(text)
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
    44
_ELIDEDMFHEADER = '>20s20s20s20sl' # manifest id, p1, p2, link id, len(text)
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
    45
_CSHEADERSIZE = struct.calcsize(_ELIDEDCSHEADER)
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
    46
_MFHEADERSIZE = struct.calcsize(_ELIDEDMFHEADER)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    47
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    48
# When advertising capabilities, always include narrow clone support.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    49
def getrepocaps_narrow(orig, repo, **kwargs):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    50
    caps = orig(repo, **kwargs)
36124
bc01f48c18cc narrowbundle2: make constants ALLCAPS to be a bit more readable
Augie Fackler <augie@google.com>
parents: 36119
diff changeset
    51
    caps[NARROWCAP] = ['v0']
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    52
    return caps
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    53
39963
fa2395659828 narrow: pass 'narrow_widen' as source while generating changegroup
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39962
diff changeset
    54
def widen_bundle(repo, diffmatcher, common, known, cgversion, ellipses):
39962
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    55
    """generates changegroup for widening a narrow clone
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    56
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    57
    repo is the localrepository instance
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    58
    diffmatcher is a differencemacther of '(newincludes, newexcludes) -
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    59
    (oldincludes, oldexcludes)'
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    60
    common is set of common revs between server and client
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    61
    known is a set of revs known on the client side (used in ellipses)
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    62
    cgversion is the changegroup version to send
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    63
    ellipses is boolean value telling whether to send ellipses data or not
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    64
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    65
    returns changegroup data of the changegroup built or return None if there
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    66
    are no common revs
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    67
    """
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    68
    # XXX: This patch will start sending bundle2 after couple of patches when
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    69
    # called from the wireprotocol command
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    70
    commonnodes = set()
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    71
    cl = repo.changelog
39986
825a636812a4 narrow: avoid overwriting a variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 39963
diff changeset
    72
    for r in repo.revs("::%ln", common):
825a636812a4 narrow: avoid overwriting a variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 39963
diff changeset
    73
        commonnodes.add(cl.node(r))
39962
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    74
    if commonnodes:
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    75
        # XXX: we should only send the filelogs (and treemanifest). user
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    76
        # already has the changelog and manifest
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    77
        packer = changegroup.getbundler(cgversion, repo,
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    78
                                        filematcher=diffmatcher,
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    79
                                        fullnodes=commonnodes)
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    80
        cgdata = packer.generate(set([nullid]), list(commonnodes), False,
39963
fa2395659828 narrow: pass 'narrow_widen' as source while generating changegroup
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39962
diff changeset
    81
                                 'narrow_widen', changelog=False)
39962
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    82
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    83
        return cgdata
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    84
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    85
    return None
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
    86
39391
3433e8f39905 narrow: rename getbundlechangegrouppart_nonellipsis function
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39383
diff changeset
    87
def getbundlechangegrouppart_widen(bundler, repo, source, bundlecaps=None,
3433e8f39905 narrow: rename getbundlechangegrouppart_nonellipsis function
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39383
diff changeset
    88
                                   b2caps=None, heads=None, common=None,
3433e8f39905 narrow: rename getbundlechangegrouppart_nonellipsis function
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39383
diff changeset
    89
                                   **kwargs):
39383
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
    90
    """Handling changegroup changegroup generation on the server when user
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
    91
    is widening their narrowspec"""
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
    92
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
    93
    cgversions = b2caps.get('changegroup')
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
    94
    if cgversions:  # 3.1 and 3.2 ship with an empty value
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
    95
        cgversions = [v for v in cgversions
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
    96
                      if v in changegroup.supportedoutgoingversions(repo)]
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
    97
        if not cgversions:
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
    98
            raise ValueError(_('no common changegroup version'))
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
    99
        version = max(cgversions)
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   100
    else:
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   101
        raise ValueError(_("server does not advertise changegroup version,"
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   102
                           " can't negotiate support for ellipsis nodes"))
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   103
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   104
    include = sorted(filter(bool, kwargs.get(r'includepats', [])))
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   105
    exclude = sorted(filter(bool, kwargs.get(r'excludepats', [])))
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   106
    newmatch = narrowspec.match(repo.root, include=include, exclude=exclude)
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   107
    oldinclude = sorted(filter(bool, kwargs.get(r'oldincludepats', [])))
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   108
    oldexclude = sorted(filter(bool, kwargs.get(r'oldexcludepats', [])))
39681
c73c7653dfb9 narrow: use diffmatcher to send only new filelogs in non-ellipses widening
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39557
diff changeset
   109
    oldmatch = narrowspec.match(repo.root, include=oldinclude,
c73c7653dfb9 narrow: use diffmatcher to send only new filelogs in non-ellipses widening
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39557
diff changeset
   110
                                exclude=oldexclude)
c73c7653dfb9 narrow: use diffmatcher to send only new filelogs in non-ellipses widening
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39557
diff changeset
   111
    diffmatch = matchmod.differencematcher(newmatch, oldmatch)
39383
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   112
    common = set(common or [nullid])
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   113
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   114
    if (oldinclude != include or oldexclude != exclude):
39963
fa2395659828 narrow: pass 'narrow_widen' as source while generating changegroup
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39962
diff changeset
   115
        cgdata = widen_bundle(repo, diffmatch, common, [], version, False)
39962
ad9ca365738b narrow: factor out logic to create cg while widening into separate fn
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39689
diff changeset
   116
        if cgdata is not None:
39383
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   117
            part = bundler.newpart('changegroup', data=cgdata)
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   118
            part.addparam('version', version)
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   119
            if 'treemanifest' in repo.requirements:
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   120
                part.addparam('treemanifest', '1')
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   121
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   122
# Serve a changegroup for a client with a narrow clone.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   123
def getbundlechangegrouppart_narrow(bundler, repo, source,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   124
                                    bundlecaps=None, b2caps=None, heads=None,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   125
                                    common=None, **kwargs):
38848
d99083996398 exchange: move simple narrow changegroup generation from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38847
diff changeset
   126
    assert repo.ui.configbool('experimental', 'narrowservebrokenellipses')
d99083996398 exchange: move simple narrow changegroup generation from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38847
diff changeset
   127
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   128
    cgversions = b2caps.get('changegroup')
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   129
    if cgversions:  # 3.1 and 3.2 ship with an empty value
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   130
        cgversions = [v for v in cgversions
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   131
                      if v in changegroup.supportedoutgoingversions(repo)]
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   132
        if not cgversions:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   133
            raise ValueError(_('no common changegroup version'))
36387
0d5eaa97676b narrowbundle2: drop legacy getcgkwargs variable
Augie Fackler <augie@google.com>
parents: 36382
diff changeset
   134
        version = max(cgversions)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   135
    else:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   136
        raise ValueError(_("server does not advertise changegroup version,"
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   137
                           " can't negotiate support for ellipsis nodes"))
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   138
36388
cd4f13f1ea2f narrowbundle2: use native string to get kwargs from dict
Augie Fackler <augie@google.com>
parents: 36387
diff changeset
   139
    include = sorted(filter(bool, kwargs.get(r'includepats', [])))
cd4f13f1ea2f narrowbundle2: use native string to get kwargs from dict
Augie Fackler <augie@google.com>
parents: 36387
diff changeset
   140
    exclude = sorted(filter(bool, kwargs.get(r'excludepats', [])))
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   141
    newmatch = narrowspec.match(repo.root, include=include, exclude=exclude)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   142
36390
adce75cdf8f8 narrowbundle2: more kwargs native string fixes
Augie Fackler <augie@google.com>
parents: 36388
diff changeset
   143
    depth = kwargs.get(r'depth', None)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   144
    if depth is not None:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   145
        depth = int(depth)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   146
        if depth < 1:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   147
            raise error.Abort(_('depth must be positive, got %d') % depth)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   148
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   149
    heads = set(heads or repo.heads())
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   150
    common = set(common or [nullid])
36390
adce75cdf8f8 narrowbundle2: more kwargs native string fixes
Augie Fackler <augie@google.com>
parents: 36388
diff changeset
   151
    oldinclude = sorted(filter(bool, kwargs.get(r'oldincludepats', [])))
adce75cdf8f8 narrowbundle2: more kwargs native string fixes
Augie Fackler <augie@google.com>
parents: 36388
diff changeset
   152
    oldexclude = sorted(filter(bool, kwargs.get(r'oldexcludepats', [])))
adce75cdf8f8 narrowbundle2: more kwargs native string fixes
Augie Fackler <augie@google.com>
parents: 36388
diff changeset
   153
    known = {bin(n) for n in kwargs.get(r'known', [])}
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   154
    if known and (oldinclude != include or oldexclude != exclude):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   155
        # Steps:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   156
        # 1. Send kill for "$known & ::common"
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   157
        #
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   158
        # 2. Send changegroup for ::common
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   159
        #
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   160
        # 3. Proceed.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   161
        #
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   162
        # In the future, we can send kills for only the specific
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   163
        # nodes we know should go away or change shape, and then
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   164
        # send a data stream that tells the client something like this:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   165
        #
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   166
        # a) apply this changegroup
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   167
        # b) apply nodes XXX, YYY, ZZZ that you already have
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   168
        # c) goto a
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   169
        #
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   170
        # until they've built up the full new state.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   171
        # Convert to revnums and intersect with "common". The client should
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   172
        # have made it a subset of "common" already, but let's be safe.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   173
        known = set(repo.revs("%ln & ::%ln", known, common))
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   174
        # TODO: we could send only roots() of this set, and the
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   175
        # list of nodes in common, and the client could work out
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   176
        # what to strip, instead of us explicitly sending every
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   177
        # single node.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   178
        deadrevs = known
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   179
        def genkills():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   180
            for r in deadrevs:
36125
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
   181
                yield _KILLNODESIGNAL
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   182
                yield repo.changelog.node(r)
36125
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
   183
            yield _DONESIGNAL
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
   184
        bundler.newpart(_CHANGESPECPART, data=genkills())
38831
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38830
diff changeset
   185
        newvisit, newfull, newellipsis = exchange._computeellipsis(
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   186
            repo, set(), common, known, newmatch)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   187
        if newvisit:
38949
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   188
            packer = changegroup.getbundler(version, repo,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   189
                                            filematcher=newmatch,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   190
                                            ellipses=True,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   191
                                            shallow=depth is not None,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   192
                                            ellipsisroots=newellipsis,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   193
                                            fullnodes=newfull)
39963
fa2395659828 narrow: pass 'narrow_widen' as source while generating changegroup
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39962
diff changeset
   194
            cgdata = packer.generate(common, newvisit, False, 'narrow_widen')
38949
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   195
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   196
            part = bundler.newpart('changegroup', data=cgdata)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   197
            part.addparam('version', version)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   198
            if 'treemanifest' in repo.requirements:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   199
                part.addparam('treemanifest', '1')
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   200
38831
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38830
diff changeset
   201
    visitnodes, relevant_nodes, ellipsisroots = exchange._computeellipsis(
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   202
        repo, common, heads, set(), newmatch, depth=depth)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   203
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   204
    repo.ui.debug('Found %d relevant revs\n' % len(relevant_nodes))
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   205
    if visitnodes:
38949
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   206
        packer = changegroup.getbundler(version, repo,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   207
                                        filematcher=newmatch,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   208
                                        ellipses=True,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   209
                                        shallow=depth is not None,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   210
                                        ellipsisroots=ellipsisroots,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   211
                                        fullnodes=relevant_nodes)
39963
fa2395659828 narrow: pass 'narrow_widen' as source while generating changegroup
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39962
diff changeset
   212
        cgdata = packer.generate(common, visitnodes, False, 'narrow_widen')
38949
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   213
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38923
diff changeset
   214
        part = bundler.newpart('changegroup', data=cgdata)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   215
        part.addparam('version', version)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   216
        if 'treemanifest' in repo.requirements:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   217
            part.addparam('treemanifest', '1')
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   218
36125
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
   219
@bundle2.parthandler(_SPECPART, (_SPECPART_INCLUDE, _SPECPART_EXCLUDE))
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   220
def _handlechangespec_2(op, inpart):
36125
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
   221
    includepats = set(inpart.params.get(_SPECPART_INCLUDE, '').splitlines())
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
   222
    excludepats = set(inpart.params.get(_SPECPART_EXCLUDE, '').splitlines())
39557
ce20caecacbd narrow: validate patterns on incoming bundle2 part
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
   223
    narrowspec.validatepatterns(includepats)
ce20caecacbd narrow: validate patterns on incoming bundle2 part
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
   224
    narrowspec.validatepatterns(excludepats)
ce20caecacbd narrow: validate patterns on incoming bundle2 part
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
   225
38874
a232e6744ba3 narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents: 38848
diff changeset
   226
    if not repository.NARROW_REQUIREMENT in op.repo.requirements:
a232e6744ba3 narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents: 38848
diff changeset
   227
        op.repo.requirements.add(repository.NARROW_REQUIREMENT)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   228
        op.repo._writerequirements()
36499
28c7f580360b narrow: reduce depedence on narrowspec.save()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36494
diff changeset
   229
    op.repo.setnarrowpats(includepats, excludepats)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   230
36125
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
   231
@bundle2.parthandler(_CHANGESPECPART)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   232
def _handlechangespec(op, inpart):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   233
    repo = op.repo
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   234
    cl = repo.changelog
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   235
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   236
    # changesets which need to be stripped entirely. either they're no longer
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   237
    # needed in the new narrow spec, or the server is sending a replacement
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   238
    # in the changegroup part.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   239
    clkills = set()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   240
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   241
    # A changespec part contains all the updates to ellipsis nodes
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   242
    # that will happen as a result of widening or narrowing a
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   243
    # repo. All the changes that this block encounters are ellipsis
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   244
    # nodes or flags to kill an existing ellipsis.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   245
    chunksignal = changegroup.readexactly(inpart, 4)
36125
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
   246
    while chunksignal != _DONESIGNAL:
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
   247
        if chunksignal == _KILLNODESIGNAL:
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   248
            # a node used to be an ellipsis but isn't anymore
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   249
            ck = changegroup.readexactly(inpart, 20)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   250
            if cl.hasnode(ck):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   251
                clkills.add(ck)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   252
        else:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   253
            raise error.Abort(
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   254
                _('unexpected changespec node chunk type: %s') % chunksignal)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   255
        chunksignal = changegroup.readexactly(inpart, 4)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   256
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   257
    if clkills:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   258
        # preserve bookmarks that repair.strip() would otherwise strip
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   259
        bmstore = repo._bookmarks
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   260
        class dummybmstore(dict):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   261
            def applychanges(self, repo, tr, changes):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   262
                pass
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   263
            def recordchange(self, tr): # legacy version
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   264
                pass
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   265
        repo._bookmarks = dummybmstore()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   266
        chgrpfile = repair.strip(op.ui, repo, list(clkills), backup=True,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   267
                                 topic='widen')
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   268
        repo._bookmarks = bmstore
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   269
        if chgrpfile:
38531
1ad873c3e4a4 narrowbundle2: when we handle a widen, mark the operation as unsafe
Augie Fackler <augie@google.com>
parents: 37613
diff changeset
   270
            op._widen_uninterr = repo.ui.uninterruptable()
1ad873c3e4a4 narrowbundle2: when we handle a widen, mark the operation as unsafe
Augie Fackler <augie@google.com>
parents: 37613
diff changeset
   271
            op._widen_uninterr.__enter__()
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   272
            # presence of _widen_bundle attribute activates widen handler later
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   273
            op._widen_bundle = chgrpfile
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   274
    # Set the new narrowspec if we're widening. The setnewnarrowpats() method
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   275
    # will currently always be there when using the core+narrowhg server, but
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   276
    # other servers may include a changespec part even when not widening (e.g.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   277
    # because we're deepening a shallow repo).
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   278
    if util.safehasattr(repo, 'setnewnarrowpats'):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   279
        repo.setnewnarrowpats()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   280
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   281
def handlechangegroup_widen(op, inpart):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   282
    """Changegroup exchange handler which restores temporarily-stripped nodes"""
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   283
    # We saved a bundle with stripped node data we must now restore.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   284
    # This approach is based on mercurial/repair.py@6ee26a53c111.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   285
    repo = op.repo
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   286
    ui = op.ui
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   287
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   288
    chgrpfile = op._widen_bundle
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   289
    del op._widen_bundle
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   290
    vfs = repo.vfs
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   291
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   292
    ui.note(_("adding branch\n"))
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   293
    f = vfs.open(chgrpfile, "rb")
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   294
    try:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   295
        gen = exchange.readbundle(ui, f, chgrpfile, vfs)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   296
        if not ui.verbose:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   297
            # silence internal shuffling chatter
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   298
            ui.pushbuffer()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   299
        if isinstance(gen, bundle2.unbundle20):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   300
            with repo.transaction('strip') as tr:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   301
                bundle2.processbundle(repo, gen, lambda: tr)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   302
        else:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   303
            gen.apply(repo, 'strip', 'bundle:' + vfs.join(chgrpfile), True)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   304
        if not ui.verbose:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   305
            ui.popbuffer()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   306
    finally:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   307
        f.close()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   308
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   309
    # remove undo files
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   310
    for undovfs, undofile in repo.undofiles():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   311
        try:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   312
            undovfs.unlink(undofile)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   313
        except OSError as e:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   314
            if e.errno != errno.ENOENT:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   315
                ui.warn(_('error removing %s: %s\n') %
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36973
diff changeset
   316
                        (undovfs.join(undofile), stringutil.forcebytestr(e)))
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   317
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   318
    # Remove partial backup only if there were no exceptions
38531
1ad873c3e4a4 narrowbundle2: when we handle a widen, mark the operation as unsafe
Augie Fackler <augie@google.com>
parents: 37613
diff changeset
   319
    op._widen_uninterr.__exit__(None, None, None)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   320
    vfs.unlink(chgrpfile)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   321
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   322
def setup():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   323
    """Enable narrow repo support in bundle2-related extension points."""
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   324
    extensions.wrapfunction(bundle2, 'getrepocaps', getrepocaps_narrow)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   325
37613
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
   326
    getbundleargs = wireprototypes.GETBUNDLE_ARGUMENTS
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
   327
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
   328
    getbundleargs['narrow'] = 'boolean'
39383
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   329
    getbundleargs['widen'] = 'boolean'
37613
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
   330
    getbundleargs['depth'] = 'plain'
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
   331
    getbundleargs['oldincludepats'] = 'csv'
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
   332
    getbundleargs['oldexcludepats'] = 'csv'
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
   333
    getbundleargs['includepats'] = 'csv'
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
   334
    getbundleargs['excludepats'] = 'csv'
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
   335
    getbundleargs['known'] = 'csv'
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   336
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   337
    # Extend changegroup serving to handle requests from narrow clients.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   338
    origcgfn = exchange.getbundle2partsmapping['changegroup']
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   339
    def wrappedcgfn(*args, **kwargs):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   340
        repo = args[1]
36125
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36124
diff changeset
   341
        if repo.ui.has_section(_NARROWACL_SECTION):
38847
98df52d5042c exchange: make narrow ACL presence imply narrow=True
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38834
diff changeset
   342
            kwargs = exchange.applynarrowacl(repo, kwargs)
98df52d5042c exchange: make narrow ACL presence imply narrow=True
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38834
diff changeset
   343
38848
d99083996398 exchange: move simple narrow changegroup generation from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38847
diff changeset
   344
        if (kwargs.get(r'narrow', False) and
d99083996398 exchange: move simple narrow changegroup generation from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38847
diff changeset
   345
            repo.ui.configbool('experimental', 'narrowservebrokenellipses')):
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   346
            getbundlechangegrouppart_narrow(*args, **kwargs)
39383
c8e4eae84808 narrow: add server logic to send cg while widening without ellipsis
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38949
diff changeset
   347
        elif kwargs.get(r'widen', False) and kwargs.get(r'narrow', False):
39391
3433e8f39905 narrow: rename getbundlechangegrouppart_nonellipsis function
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39383
diff changeset
   348
            getbundlechangegrouppart_widen(*args, **kwargs)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   349
        else:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   350
            origcgfn(*args, **kwargs)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   351
    exchange.getbundle2partsmapping['changegroup'] = wrappedcgfn
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   352
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   353
    # Extend changegroup receiver so client can fixup after widen requests.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   354
    origcghandler = bundle2.parthandlermapping['changegroup']
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   355
    def wrappedcghandler(op, inpart):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   356
        origcghandler(op, inpart)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   357
        if util.safehasattr(op, '_widen_bundle'):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   358
            handlechangegroup_widen(op, inpart)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   359
    wrappedcghandler.params = origcghandler.params
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   360
    bundle2.parthandlermapping['changegroup'] = wrappedcghandler