hgext/narrow/narrowbundle2.py
author Pulkit Goyal <7895pulkit@gmail.com>
Tue, 21 May 2019 05:32:14 +0530
changeset 42366 21e77ede77ab
parent 42365 92f584065b4f
child 42368 f66628c15e6f
permissions -rw-r--r--
narrow: factor out logic to build ellipses related b2parts in separate fn This will help us switch more cleanly to using wireprotocol commands instead of using exchange.pull() which exchanges more things then required. Differential Revision: https://phab.mercurial-scm.org/D6435
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36079
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,
40868
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
    23
    localrepo,
36160
9fd8c2a3db5a narrowspec: move module into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36100
diff changeset
    24
    narrowspec,
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    25
    repair,
38835
a232e6744ba3 narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents: 38808
diff changeset
    26
    repository,
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    27
    util,
37613
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
    28
    wireprototypes,
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    29
)
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36967
diff changeset
    30
from mercurial.utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36967
diff changeset
    31
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36967
diff changeset
    32
)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    33
42209
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
    34
_NARROWACL_SECTION = 'narrowacl'
40755
e3792741e3fb narrow: drop the bundle2 capability since we have server capabilities (BC)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40492
diff changeset
    35
_CHANGESPECPART = 'narrow:changespec'
42209
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
    36
_RESSPECS = 'narrow:responsespec'
40755
e3792741e3fb narrow: drop the bundle2 capability since we have server capabilities (BC)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40492
diff changeset
    37
_SPECPART = 'narrow:spec'
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
    38
_SPECPART_INCLUDE = 'include'
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
    39
_SPECPART_EXCLUDE = 'exclude'
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
    40
_KILLNODESIGNAL = 'KILL'
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
    41
_DONESIGNAL = 'DONE'
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
    42
_ELIDEDCSHEADER = '>20s20s20sl' # cset id, p1, p2, len(text)
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
    43
_ELIDEDMFHEADER = '>20s20s20s20sl' # manifest id, p1, p2, link id, len(text)
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
    44
_CSHEADERSIZE = struct.calcsize(_ELIDEDCSHEADER)
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
    45
_MFHEADERSIZE = struct.calcsize(_ELIDEDMFHEADER)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    46
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    47
# 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
    48
def getbundlechangegrouppart_narrow(bundler, repo, source,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    49
                                    bundlecaps=None, b2caps=None, heads=None,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    50
                                    common=None, **kwargs):
38808
d99083996398 exchange: move simple narrow changegroup generation from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38807
diff changeset
    51
    assert repo.ui.configbool('experimental', 'narrowservebrokenellipses')
d99083996398 exchange: move simple narrow changegroup generation from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38807
diff changeset
    52
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    53
    cgversions = b2caps.get('changegroup')
42365
92f584065b4f narrow: remove unrequired compat code for old versions of hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42209
diff changeset
    54
    cgversions = [v for v in cgversions
92f584065b4f narrow: remove unrequired compat code for old versions of hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42209
diff changeset
    55
                  if v in changegroup.supportedoutgoingversions(repo)]
92f584065b4f narrow: remove unrequired compat code for old versions of hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42209
diff changeset
    56
    if not cgversions:
92f584065b4f narrow: remove unrequired compat code for old versions of hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42209
diff changeset
    57
        raise ValueError(_('no common changegroup version'))
92f584065b4f narrow: remove unrequired compat code for old versions of hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42209
diff changeset
    58
    version = max(cgversions)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    59
42366
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    60
    oldinclude = sorted(filter(bool, kwargs.get(r'oldincludepats', [])))
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    61
    oldexclude = sorted(filter(bool, kwargs.get(r'oldexcludepats', [])))
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    62
    newinclude = sorted(filter(bool, kwargs.get(r'includepats', [])))
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    63
    newexclude = sorted(filter(bool, kwargs.get(r'excludepats', [])))
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    64
    generateellipsesbundle2(bundler, repo, oldinclude, oldexclude, newinclude,
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    65
            newexclude, version, common, kwargs.get('known', []),
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    66
            kwargs.get(r'depth', None), heads)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    67
42366
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    68
def generateellipsesbundle2(bundler, repo, oldinclude, oldexclude, newinclude,
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    69
                            newexclude, version, common, known, depth, heads):
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    70
    newmatch = narrowspec.match(repo.root, include=newinclude,
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    71
                                exclude=newexclude)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    72
    if depth is not None:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    73
        depth = int(depth)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    74
        if depth < 1:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    75
            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
    76
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    77
    heads = set(heads or repo.heads())
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    78
    common = set(common or [nullid])
42366
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    79
    known = {bin(n) for n in known}
21e77ede77ab narrow: factor out logic to build ellipses related b2parts in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42365
diff changeset
    80
    if known and (oldinclude != newinclude or oldexclude != newexclude):
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    81
        # Steps:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    82
        # 1. Send kill for "$known & ::common"
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    83
        #
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    84
        # 2. Send changegroup for ::common
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    85
        #
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    86
        # 3. Proceed.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    87
        #
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    88
        # 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
    89
        # 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
    90
        # 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
    91
        #
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    92
        # a) apply this changegroup
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    93
        # 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
    94
        # c) goto a
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    95
        #
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    96
        # 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
    97
        # 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
    98
        # 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
    99
        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
   100
        # 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
   101
        # 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
   102
        # 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
   103
        # single node.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   104
        deadrevs = known
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   105
        def genkills():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   106
            for r in deadrevs:
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   107
                yield _KILLNODESIGNAL
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   108
                yield repo.changelog.node(r)
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   109
            yield _DONESIGNAL
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   110
        bundler.newpart(_CHANGESPECPART, data=genkills())
38791
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
   111
        newvisit, newfull, newellipsis = exchange._computeellipsis(
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   112
            repo, set(), common, known, newmatch)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   113
        if newvisit:
38910
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   114
            packer = changegroup.getbundler(version, repo,
40344
2c5835b4246b narrow: when widening, don't include manifests the client already has
Martin von Zweigbergk <martinvonz@google.com>
parents: 40072
diff changeset
   115
                                            matcher=newmatch,
38910
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   116
                                            ellipses=True,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   117
                                            shallow=depth is not None,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   118
                                            ellipsisroots=newellipsis,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   119
                                            fullnodes=newfull)
39962
fa2395659828 narrow: pass 'narrow_widen' as source while generating changegroup
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39961
diff changeset
   120
            cgdata = packer.generate(common, newvisit, False, 'narrow_widen')
38910
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   121
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   122
            part = bundler.newpart('changegroup', data=cgdata)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   123
            part.addparam('version', version)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   124
            if 'treemanifest' in repo.requirements:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   125
                part.addparam('treemanifest', '1')
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   126
38791
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
   127
    visitnodes, relevant_nodes, ellipsisroots = exchange._computeellipsis(
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   128
        repo, common, heads, set(), newmatch, depth=depth)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   129
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   130
    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
   131
    if visitnodes:
38910
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   132
        packer = changegroup.getbundler(version, repo,
40344
2c5835b4246b narrow: when widening, don't include manifests the client already has
Martin von Zweigbergk <martinvonz@google.com>
parents: 40072
diff changeset
   133
                                        matcher=newmatch,
38910
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   134
                                        ellipses=True,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   135
                                        shallow=depth is not None,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   136
                                        ellipsisroots=ellipsisroots,
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   137
                                        fullnodes=relevant_nodes)
39962
fa2395659828 narrow: pass 'narrow_widen' as source while generating changegroup
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39961
diff changeset
   138
        cgdata = packer.generate(common, visitnodes, False, 'narrow_widen')
38910
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   139
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   140
        part = bundler.newpart('changegroup', data=cgdata)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   141
        part.addparam('version', version)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   142
        if 'treemanifest' in repo.requirements:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   143
            part.addparam('treemanifest', '1')
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   144
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   145
@bundle2.parthandler(_SPECPART, (_SPECPART_INCLUDE, _SPECPART_EXCLUDE))
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   146
def _handlechangespec_2(op, inpart):
42209
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   147
    # XXX: This bundle2 handling is buggy and should be removed after hg5.2 is
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   148
    # released. New servers will send a mandatory bundle2 part named
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   149
    # 'Narrowspec' and will send specs as data instead of params.
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   150
    # Refer to issue5952 and 6019
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   151
    includepats = set(inpart.params.get(_SPECPART_INCLUDE, '').splitlines())
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   152
    excludepats = set(inpart.params.get(_SPECPART_EXCLUDE, '').splitlines())
39540
ce20caecacbd narrow: validate patterns on incoming bundle2 part
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39529
diff changeset
   153
    narrowspec.validatepatterns(includepats)
ce20caecacbd narrow: validate patterns on incoming bundle2 part
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39529
diff changeset
   154
    narrowspec.validatepatterns(excludepats)
ce20caecacbd narrow: validate patterns on incoming bundle2 part
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39529
diff changeset
   155
38835
a232e6744ba3 narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents: 38808
diff changeset
   156
    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: 38808
diff changeset
   157
        op.repo.requirements.add(repository.NARROW_REQUIREMENT)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   158
        op.repo._writerequirements()
36469
28c7f580360b narrow: reduce depedence on narrowspec.save()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36464
diff changeset
   159
    op.repo.setnarrowpats(includepats, excludepats)
41236
44a51c1c8e17 narrow: move copytonarrowspec() out of setnarrowpats()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41076
diff changeset
   160
    narrowspec.copytoworkingcopy(op.repo)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   161
42209
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   162
@bundle2.parthandler(_RESSPECS)
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   163
def _handlenarrowspecs(op, inpart):
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   164
    data = inpart.read()
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   165
    inc, exc = data.split('\0')
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   166
    includepats = set(inc.splitlines())
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   167
    excludepats = set(exc.splitlines())
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   168
    narrowspec.validatepatterns(includepats)
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   169
    narrowspec.validatepatterns(excludepats)
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   170
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   171
    if repository.NARROW_REQUIREMENT not in op.repo.requirements:
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   172
        op.repo.requirements.add(repository.NARROW_REQUIREMENT)
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   173
        op.repo._writerequirements()
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   174
    op.repo.setnarrowpats(includepats, excludepats)
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   175
    narrowspec.copytoworkingcopy(op.repo)
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   176
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   177
@bundle2.parthandler(_CHANGESPECPART)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   178
def _handlechangespec(op, inpart):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   179
    repo = op.repo
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   180
    cl = repo.changelog
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   181
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   182
    # 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
   183
    # 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
   184
    # in the changegroup part.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   185
    clkills = set()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   186
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   187
    # 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
   188
    # 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
   189
    # 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
   190
    # 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
   191
    chunksignal = changegroup.readexactly(inpart, 4)
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   192
    while chunksignal != _DONESIGNAL:
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   193
        if chunksignal == _KILLNODESIGNAL:
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   194
            # 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
   195
            ck = changegroup.readexactly(inpart, 20)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   196
            if cl.hasnode(ck):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   197
                clkills.add(ck)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   198
        else:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   199
            raise error.Abort(
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   200
                _('unexpected changespec node chunk type: %s') % chunksignal)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   201
        chunksignal = changegroup.readexactly(inpart, 4)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   202
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   203
    if clkills:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   204
        # preserve bookmarks that repair.strip() would otherwise strip
40868
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
   205
        op._bookmarksbackup = repo._bookmarks
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   206
        class dummybmstore(dict):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   207
            def applychanges(self, repo, tr, changes):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   208
                pass
40868
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
   209
        localrepo.localrepository._bookmarks.set(repo, dummybmstore())
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   210
        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
   211
                                 topic='widen')
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   212
        if chgrpfile:
41076
8ecb17b7f432 procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents: 40868
diff changeset
   213
            op._widen_uninterr = repo.ui.uninterruptible()
38529
1ad873c3e4a4 narrowbundle2: when we handle a widen, mark the operation as unsafe
Augie Fackler <augie@google.com>
parents: 37613
diff changeset
   214
            op._widen_uninterr.__enter__()
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   215
            # 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
   216
            op._widen_bundle = chgrpfile
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   217
    # 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
   218
    # 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
   219
    # 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
   220
    # because we're deepening a shallow repo).
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   221
    if util.safehasattr(repo, 'setnewnarrowpats'):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   222
        repo.setnewnarrowpats()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   223
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   224
def handlechangegroup_widen(op, inpart):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   225
    """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
   226
    # 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
   227
    # 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
   228
    repo = op.repo
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   229
    ui = op.ui
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   230
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   231
    chgrpfile = op._widen_bundle
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   232
    del op._widen_bundle
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   233
    vfs = repo.vfs
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   234
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   235
    ui.note(_("adding branch\n"))
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   236
    f = vfs.open(chgrpfile, "rb")
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   237
    try:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   238
        gen = exchange.readbundle(ui, f, chgrpfile, vfs)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   239
        if not ui.verbose:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   240
            # silence internal shuffling chatter
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   241
            ui.pushbuffer()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   242
        if isinstance(gen, bundle2.unbundle20):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   243
            with repo.transaction('strip') as tr:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   244
                bundle2.processbundle(repo, gen, lambda: tr)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   245
        else:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   246
            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
   247
        if not ui.verbose:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   248
            ui.popbuffer()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   249
    finally:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   250
        f.close()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   251
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   252
    # remove undo files
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   253
    for undovfs, undofile in repo.undofiles():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   254
        try:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   255
            undovfs.unlink(undofile)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   256
        except OSError as e:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   257
            if e.errno != errno.ENOENT:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   258
                ui.warn(_('error removing %s: %s\n') %
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36967
diff changeset
   259
                        (undovfs.join(undofile), stringutil.forcebytestr(e)))
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   260
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   261
    # Remove partial backup only if there were no exceptions
38529
1ad873c3e4a4 narrowbundle2: when we handle a widen, mark the operation as unsafe
Augie Fackler <augie@google.com>
parents: 37613
diff changeset
   262
    op._widen_uninterr.__exit__(None, None, None)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   263
    vfs.unlink(chgrpfile)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   264
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   265
def setup():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   266
    """Enable narrow repo support in bundle2-related extension points."""
37613
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
   267
    getbundleargs = wireprototypes.GETBUNDLE_ARGUMENTS
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
   268
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
   269
    getbundleargs['narrow'] = 'boolean'
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
   270
    getbundleargs['depth'] = 'plain'
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
   271
    getbundleargs['oldincludepats'] = 'csv'
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
   272
    getbundleargs['oldexcludepats'] = 'csv'
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
   273
    getbundleargs['known'] = 'csv'
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   274
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   275
    # 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
   276
    origcgfn = exchange.getbundle2partsmapping['changegroup']
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   277
    def wrappedcgfn(*args, **kwargs):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   278
        repo = args[1]
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   279
        if repo.ui.has_section(_NARROWACL_SECTION):
38807
98df52d5042c exchange: make narrow ACL presence imply narrow=True
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38794
diff changeset
   280
            kwargs = exchange.applynarrowacl(repo, kwargs)
98df52d5042c exchange: make narrow ACL presence imply narrow=True
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38794
diff changeset
   281
38808
d99083996398 exchange: move simple narrow changegroup generation from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38807
diff changeset
   282
        if (kwargs.get(r'narrow', False) and
d99083996398 exchange: move simple narrow changegroup generation from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38807
diff changeset
   283
            repo.ui.configbool('experimental', 'narrowservebrokenellipses')):
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   284
            getbundlechangegrouppart_narrow(*args, **kwargs)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   285
        else:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   286
            origcgfn(*args, **kwargs)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   287
    exchange.getbundle2partsmapping['changegroup'] = wrappedcgfn
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   288
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   289
    # 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
   290
    origcghandler = bundle2.parthandlermapping['changegroup']
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   291
    def wrappedcghandler(op, inpart):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   292
        origcghandler(op, inpart)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   293
        if util.safehasattr(op, '_widen_bundle'):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   294
            handlechangegroup_widen(op, inpart)
40868
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
   295
        if util.safehasattr(op, '_bookmarksbackup'):
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
   296
            localrepo.localrepository._bookmarks.set(op.repo,
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
   297
                                                     op._bookmarksbackup)
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
   298
            del op._bookmarksbackup
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
   299
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   300
    wrappedcghandler.params = origcghandler.params
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   301
    bundle2.parthandlermapping['changegroup'] = wrappedcghandler