hgext/narrow/narrowbundle2.py
author Joerg Sonnenberger <joerg@bec.de>
Wed, 08 Jul 2020 00:15:15 +0200
changeset 45117 b1e51ef4e536
parent 45106 a03c177a4679
child 45371 e58e234096de
permissions -rw-r--r--
phases: sparsify phase lists When the internal and archived phase was added, allphase became a large, sparsely populated list. This dramatically increased the number of lookup operations for public relations in `phasecache.phase`. As a first step, define allphases and related lists explicitly to contain only the actual phases. Make phasenames a dictionary and create corresponding dictionaries for mapping phase names back to numbers. Adjust various list to be sparse as well with the exception of phaseroots and phasesets members of phasecache. Keep those as a separate step as it involves changes to the C module. Differential Revision: https://phab.mercurial-scm.org/D8697
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 _
43243
e94f457998d3 narrow: drop server support for widening using the getbundle command (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43242
diff changeset
    14
from mercurial.node import nullid
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    15
from mercurial import (
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    16
    bundle2,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    17
    changegroup,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    18
    error,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    19
    exchange,
40868
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
    20
    localrepo,
36160
9fd8c2a3db5a narrowspec: move module into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36100
diff changeset
    21
    narrowspec,
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    22
    repair,
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.interfaces import repository
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    28
from mercurial.utils import stringutil
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    29
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    30
_NARROWACL_SECTION = b'narrowacl'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    31
_CHANGESPECPART = b'narrow:changespec'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    32
_RESSPECS = b'narrow:responsespec'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    33
_SPECPART = b'narrow:spec'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    34
_SPECPART_INCLUDE = b'include'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    35
_SPECPART_EXCLUDE = b'exclude'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    36
_KILLNODESIGNAL = b'KILL'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    37
_DONESIGNAL = b'DONE'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    38
_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
    39
_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
    40
_CSHEADERSIZE = struct.calcsize(_ELIDEDCSHEADER)
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
    41
_MFHEADERSIZE = struct.calcsize(_ELIDEDMFHEADER)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    42
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    43
# 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
    44
def getbundlechangegrouppart_narrow(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    45
    bundler,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    46
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    47
    source,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    48
    bundlecaps=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    49
    b2caps=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    50
    heads=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    51
    common=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    52
    **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    53
):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    54
    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
    55
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    56
    cgversions = b2caps.get(b'changegroup')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    57
    cgversions = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    58
        v
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    59
        for v in cgversions
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    60
        if v in changegroup.supportedoutgoingversions(repo)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    61
    ]
42365
92f584065b4f narrow: remove unrequired compat code for old versions of hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42209
diff changeset
    62
    if not cgversions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    63
        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
    64
    version = max(cgversions)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    65
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43249
diff changeset
    66
    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
    67
    exclude = sorted(filter(bool, kwargs.get('excludepats', [])))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    68
    generateellipsesbundle2(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    69
        bundler,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    70
        repo,
43243
e94f457998d3 narrow: drop server support for widening using the getbundle command (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43242
diff changeset
    71
        include,
e94f457998d3 narrow: drop server support for widening using the getbundle command (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43242
diff changeset
    72
        exclude,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    73
        version,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    74
        common,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    75
        heads,
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43249
diff changeset
    76
        kwargs.get('depth', None),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    77
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    78
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    79
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    80
def generateellipsesbundle2(
43243
e94f457998d3 narrow: drop server support for widening using the getbundle command (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43242
diff changeset
    81
    bundler, repo, include, exclude, version, common, heads, depth,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    82
):
43243
e94f457998d3 narrow: drop server support for widening using the getbundle command (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43242
diff changeset
    83
    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
    84
    if depth is not None:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    85
        depth = int(depth)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    86
        if depth < 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    87
            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
    88
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    89
    heads = set(heads or repo.heads())
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    90
    common = set(common or [nullid])
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    91
38791
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
    92
    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
    93
        repo, common, heads, set(), match, depth=depth
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    94
    )
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    95
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    96
    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
    97
    if visitnodes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    98
        packer = changegroup.getbundler(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
    99
            version,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   100
            repo,
43243
e94f457998d3 narrow: drop server support for widening using the getbundle command (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43242
diff changeset
   101
            matcher=match,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   102
            ellipses=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   103
            shallow=depth is not None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   104
            ellipsisroots=ellipsisroots,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   105
            fullnodes=relevant_nodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   106
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   107
        cgdata = packer.generate(common, visitnodes, False, b'narrow_widen')
38910
245c58952298 changegroup: inline _packellipsischangegroup
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38884
diff changeset
   108
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   109
        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
   110
        part.addparam(b'version', version)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   111
        if b'treemanifest' in repo.requirements:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   112
            part.addparam(b'treemanifest', b'1')
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   113
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   114
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   115
def generate_ellipses_bundle2_for_widening(
43249
63d440bef72a widening: pass in matchers instead of patterns
Martin von Zweigbergk <martinvonz@google.com>
parents: 43248
diff changeset
   116
    bundler, repo, oldmatch, newmatch, version, common, known,
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   117
):
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   118
    common = set(common or [nullid])
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   119
    # Steps:
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   120
    # 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
   121
    #
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   122
    # 2. Send changegroup for ::common
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   123
    #
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   124
    # 3. Proceed.
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   125
    #
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   126
    # 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
   127
    # 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
   128
    # 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
   129
    #
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   130
    # a) apply this changegroup
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   131
    # 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
   132
    # c) goto a
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
    # 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
   135
    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
   136
    # 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
   137
    # 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
   138
    # 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
   139
    # single node.
43248
2673f9a74968 widening: trust user to give full "known" set
Martin von Zweigbergk <martinvonz@google.com>
parents: 43247
diff changeset
   140
    deadrevs = knownrevs
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   141
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   142
    def genkills():
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   143
        for r in deadrevs:
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   144
            yield _KILLNODESIGNAL
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   145
            yield repo.changelog.node(r)
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   146
        yield _DONESIGNAL
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   147
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   148
    bundler.newpart(_CHANGESPECPART, data=genkills())
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   149
    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
   150
        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
   151
    )
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   152
    if newvisit:
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   153
        packer = changegroup.getbundler(
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   154
            version,
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   155
            repo,
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   156
            matcher=newmatch,
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   157
            ellipses=True,
43247
599e0e62b597 widening: remove "depth" argument since it's always None
Martin von Zweigbergk <martinvonz@google.com>
parents: 43246
diff changeset
   158
            shallow=False,
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   159
            ellipsisroots=newellipsis,
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   160
            fullnodes=newfull,
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   161
        )
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   162
        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
   163
43244
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   164
        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
   165
        part.addparam(b'version', version)
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   166
        if b'treemanifest' in repo.requirements:
c5adf480de0f widening: remove always-true condition in widening code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43243
diff changeset
   167
            part.addparam(b'treemanifest', b'1')
43242
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   168
561f9bc4b4c5 widening: duplicate generateellipsesbundle2() for widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   169
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   170
@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
   171
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
   172
    # 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
   173
    # 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
   174
    # '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
   175
    # Refer to issue5952 and 6019
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   176
    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
   177
    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
   178
    narrowspec.validatepatterns(includepats)
ce20caecacbd narrow: validate patterns on incoming bundle2 part
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39529
diff changeset
   179
    narrowspec.validatepatterns(excludepats)
ce20caecacbd narrow: validate patterns on incoming bundle2 part
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39529
diff changeset
   180
38835
a232e6744ba3 narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents: 38808
diff changeset
   181
    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
   182
        op.repo.requirements.add(repository.NARROW_REQUIREMENT)
45106
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43506
diff changeset
   183
        scmutil.writereporequirements(op.repo)
36469
28c7f580360b narrow: reduce depedence on narrowspec.save()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36464
diff changeset
   184
    op.repo.setnarrowpats(includepats, excludepats)
41236
44a51c1c8e17 narrow: move copytonarrowspec() out of setnarrowpats()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41076
diff changeset
   185
    narrowspec.copytoworkingcopy(op.repo)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   186
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   187
42209
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   188
@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
   189
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
   190
    data = inpart.read()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   191
    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
   192
    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
   193
    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
   194
    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
   195
    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
   196
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41236
diff changeset
   197
    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
   198
        op.repo.requirements.add(repository.NARROW_REQUIREMENT)
45106
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43506
diff changeset
   199
        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
   200
    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
   201
    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
   202
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   203
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   204
@bundle2.parthandler(_CHANGESPECPART)
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   205
def _handlechangespec(op, inpart):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   206
    repo = op.repo
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   207
    cl = repo.changelog
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   208
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   209
    # 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
   210
    # 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
   211
    # in the changegroup part.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   212
    clkills = set()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   213
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   214
    # 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
   215
    # 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
   216
    # 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
   217
    # 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
   218
    chunksignal = changegroup.readexactly(inpart, 4)
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   219
    while chunksignal != _DONESIGNAL:
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   220
        if chunksignal == _KILLNODESIGNAL:
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   221
            # 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
   222
            ck = changegroup.readexactly(inpart, 20)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   223
            if cl.hasnode(ck):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   224
                clkills.add(ck)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   225
        else:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   226
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   227
                _(b'unexpected changespec node chunk type: %s') % chunksignal
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   228
            )
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   229
        chunksignal = changegroup.readexactly(inpart, 4)
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
    if clkills:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   232
        # 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
   233
        op._bookmarksbackup = repo._bookmarks
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   234
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   235
        class dummybmstore(dict):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   236
            def applychanges(self, repo, tr, changes):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   237
                pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   238
40868
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
   239
        localrepo.localrepository._bookmarks.set(repo, dummybmstore())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   240
        chgrpfile = repair.strip(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   241
            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
   242
        )
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   243
        if chgrpfile:
41076
8ecb17b7f432 procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents: 40868
diff changeset
   244
            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
   245
            op._widen_uninterr.__enter__()
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   246
            # 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
   247
            op._widen_bundle = chgrpfile
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   248
    # 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
   249
    # 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
   250
    # 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
   251
    # 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
   252
    if util.safehasattr(repo, 'setnewnarrowpats'):
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   253
        repo.setnewnarrowpats()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   254
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   255
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   256
def handlechangegroup_widen(op, inpart):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   257
    """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
   258
    # 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
   259
    # 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
   260
    repo = op.repo
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   261
    ui = op.ui
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   262
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   263
    chgrpfile = op._widen_bundle
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   264
    del op._widen_bundle
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   265
    vfs = repo.vfs
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   266
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   267
    ui.note(_(b"adding branch\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   268
    f = vfs.open(chgrpfile, b"rb")
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   269
    try:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   270
        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
   271
        # silence internal shuffling chatter
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   272
        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
   273
        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
   274
            override = {}
bbcaf3a74822 narrow: rely on setting `quiet` mode instead of `pushbuffer`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42813
diff changeset
   275
        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
   276
            if isinstance(gen, bundle2.unbundle20):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   277
                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
   278
                    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
   279
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   280
                gen.apply(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   281
                    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
   282
                )
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   283
    finally:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   284
        f.close()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   285
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   286
    # remove undo files
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   287
    for undovfs, undofile in repo.undofiles():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   288
        try:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   289
            undovfs.unlink(undofile)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   290
        except OSError as e:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   291
            if e.errno != errno.ENOENT:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   292
                ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   293
                    _(b'error removing %s: %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   294
                    % (undovfs.join(undofile), stringutil.forcebytestr(e))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   295
                )
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   296
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   297
    # 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
   298
    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
   299
    vfs.unlink(chgrpfile)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   300
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   301
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   302
def setup():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   303
    """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
   304
    getbundleargs = wireprototypes.GETBUNDLE_ARGUMENTS
96d735601ca1 wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
   305
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   306
    getbundleargs[b'narrow'] = b'boolean'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   307
    getbundleargs[b'depth'] = b'plain'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   308
    getbundleargs[b'oldincludepats'] = b'csv'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   309
    getbundleargs[b'oldexcludepats'] = b'csv'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   310
    getbundleargs[b'known'] = b'csv'
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   311
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   312
    # 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
   313
    origcgfn = exchange.getbundle2partsmapping[b'changegroup']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   314
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   315
    def wrappedcgfn(*args, **kwargs):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   316
        repo = args[1]
36087
844f253dad5e narrowbundle2: mark most constants as module-private
Augie Fackler <augie@google.com>
parents: 36086
diff changeset
   317
        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
   318
            kwargs = exchange.applynarrowacl(repo, kwargs)
98df52d5042c exchange: make narrow ACL presence imply narrow=True
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38794
diff changeset
   319
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43249
diff changeset
   320
        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
   321
            b'experimental', b'narrowservebrokenellipses'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   322
        ):
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   323
            getbundlechangegrouppart_narrow(*args, **kwargs)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   324
        else:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   325
            origcgfn(*args, **kwargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   326
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   327
    exchange.getbundle2partsmapping[b'changegroup'] = wrappedcgfn
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   328
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   329
    # 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
   330
    origcghandler = bundle2.parthandlermapping[b'changegroup']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   331
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   332
    def wrappedcghandler(op, inpart):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   333
        origcghandler(op, inpart)
43115
4aa72cdf616f py3: delete b'' prefix from safehasattr arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
   334
        if util.safehasattr(op, '_widen_bundle'):
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   335
            handlechangegroup_widen(op, inpart)
43115
4aa72cdf616f py3: delete b'' prefix from safehasattr arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
   336
        if util.safehasattr(op, '_bookmarksbackup'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   337
            localrepo.localrepository._bookmarks.set(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   338
                op.repo, op._bookmarksbackup
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42895
diff changeset
   339
            )
40868
109a267acc1e narrow: keep bookmarks temporarily stripped for as long as commits are
Martin von Zweigbergk <martinvonz@google.com>
parents: 40867
diff changeset
   340
            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
   341
36079
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   342
    wrappedcghandler.params = origcghandler.params
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   343
    bundle2.parthandlermapping[b'changegroup'] = wrappedcghandler