hgext/narrow/narrowbundle2.py
author Joerg Sonnenberger <joerg@bec.de>
Mon, 29 Mar 2021 01:52:06 +0200
changeset 47012 d55b71393907
parent 45942 89a2afe31e82
child 47439 86418ad637d1
permissions -rw-r--r--
node: replace nullid and friends with nodeconstants class The introduction of 256bit hashes require changes to nullid and other constant magic values. Start pushing them down from repository and revlog where sensible. Differential Revision: https://phab.mercurial-scm.org/D9465
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 import (
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    15
    bundle2,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    16
    changegroup,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    17
    error,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    18
    exchange,
40868
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
    19
    localrepo,
36160
9fd8c2a3db5a narrowspec: move module into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36100
diff changeset
    20
    narrowspec,
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    21
    repair,
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
    22
    requirements,
45106
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43506
diff changeset
    23
    scmutil,
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    24
    util,
37613
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
    25
    wireprototypes,
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    26
)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    27
from mercurial.utils import stringutil
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    28
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    29
_NARROWACL_SECTION = b'narrowacl'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    30
_CHANGESPECPART = b'narrow:changespec'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    31
_RESSPECS = b'narrow:responsespec'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    32
_SPECPART = b'narrow:spec'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    33
_SPECPART_INCLUDE = b'include'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    34
_SPECPART_EXCLUDE = b'exclude'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    35
_KILLNODESIGNAL = b'KILL'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    36
_DONESIGNAL = b'DONE'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    37
_ELIDEDCSHEADER = b'>20s20s20sl'  # cset id, p1, p2, len(text)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    38
_ELIDEDMFHEADER = b'>20s20s20s20sl'  # manifest id, p1, p2, link id, len(text)
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
    39
_CSHEADERSIZE = struct.calcsize(_ELIDEDCSHEADER)
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
    40
_MFHEADERSIZE = struct.calcsize(_ELIDEDMFHEADER)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    41
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    42
# Serve a changegroup for a client with a narrow clone.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    43
def getbundlechangegrouppart_narrow(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    44
    bundler,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    45
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    46
    source,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    47
    bundlecaps=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    48
    b2caps=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    49
    heads=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    50
    common=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    51
    **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    52
):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    53
    assert repo.ui.configbool(b'experimental', b'narrowservebrokenellipses')
38808
d99083996398 exchange: move simple narrow changegroup generation from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38807
diff changeset
    54
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    55
    cgversions = b2caps.get(b'changegroup')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    56
    cgversions = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    57
        v
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    58
        for v in cgversions
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    59
        if v in changegroup.supportedoutgoingversions(repo)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    60
    ]
42365
92f584065b4f narrow: remove unrequired compat code for old versions of hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42209
diff changeset
    61
    if not cgversions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    62
        raise ValueError(_(b'no common changegroup version'))
42365
92f584065b4f narrow: remove unrequired compat code for old versions of hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42209
diff changeset
    63
    version = max(cgversions)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    64
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43249
diff changeset
    65
    include = sorted(filter(bool, kwargs.get('includepats', [])))
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43249
diff changeset
    66
    exclude = sorted(filter(bool, kwargs.get('excludepats', [])))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    67
    generateellipsesbundle2(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    68
        bundler,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    69
        repo,
43243
e94f457998d3 narrow: drop server support for widening using the getbundle command (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43242
diff changeset
    70
        include,
e94f457998d3 narrow: drop server support for widening using the getbundle command (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43242
diff changeset
    71
        exclude,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    72
        version,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    73
        common,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    74
        heads,
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43249
diff changeset
    75
        kwargs.get('depth', None),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    76
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    77
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    78
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    79
def generateellipsesbundle2(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
    80
    bundler,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
    81
    repo,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
    82
    include,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
    83
    exclude,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
    84
    version,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
    85
    common,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
    86
    heads,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
    87
    depth,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    88
):
43243
e94f457998d3 narrow: drop server support for widening using the getbundle command (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43242
diff changeset
    89
    match = narrowspec.match(repo.root, include=include, exclude=exclude)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    90
    if depth is not None:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    91
        depth = int(depth)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    92
        if depth < 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    93
            raise error.Abort(_(b'depth must be positive, got %d') % depth)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    94
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    95
    heads = set(heads or repo.heads())
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    96
    common = set(common or [repo.nullid])
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    97
38791
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
    98
    visitnodes, relevant_nodes, ellipsisroots = exchange._computeellipsis(
43243
e94f457998d3 narrow: drop server support for widening using the getbundle command (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43242
diff changeset
    99
        repo, common, heads, set(), match, depth=depth
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   100
    )
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   101
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   102
    repo.ui.debug(b'Found %d relevant revs\n' % len(relevant_nodes))
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   103
    if visitnodes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   104
        packer = changegroup.getbundler(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   105
            version,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   106
            repo,
43243
e94f457998d3 narrow: drop server support for widening using the getbundle command (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43242
diff changeset
   107
            matcher=match,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   108
            ellipses=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   109
            shallow=depth is not None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   110
            ellipsisroots=ellipsisroots,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   111
            fullnodes=relevant_nodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   112
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   113
        cgdata = packer.generate(common, visitnodes, False, b'narrow_widen')
38910
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   114
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   115
        part = bundler.newpart(b'changegroup', data=cgdata)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   116
        part.addparam(b'version', version)
45552
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
   117
        if scmutil.istreemanifest(repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   118
            part.addparam(b'treemanifest', b'1')
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   119
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   120
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   121
def generate_ellipses_bundle2_for_widening(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
   122
    bundler,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
   123
    repo,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
   124
    oldmatch,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
   125
    newmatch,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
   126
    version,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
   127
    common,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45552
diff changeset
   128
    known,
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   129
):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   130
    common = set(common or [repo.nullid])
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   131
    # Steps:
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   132
    # 1. Send kill for "$known & ::common"
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   133
    #
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   134
    # 2. Send changegroup for ::common
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   135
    #
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   136
    # 3. Proceed.
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   137
    #
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   138
    # In the future, we can send kills for only the specific
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   139
    # nodes we know should go away or change shape, and then
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   140
    # send a data stream that tells the client something like this:
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   141
    #
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   142
    # a) apply this changegroup
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   143
    # b) apply nodes XXX, YYY, ZZZ that you already have
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   144
    # c) goto a
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   145
    #
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   146
    # until they've built up the full new state.
43248
2673f9a74968 widening: trust user to give full "known" set
Martin von Zweigbergk <martinvonz@google.com>
parents: 43247
diff changeset
   147
    knownrevs = {repo.changelog.rev(n) for n in known}
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   148
    # TODO: we could send only roots() of this set, and the
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   149
    # list of nodes in common, and the client could work out
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   150
    # what to strip, instead of us explicitly sending every
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   151
    # single node.
43248
2673f9a74968 widening: trust user to give full "known" set
Martin von Zweigbergk <martinvonz@google.com>
parents: 43247
diff changeset
   152
    deadrevs = knownrevs
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   153
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   154
    def genkills():
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   155
        for r in deadrevs:
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   156
            yield _KILLNODESIGNAL
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   157
            yield repo.changelog.node(r)
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   158
        yield _DONESIGNAL
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   159
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   160
    bundler.newpart(_CHANGESPECPART, data=genkills())
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   161
    newvisit, newfull, newellipsis = exchange._computeellipsis(
43248
2673f9a74968 widening: trust user to give full "known" set
Martin von Zweigbergk <martinvonz@google.com>
parents: 43247
diff changeset
   162
        repo, set(), common, knownrevs, newmatch
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   163
    )
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   164
    if newvisit:
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   165
        packer = changegroup.getbundler(
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   166
            version,
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   167
            repo,
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   168
            matcher=newmatch,
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   169
            ellipses=True,
43247
599e0e62b597 widening: remove "depth" argument since it's always None
Martin von Zweigbergk <martinvonz@google.com>
parents: 43246
diff changeset
   170
            shallow=False,
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   171
            ellipsisroots=newellipsis,
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   172
            fullnodes=newfull,
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   173
        )
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   174
        cgdata = packer.generate(common, newvisit, False, b'narrow_widen')
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   175
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   176
        part = bundler.newpart(b'changegroup', data=cgdata)
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   177
        part.addparam(b'version', version)
45552
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
   178
        if scmutil.istreemanifest(repo):
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   179
            part.addparam(b'treemanifest', b'1')
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   180
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   181
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   182
@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
   183
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
   184
    # 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
   185
    # 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
   186
    # '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
   187
    # Refer to issue5952 and 6019
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   188
    includepats = set(inpart.params.get(_SPECPART_INCLUDE, b'').splitlines())
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   189
    excludepats = set(inpart.params.get(_SPECPART_EXCLUDE, b'').splitlines())
39540
ce20caecacbd narrow: validate patterns on incoming bundle2 part
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39529
diff changeset
   190
    narrowspec.validatepatterns(includepats)
ce20caecacbd narrow: validate patterns on incoming bundle2 part
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39529
diff changeset
   191
    narrowspec.validatepatterns(excludepats)
ce20caecacbd narrow: validate patterns on incoming bundle2 part
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39529
diff changeset
   192
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
   193
    if not requirements.NARROW_REQUIREMENT in op.repo.requirements:
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
   194
        op.repo.requirements.add(requirements.NARROW_REQUIREMENT)
45106
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43506
diff changeset
   195
        scmutil.writereporequirements(op.repo)
36469
28c7f580360b narrow: reduce depedence on narrowspec.save()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36464
diff changeset
   196
    op.repo.setnarrowpats(includepats, excludepats)
41236
44a51c1c8e17 narrow: move copytonarrowspec() out of setnarrowpats()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41076
diff changeset
   197
    narrowspec.copytoworkingcopy(op.repo)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   198
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   199
42209
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   200
@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
   201
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
   202
    data = inpart.read()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   203
    inc, exc = data.split(b'\0')
42209
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   204
    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
   205
    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
   206
    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
   207
    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
   208
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
   209
    if requirements.NARROW_REQUIREMENT not in op.repo.requirements:
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
   210
        op.repo.requirements.add(requirements.NARROW_REQUIREMENT)
45106
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43506
diff changeset
   211
        scmutil.writereporequirements(op.repo)
42209
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   212
    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
   213
    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
   214
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   215
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   216
@bundle2.parthandler(_CHANGESPECPART)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   217
def _handlechangespec(op, inpart):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   218
    repo = op.repo
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   219
    cl = repo.changelog
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   220
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   221
    # 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
   222
    # 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
   223
    # in the changegroup part.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   224
    clkills = set()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   225
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   226
    # 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
   227
    # 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
   228
    # 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
   229
    # 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
   230
    chunksignal = changegroup.readexactly(inpart, 4)
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   231
    while chunksignal != _DONESIGNAL:
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   232
        if chunksignal == _KILLNODESIGNAL:
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   233
            # 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
   234
            ck = changegroup.readexactly(inpart, 20)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   235
            if cl.hasnode(ck):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   236
                clkills.add(ck)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   237
        else:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   238
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   239
                _(b'unexpected changespec node chunk type: %s') % chunksignal
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   240
            )
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   241
        chunksignal = changegroup.readexactly(inpart, 4)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   242
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   243
    if clkills:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   244
        # 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
   245
        op._bookmarksbackup = repo._bookmarks
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   246
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   247
        class dummybmstore(dict):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   248
            def applychanges(self, repo, tr, changes):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   249
                pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   250
40868
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
   251
        localrepo.localrepository._bookmarks.set(repo, dummybmstore())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   252
        chgrpfile = repair.strip(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   253
            op.ui, repo, list(clkills), backup=True, topic=b'widen'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   254
        )
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   255
        if chgrpfile:
41076
8ecb17b7f432 procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents: 40868
diff changeset
   256
            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
   257
            op._widen_uninterr.__enter__()
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   258
            # 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
   259
            op._widen_bundle = chgrpfile
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   260
    # 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
   261
    # 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
   262
    # 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
   263
    # because we're deepening a shallow repo).
43115
4aa72cdf616f py3: delete b'' prefix from safehasattr arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
   264
    if util.safehasattr(repo, 'setnewnarrowpats'):
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   265
        repo.setnewnarrowpats()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   266
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   267
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   268
def handlechangegroup_widen(op, inpart):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   269
    """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
   270
    # 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
   271
    # 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
   272
    repo = op.repo
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   273
    ui = op.ui
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
    chgrpfile = op._widen_bundle
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   276
    del op._widen_bundle
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   277
    vfs = repo.vfs
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   278
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   279
    ui.note(_(b"adding branch\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   280
    f = vfs.open(chgrpfile, b"rb")
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   281
    try:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   282
        gen = exchange.readbundle(ui, f, chgrpfile, vfs)
42895
bbcaf3a74822 narrow: rely on setting `quiet` mode instead of `pushbuffer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42813
diff changeset
   283
        # silence internal shuffling chatter
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   284
        override = {(b'ui', b'quiet'): True}
42895
bbcaf3a74822 narrow: rely on setting `quiet` mode instead of `pushbuffer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42813
diff changeset
   285
        if ui.verbose:
bbcaf3a74822 narrow: rely on setting `quiet` mode instead of `pushbuffer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42813
diff changeset
   286
            override = {}
bbcaf3a74822 narrow: rely on setting `quiet` mode instead of `pushbuffer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42813
diff changeset
   287
        with ui.configoverride(override):
bbcaf3a74822 narrow: rely on setting `quiet` mode instead of `pushbuffer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42813
diff changeset
   288
            if isinstance(gen, bundle2.unbundle20):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   289
                with repo.transaction(b'strip') as tr:
42895
bbcaf3a74822 narrow: rely on setting `quiet` mode instead of `pushbuffer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42813
diff changeset
   290
                    bundle2.processbundle(repo, gen, lambda: tr)
bbcaf3a74822 narrow: rely on setting `quiet` mode instead of `pushbuffer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42813
diff changeset
   291
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   292
                gen.apply(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   293
                    repo, b'strip', b'bundle:' + vfs.join(chgrpfile), True
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   294
                )
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   295
    finally:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   296
        f.close()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   297
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   298
    # remove undo files
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   299
    for undovfs, undofile in repo.undofiles():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   300
        try:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   301
            undovfs.unlink(undofile)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   302
        except OSError as e:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   303
            if e.errno != errno.ENOENT:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   304
                ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   305
                    _(b'error removing %s: %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   306
                    % (undovfs.join(undofile), stringutil.forcebytestr(e))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   307
                )
36079
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 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
   310
    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
   311
    vfs.unlink(chgrpfile)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   312
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   313
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   314
def setup():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   315
    """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
   316
    getbundleargs = wireprototypes.GETBUNDLE_ARGUMENTS
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
   317
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   318
    getbundleargs[b'narrow'] = b'boolean'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   319
    getbundleargs[b'depth'] = b'plain'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   320
    getbundleargs[b'oldincludepats'] = b'csv'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   321
    getbundleargs[b'oldexcludepats'] = b'csv'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   322
    getbundleargs[b'known'] = b'csv'
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   323
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   324
    # Extend changegroup serving to handle requests from narrow clients.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   325
    origcgfn = exchange.getbundle2partsmapping[b'changegroup']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   326
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   327
    def wrappedcgfn(*args, **kwargs):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   328
        repo = args[1]
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   329
        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
   330
            kwargs = exchange.applynarrowacl(repo, kwargs)
98df52d5042c exchange: make narrow ACL presence imply narrow=True
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38794
diff changeset
   331
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43249
diff changeset
   332
        if kwargs.get('narrow', False) and repo.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   333
            b'experimental', b'narrowservebrokenellipses'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   334
        ):
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   335
            getbundlechangegrouppart_narrow(*args, **kwargs)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   336
        else:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   337
            origcgfn(*args, **kwargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   338
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   339
    exchange.getbundle2partsmapping[b'changegroup'] = wrappedcgfn
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   340
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   341
    # Extend changegroup receiver so client can fixup after widen requests.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   342
    origcghandler = bundle2.parthandlermapping[b'changegroup']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   343
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   344
    def wrappedcghandler(op, inpart):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   345
        origcghandler(op, inpart)
43115
4aa72cdf616f py3: delete b'' prefix from safehasattr arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
   346
        if util.safehasattr(op, '_widen_bundle'):
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   347
            handlechangegroup_widen(op, inpart)
43115
4aa72cdf616f py3: delete b'' prefix from safehasattr arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
   348
        if util.safehasattr(op, '_bookmarksbackup'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   349
            localrepo.localrepository._bookmarks.set(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   350
                op.repo, op._bookmarksbackup
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   351
            )
40868
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
   352
            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
   353
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   354
    wrappedcghandler.params = origcghandler.params
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   355
    bundle2.parthandlermapping[b'changegroup'] = wrappedcghandler