hgext/narrow/narrowcommands.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Fri, 19 Jun 2020 13:27:46 +0200
changeset 45476 9bd60ec60601
parent 45392 77b8588dd84e
child 46114 59fa3890d40a
permissions -rw-r--r--
tests: add criss cross merging tests whose behavior need to be fixed Merging two changesets can mark a file as removed post merge. However, in some cases, a user might not want to remove that file and they revert the removal back and commit the merge. All this works perfectly well. However, when we do criss-cross merges with such merge where user explicitly choose to revert the removal with one where another user choose the removal, we does not get any conflict. The intent here is conflicting and merge should result in conflicts. One user merged and want to keep the file while other user merged and want to remove the file. Merging those merges should result in conflicts. This patch adds test cases for these cases. Differential Revision: https://phab.mercurial-scm.org/D8939
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
     1
# narrowcommands.py - command modifications for narrowhg extension
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
from __future__ import absolute_import
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
     8
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
     9
import itertools
39275
f4d4bd8c8911 narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38874
diff changeset
    10
import os
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    11
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    12
from mercurial.i18n import _
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    13
from mercurial import (
40071
8feae5b989bc narrow: the first version of narrow_widen wireprotocol command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39966
diff changeset
    14
    bundle2,
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    15
    cmdutil,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    16
    commands,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    17
    discovery,
39459
ab20ee07b82d narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39384
diff changeset
    18
    encoding,
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    19
    error,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    20
    exchange,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    21
    extensions,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    22
    hg,
36198
9fd8c2a3db5a narrowspec: move module into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36192
diff changeset
    23
    narrowspec,
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    24
    node,
43571
c21aca51b392 utils: move the `dirs` definition in pathutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43554
diff changeset
    25
    pathutil,
36192
4a7ba3ac9163 narrowcommands: use pycompat.{bytes,str}kwargs
Augie Fackler <augie@google.com>
parents: 36138
diff changeset
    26
    pycompat,
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    27
    registrar,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    28
    repair,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    29
    repoview,
45392
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43571
diff changeset
    30
    requirements,
39275
f4d4bd8c8911 narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38874
diff changeset
    31
    sparse,
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    32
    util,
40075
f7011b44d205 wireprotoserver: move narrow capabilities to wireprototypes.py
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40071
diff changeset
    33
    wireprototypes,
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    34
)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    35
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    36
table = {}
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    37
command = registrar.command(table)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    38
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    39
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    40
def setup():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    41
    """Wraps user-facing mercurial commands with narrow-aware versions."""
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    42
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    43
    entry = extensions.wrapcommand(commands.table, b'clone', clonenarrowcmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    44
    entry[1].append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    45
        (b'', b'narrow', None, _(b"create a narrow clone of select files"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    46
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    47
    entry[1].append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    48
        (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    49
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    50
            b'depth',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    51
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    52
            _(b"limit the history fetched by distance from heads"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    53
        )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    54
    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    55
    entry[1].append((b'', b'narrowspec', b'', _(b"read narrowspecs from file")))
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    56
    # TODO(durin42): unify sparse/narrow --include/--exclude logic a bit
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    57
    if b'sparse' not in extensions.enabled():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    58
        entry[1].append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    59
            (b'', b'include', [], _(b"specifically fetch this file/directory"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    60
        )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    61
        entry[1].append(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    62
            (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    63
                b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    64
                b'exclude',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    65
                [],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    66
                _(b"do not fetch this file/directory, even if included"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    67
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    68
        )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    69
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    70
    entry = extensions.wrapcommand(commands.table, b'pull', pullnarrowcmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    71
    entry[1].append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    72
        (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    73
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    74
            b'depth',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    75
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    76
            _(b"limit the history fetched by distance from heads"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    77
        )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    78
    )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    79
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    80
    extensions.wrapcommand(commands.table, b'archive', archivenarrowcmd)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    81
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    82
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    83
def clonenarrowcmd(orig, ui, repo, *args, **opts):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    84
    """Wraps clone command, so 'hg clone' first wraps localrepo.clone()."""
36192
4a7ba3ac9163 narrowcommands: use pycompat.{bytes,str}kwargs
Augie Fackler <augie@google.com>
parents: 36138
diff changeset
    85
    opts = pycompat.byteskwargs(opts)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
    86
    wrappedextraprepare = util.nullcontextmanager()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    87
    narrowspecfile = opts[b'narrowspec']
39275
f4d4bd8c8911 narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38874
diff changeset
    88
f4d4bd8c8911 narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38874
diff changeset
    89
    if narrowspecfile:
39823
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39750
diff changeset
    90
        filepath = os.path.join(encoding.getcwd(), narrowspecfile)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    91
        ui.status(_(b"reading narrowspec from '%s'\n") % filepath)
39275
f4d4bd8c8911 narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38874
diff changeset
    92
        try:
39482
4062bbb1d10f narrow: use util.readfile() and improve error message using --narrowspec
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39459
diff changeset
    93
            fdata = util.readfile(filepath)
4062bbb1d10f narrow: use util.readfile() and improve error message using --narrowspec
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39459
diff changeset
    94
        except IOError as inst:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    95
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    96
                _(b"cannot read narrowspecs from '%s': %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    97
                % (filepath, encoding.strtolocal(inst.strerror))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
    98
            )
39275
f4d4bd8c8911 narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38874
diff changeset
    99
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   100
        includes, excludes, profiles = sparse.parseconfig(ui, fdata, b'narrow')
39275
f4d4bd8c8911 narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38874
diff changeset
   101
        if profiles:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   102
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   103
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   104
                    b"cannot specify other files using '%include' in"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   105
                    b" narrowspec"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   106
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   107
            )
39275
f4d4bd8c8911 narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38874
diff changeset
   108
39558
8301741e1f89 narrow: validate spec files are well-formed during clone (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   109
        narrowspec.validatepatterns(includes)
8301741e1f89 narrow: validate spec files are well-formed during clone (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   110
        narrowspec.validatepatterns(excludes)
8301741e1f89 narrow: validate spec files are well-formed during clone (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   111
39275
f4d4bd8c8911 narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38874
diff changeset
   112
        # narrowspec is passed so we should assume that user wants narrow clone
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   113
        opts[b'narrow'] = True
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   114
        opts[b'include'].extend(includes)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   115
        opts[b'exclude'].extend(excludes)
39275
f4d4bd8c8911 narrow: add a --narrowspec flag to clone command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38874
diff changeset
   116
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   117
    if opts[b'narrow']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   118
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   119
        def pullbundle2extraprepare_widen(orig, pullop, kwargs):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   120
            orig(pullop, kwargs)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   121
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   122
            if opts.get(b'depth'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   123
                kwargs[b'depth'] = opts[b'depth']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   124
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   125
        wrappedextraprepare = extensions.wrappedfunction(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   126
            exchange, b'_pullbundle2extraprepare', pullbundle2extraprepare_widen
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   127
        )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   128
39570
841c82d1a973 narrow: don't wrap exchange.pull() during clone
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39562
diff changeset
   129
    with wrappedextraprepare:
36192
4a7ba3ac9163 narrowcommands: use pycompat.{bytes,str}kwargs
Augie Fackler <augie@google.com>
parents: 36138
diff changeset
   130
        return orig(ui, repo, *args, **pycompat.strkwargs(opts))
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   131
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   132
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   133
def pullnarrowcmd(orig, ui, repo, *args, **opts):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   134
    """Wraps pull command to allow modifying narrow spec."""
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   135
    wrappedextraprepare = util.nullcontextmanager()
45392
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43571
diff changeset
   136
    if requirements.NARROW_REQUIREMENT in repo.requirements:
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   137
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   138
        def pullbundle2extraprepare_widen(orig, pullop, kwargs):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   139
            orig(pullop, kwargs)
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43181
diff changeset
   140
            if opts.get('depth'):
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43181
diff changeset
   141
                kwargs[b'depth'] = opts['depth']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   142
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   143
        wrappedextraprepare = extensions.wrappedfunction(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   144
            exchange, b'_pullbundle2extraprepare', pullbundle2extraprepare_widen
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   145
        )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   146
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   147
    with wrappedextraprepare:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   148
        return orig(ui, repo, *args, **opts)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   149
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   150
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   151
def archivenarrowcmd(orig, ui, repo, *args, **opts):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   152
    """Wraps archive command to narrow the default includes."""
45392
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43571
diff changeset
   153
    if requirements.NARROW_REQUIREMENT in repo.requirements:
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   154
        repo_includes, repo_excludes = repo.narrowpats
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43181
diff changeset
   155
        includes = set(opts.get('include', []))
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43181
diff changeset
   156
        excludes = set(opts.get('exclude', []))
36138
8fd0a9e2d7e9 narrow: make restrictpatterns a little more idiomatic
Augie Fackler <augie@google.com>
parents: 36126
diff changeset
   157
        includes, excludes, unused_invalid = narrowspec.restrictpatterns(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   158
            includes, excludes, repo_includes, repo_excludes
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   159
        )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   160
        if includes:
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43181
diff changeset
   161
            opts['include'] = includes
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   162
        if excludes:
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43181
diff changeset
   163
            opts['exclude'] = excludes
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   164
    return orig(ui, repo, *args, **opts)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   165
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   166
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   167
def pullbundle2extraprepare(orig, pullop, kwargs):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   168
    repo = pullop.repo
45392
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43571
diff changeset
   169
    if requirements.NARROW_REQUIREMENT not in repo.requirements:
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   170
        return orig(pullop, kwargs)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   171
40075
f7011b44d205 wireprotoserver: move narrow capabilities to wireprototypes.py
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40071
diff changeset
   172
    if wireprototypes.NARROWCAP not in pullop.remote.capabilities():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   173
        raise error.Abort(_(b"server does not support narrow clones"))
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   174
    orig(pullop, kwargs)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   175
    kwargs[b'narrow'] = True
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   176
    include, exclude = repo.narrowpats
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   177
    kwargs[b'oldincludepats'] = include
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   178
    kwargs[b'oldexcludepats'] = exclude
40543
a2c4502e409b narrow: only send includepats and excludepats if they are not empty
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40503
diff changeset
   179
    if include:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   180
        kwargs[b'includepats'] = include
40543
a2c4502e409b narrow: only send includepats and excludepats if they are not empty
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40503
diff changeset
   181
    if exclude:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   182
        kwargs[b'excludepats'] = exclude
39541
294c571490f0 narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39482
diff changeset
   183
    # calculate known nodes only in ellipses cases because in non-ellipses cases
294c571490f0 narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39482
diff changeset
   184
    # we have all the nodes
42432
c767e655ffda narrow: use narrow_widen wireproto command to widen in case of ellipses
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42367
diff changeset
   185
    if wireprototypes.ELLIPSESCAP1 in pullop.remote.capabilities():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   186
        kwargs[b'known'] = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   187
            node.hex(ctx.node())
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   188
            for ctx in repo.set(b'::%ln', pullop.common)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   189
            if ctx.node() != node.nullid
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   190
        ]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   191
        if not kwargs[b'known']:
39541
294c571490f0 narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39482
diff changeset
   192
            # Mercurial serializes an empty list as '' and deserializes it as
294c571490f0 narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39482
diff changeset
   193
            # [''], so delete it instead to avoid handling the empty string on
294c571490f0 narrow: build the known set of nodes only when ellipses is enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39482
diff changeset
   194
            # the server.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   195
            del kwargs[b'known']
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   196
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   197
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   198
extensions.wrapfunction(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   199
    exchange, b'_pullbundle2extraprepare', pullbundle2extraprepare
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   200
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   201
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   202
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   203
def _narrow(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   204
    ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   205
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   206
    remote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   207
    commoninc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   208
    oldincludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   209
    oldexcludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   210
    newincludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   211
    newexcludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   212
    force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   213
):
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   214
    oldmatch = narrowspec.match(repo.root, oldincludes, oldexcludes)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   215
    newmatch = narrowspec.match(repo.root, newincludes, newexcludes)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   216
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   217
    # This is essentially doing "hg outgoing" to find all local-only
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   218
    # commits. We will then check that the local-only commits don't
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   219
    # have any changes to files that will be untracked.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   220
    unfi = repo.unfiltered()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   221
    outgoing = discovery.findcommonoutgoing(unfi, remote, commoninc=commoninc)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   222
    ui.status(_(b'looking for local changes to affected paths\n'))
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   223
    localnodes = []
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   224
    for n in itertools.chain(outgoing.missing, outgoing.excluded):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   225
        if any(oldmatch(f) and not newmatch(f) for f in unfi[n].files()):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   226
            localnodes.append(n)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   227
    revstostrip = unfi.revs(b'descendants(%ln)', localnodes)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   228
    hiddenrevs = repoview.filterrevs(repo, b'visible')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   229
    visibletostrip = list(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   230
        repo.changelog.node(r) for r in (revstostrip - hiddenrevs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   231
    )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   232
    if visibletostrip:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   233
        ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   234
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   235
                b'The following changeset(s) or their ancestors have '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   236
                b'local changes not on the remote:\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   237
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   238
        )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   239
        maxnodes = 10
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   240
        if ui.verbose or len(visibletostrip) <= maxnodes:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   241
            for n in visibletostrip:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   242
                ui.status(b'%s\n' % node.short(n))
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   243
        else:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   244
            for n in visibletostrip[:maxnodes]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   245
                ui.status(b'%s\n' % node.short(n))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   246
            ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   247
                _(b'...and %d more, use --verbose to list all\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   248
                % (len(visibletostrip) - maxnodes)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   249
            )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   250
        if not force:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   251
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   252
                _(b'local changes found'),
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
   253
                hint=_(b'use --force-delete-local-changes to ignore'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   254
            )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   255
41079
8ecb17b7f432 procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents: 41046
diff changeset
   256
    with ui.uninterruptible():
38530
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   257
        if revstostrip:
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   258
            tostrip = [unfi.changelog.node(r) for r in revstostrip]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   259
            if repo[b'.'].node() in tostrip:
38530
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   260
                # stripping working copy, so move to a different commit first
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   261
                urev = max(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   262
                    repo.revs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   263
                        b'(::%n) - %ln + null',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   264
                        repo[b'.'].node(),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   265
                        visibletostrip,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   266
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   267
                )
38530
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   268
                hg.clean(repo, urev)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   269
            overrides = {(b'devel', b'strip-obsmarkers'): False}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   270
            with ui.configoverride(overrides, b'narrow'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   271
                repair.strip(ui, unfi, tostrip, topic=b'narrow')
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   272
38530
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   273
        todelete = []
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   274
        for f, f2, size in repo.store.datafiles():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   275
            if f.startswith(b'data/'):
38530
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   276
                file = f[5:-2]
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   277
                if not newmatch(file):
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   278
                    todelete.append(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   279
            elif f.startswith(b'meta/'):
38530
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   280
                dir = f[5:-13]
43571
c21aca51b392 utils: move the `dirs` definition in pathutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43554
diff changeset
   281
                dirs = sorted(pathutil.dirs({dir})) + [dir]
38530
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   282
                include = True
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   283
                for d in dirs:
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   284
                    visit = newmatch.visitdir(d)
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   285
                    if not visit:
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   286
                        include = False
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   287
                        break
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   288
                    if visit == b'all':
38530
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   289
                        break
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   290
                if not include:
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   291
                    todelete.append(f)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   292
38530
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   293
        repo.destroying()
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   294
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   295
        with repo.transaction(b'narrowing'):
41031
095a0a63ad88 narrow: when narrowing, write new narrowspec before removing revlogs
Martin von Zweigbergk <martinvonz@google.com>
parents: 41030
diff changeset
   296
            # Update narrowspec before removing revlogs, so repo won't be
095a0a63ad88 narrow: when narrowing, write new narrowspec before removing revlogs
Martin von Zweigbergk <martinvonz@google.com>
parents: 41030
diff changeset
   297
            # corrupt in case of crash
095a0a63ad88 narrow: when narrowing, write new narrowspec before removing revlogs
Martin von Zweigbergk <martinvonz@google.com>
parents: 41030
diff changeset
   298
            repo.setnarrowpats(newincludes, newexcludes)
095a0a63ad88 narrow: when narrowing, write new narrowspec before removing revlogs
Martin von Zweigbergk <martinvonz@google.com>
parents: 41030
diff changeset
   299
38530
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   300
            for f in todelete:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   301
                ui.status(_(b'deleting %s\n') % f)
38530
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   302
                util.unlinkpath(repo.svfs.join(f))
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   303
                repo.store.markremoved(f)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   304
41238
8c366af085f4 narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents: 41237
diff changeset
   305
            narrowspec.updateworkingcopy(repo, assumeclean=True)
8c366af085f4 narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents: 41237
diff changeset
   306
            narrowspec.copytoworkingcopy(repo)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   307
38530
a1d5951efce7 narrow: mark the critical chunks of narrowing/widening as unsafe
Augie Fackler <augie@google.com>
parents: 36499
diff changeset
   308
        repo.destroyed()
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   309
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   310
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   311
def _widen(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   312
    ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   313
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   314
    remote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   315
    commoninc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   316
    oldincludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   317
    oldexcludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   318
    newincludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   319
    newexcludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   320
):
39964
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   321
    # for now we assume that if a server has ellipses enabled, we will be
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   322
    # exchanging ellipses nodes. In future we should add ellipses as a client
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   323
    # side requirement (maybe) to distinguish a client is shallow or not and
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   324
    # then send that information to server whether we want ellipses or not.
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   325
    # Theoretically a non-ellipses repo should be able to use narrow
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   326
    # functionality from an ellipses enabled server
42432
c767e655ffda narrow: use narrow_widen wireproto command to widen in case of ellipses
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42367
diff changeset
   327
    remotecap = remote.capabilities()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   328
    ellipsesremote = any(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   329
        cap in remotecap for cap in wireprototypes.SUPPORTED_ELLIPSESCAP
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   330
    )
42432
c767e655ffda narrow: use narrow_widen wireproto command to widen in case of ellipses
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42367
diff changeset
   331
c767e655ffda narrow: use narrow_widen wireproto command to widen in case of ellipses
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42367
diff changeset
   332
    # check whether we are talking to a server which supports old version of
c767e655ffda narrow: use narrow_widen wireproto command to widen in case of ellipses
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42367
diff changeset
   333
    # ellipses capabilities
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   334
    isoldellipses = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   335
        ellipsesremote
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   336
        and wireprototypes.ELLIPSESCAP1 in remotecap
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   337
        and wireprototypes.ELLIPSESCAP not in remotecap
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   338
    )
39964
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   339
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   340
    def pullbundle2extraprepare_widen(orig, pullop, kwargs):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   341
        orig(pullop, kwargs)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   342
        # The old{in,ex}cludepats have already been set by orig()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   343
        kwargs[b'includepats'] = newincludes
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   344
        kwargs[b'excludepats'] = newexcludes
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   345
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   346
    wrappedextraprepare = extensions.wrappedfunction(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   347
        exchange, b'_pullbundle2extraprepare', pullbundle2extraprepare_widen
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   348
    )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   349
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   350
    # define a function that narrowbundle2 can call after creating the
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   351
    # backup bundle, but before applying the bundle from the server
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   352
    def setnewnarrowpats():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   353
        repo.setnarrowpats(newincludes, newexcludes)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   354
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   355
    repo.setnewnarrowpats = setnewnarrowpats
39689
f1844a10ee19 narrow: don't send the changelog information when widening without ellipses
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39571
diff changeset
   356
    # silence the devel-warning of applying an empty changegroup
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   357
    overrides = {(b'devel', b'all-warnings'): False}
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   358
42433
8381b7067f17 narrow: refactor code around widening complicated by previous patch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42432
diff changeset
   359
    common = commoninc[0]
41079
8ecb17b7f432 procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents: 41046
diff changeset
   360
    with ui.uninterruptible():
39964
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   361
        if ellipsesremote:
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   362
            ds = repo.dirstate
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   363
            p1, p2 = ds.p1(), ds.p2()
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   364
            with ds.parentchange():
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   365
                ds.setparents(node.nullid, node.nullid)
42433
8381b7067f17 narrow: refactor code around widening complicated by previous patch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42432
diff changeset
   366
        if isoldellipses:
41769
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41734
diff changeset
   367
            with wrappedextraprepare:
42433
8381b7067f17 narrow: refactor code around widening complicated by previous patch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42432
diff changeset
   368
                exchange.pull(repo, remote, heads=common)
39964
693dda764efe narrow: don't do the dirstate dance if ellipses is not enabled
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39939
diff changeset
   369
        else:
42433
8381b7067f17 narrow: refactor code around widening complicated by previous patch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42432
diff changeset
   370
            known = []
8381b7067f17 narrow: refactor code around widening complicated by previous patch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42432
diff changeset
   371
            if ellipsesremote:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   372
                known = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   373
                    ctx.node()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   374
                    for ctx in repo.set(b'::%ln', common)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   375
                    if ctx.node() != node.nullid
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   376
                ]
40071
8feae5b989bc narrow: the first version of narrow_widen wireprotocol command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39966
diff changeset
   377
            with remote.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   378
                bundle = e.callcommand(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   379
                    b'narrow_widen',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   380
                    {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   381
                        b'oldincludes': oldincludes,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   382
                        b'oldexcludes': oldexcludes,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   383
                        b'newincludes': newincludes,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   384
                        b'newexcludes': newexcludes,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   385
                        b'cgversion': b'03',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   386
                        b'commonheads': common,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   387
                        b'known': known,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   388
                        b'ellipses': ellipsesremote,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   389
                    },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   390
                ).result()
40071
8feae5b989bc narrow: the first version of narrow_widen wireprotocol command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39966
diff changeset
   391
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   392
            trmanager = exchange.transactionmanager(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   393
                repo, b'widen', remote.url()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   394
            )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   395
            with trmanager, repo.ui.configoverride(overrides, b'widen'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   396
                op = bundle2.bundleoperation(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   397
                    repo, trmanager.transaction, source=b'widen'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   398
                )
42433
8381b7067f17 narrow: refactor code around widening complicated by previous patch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42432
diff changeset
   399
                # TODO: we should catch error.Abort here
8381b7067f17 narrow: refactor code around widening complicated by previous patch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42432
diff changeset
   400
                bundle2.processbundle(repo, bundle, op=op)
8381b7067f17 narrow: refactor code around widening complicated by previous patch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42432
diff changeset
   401
8381b7067f17 narrow: refactor code around widening complicated by previous patch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42432
diff changeset
   402
        if ellipsesremote:
8381b7067f17 narrow: refactor code around widening complicated by previous patch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42432
diff changeset
   403
            with ds.parentchange():
8381b7067f17 narrow: refactor code around widening complicated by previous patch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42432
diff changeset
   404
                ds.setparents(p1, p2)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   405
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   406
        with repo.transaction(b'widening'):
41237
ad9ab2523149 narrow: reuse narrowspec.updateworkingcopy() when widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 41236
diff changeset
   407
            repo.setnewnarrowpats()
ad9ab2523149 narrow: reuse narrowspec.updateworkingcopy() when widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 41236
diff changeset
   408
            narrowspec.updateworkingcopy(repo)
ad9ab2523149 narrow: reuse narrowspec.updateworkingcopy() when widening
Martin von Zweigbergk <martinvonz@google.com>
parents: 41236
diff changeset
   409
            narrowspec.copytoworkingcopy(repo)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   410
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   411
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   412
# TODO(rdamazio): Make new matcher format and update description
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   413
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   414
    b'tracked',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   415
    [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   416
        (b'', b'addinclude', [], _(b'new paths to include')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   417
        (b'', b'removeinclude', [], _(b'old paths to no longer include')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   418
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   419
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   420
            b'auto-remove-includes',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   421
            False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   422
            _(b'automatically choose unused includes to remove'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   423
        ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   424
        (b'', b'addexclude', [], _(b'new paths to exclude')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   425
        (b'', b'import-rules', b'', _(b'import narrowspecs from a file')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   426
        (b'', b'removeexclude', [], _(b'old paths to no longer exclude')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   427
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   428
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   429
            b'clear',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   430
            False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   431
            _(b'whether to replace the existing narrowspec'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   432
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   433
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   434
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   435
            b'force-delete-local-changes',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   436
            False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   437
            _(b'forces deletion of local changes when narrowing'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   438
        ),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   439
        (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   440
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   441
            b'update-working-copy',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   442
            False,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   443
            _(b'update working copy when the store has changed'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   444
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   445
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   446
    + commands.remoteopts,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   447
    _(b'[OPTIONS]... [REMOTE]'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   448
    inferrepo=True,
43181
5ff32fdf0b0b help: adding a help category to narrow and remotefilelog commands
Rodrigo Damazio <rdamazio@google.com>
parents: 43117
diff changeset
   449
    helpcategory=command.CATEGORY_MAINTENANCE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   450
)
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   451
def trackedcmd(ui, repo, remotepath=None, *pats, **opts):
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   452
    """show or change the current narrowspec
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   453
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   454
    With no argument, shows the current narrowspec entries, one per line. Each
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   455
    line will be prefixed with 'I' or 'X' for included or excluded patterns,
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   456
    respectively.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   457
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   458
    The narrowspec is comprised of expressions to match remote files and/or
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   459
    directories that should be pulled into your client.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   460
    The narrowspec has *include* and *exclude* expressions, with excludes always
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   461
    trumping includes: that is, if a file matches an exclude expression, it will
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   462
    be excluded even if it also matches an include expression.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   463
    Excluding files that were never included has no effect.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   464
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   465
    Each included or excluded entry is in the format described by
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   466
    'hg help patterns'.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   467
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   468
    The options allow you to add or remove included and excluded expressions.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   469
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   470
    If --clear is specified, then all previous includes and excludes are DROPPED
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   471
    and replaced by the new ones specified to --addinclude and --addexclude.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   472
    If --clear is specified without any further options, the narrowspec will be
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   473
    empty and will not match any files.
41982
6cad258e1348 tracked: add documentation about `--import-rules` flag
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41769
diff changeset
   474
42949
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   475
    If --auto-remove-includes is specified, then those includes that don't match
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   476
    any files modified by currently visible local commits (those not shared by
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   477
    the remote) will be added to the set of explicitly specified includes to
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   478
    remove.
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   479
41982
6cad258e1348 tracked: add documentation about `--import-rules` flag
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41769
diff changeset
   480
    --import-rules accepts a path to a file containing rules, allowing you to
6cad258e1348 tracked: add documentation about `--import-rules` flag
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41769
diff changeset
   481
    add --addinclude, --addexclude rules in bulk. Like the other include and
6cad258e1348 tracked: add documentation about `--import-rules` flag
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41769
diff changeset
   482
    exclude switches, the changes are applied immediately.
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   483
    """
36204
ccf7ae119769 narrowcommands: more byteskwargs cleanup
Augie Fackler <augie@google.com>
parents: 36198
diff changeset
   484
    opts = pycompat.byteskwargs(opts)
45392
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43571
diff changeset
   485
    if requirements.NARROW_REQUIREMENT not in repo.requirements:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   486
        raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   487
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   488
                b'the tracked command is only supported on '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   489
                b'repositories cloned with --narrow'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   490
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   491
        )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   492
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   493
    # Before supporting, decide whether it "hg tracked --clear" should mean
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   494
    # tracking no paths or all paths.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   495
    if opts[b'clear']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   496
        raise error.Abort(_(b'the --clear option is not yet supported'))
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   497
39459
ab20ee07b82d narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39384
diff changeset
   498
    # import rules from a file
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   499
    newrules = opts.get(b'import_rules')
39459
ab20ee07b82d narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39384
diff changeset
   500
    if newrules:
ab20ee07b82d narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39384
diff changeset
   501
        try:
39823
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39750
diff changeset
   502
            filepath = os.path.join(encoding.getcwd(), newrules)
39459
ab20ee07b82d narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39384
diff changeset
   503
            fdata = util.readfile(filepath)
ab20ee07b82d narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39384
diff changeset
   504
        except IOError as inst:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   505
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   506
                _(b"cannot read narrowspecs from '%s': %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   507
                % (filepath, encoding.strtolocal(inst.strerror))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   508
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   509
        includepats, excludepats, profiles = sparse.parseconfig(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   510
            ui, fdata, b'narrow'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   511
        )
39459
ab20ee07b82d narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39384
diff changeset
   512
        if profiles:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   513
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   514
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   515
                    b"including other spec files using '%include' "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   516
                    b"is not supported in narrowspec"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   517
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   518
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   519
        opts[b'addinclude'].extend(includepats)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   520
        opts[b'addexclude'].extend(excludepats)
39459
ab20ee07b82d narrow: add '--import-rules' flag to tracked command
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39384
diff changeset
   521
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   522
    addedincludes = narrowspec.parsepatterns(opts[b'addinclude'])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   523
    removedincludes = narrowspec.parsepatterns(opts[b'removeinclude'])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   524
    addedexcludes = narrowspec.parsepatterns(opts[b'addexclude'])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   525
    removedexcludes = narrowspec.parsepatterns(opts[b'removeexclude'])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   526
    autoremoveincludes = opts[b'auto_remove_includes']
40501
30a7d3b6b281 narrow: rework logic to check whether we need to widen and narrow
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40075
diff changeset
   527
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   528
    update_working_copy = opts[b'update_working_copy']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   529
    only_show = not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   530
        addedincludes
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   531
        or removedincludes
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   532
        or addedexcludes
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   533
        or removedexcludes
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   534
        or newrules
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   535
        or autoremoveincludes
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   536
        or update_working_copy
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   537
    )
40501
30a7d3b6b281 narrow: rework logic to check whether we need to widen and narrow
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40075
diff changeset
   538
30a7d3b6b281 narrow: rework logic to check whether we need to widen and narrow
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40075
diff changeset
   539
    oldincludes, oldexcludes = repo.narrowpats
30a7d3b6b281 narrow: rework logic to check whether we need to widen and narrow
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40075
diff changeset
   540
30a7d3b6b281 narrow: rework logic to check whether we need to widen and narrow
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40075
diff changeset
   541
    # filter the user passed additions and deletions into actual additions and
30a7d3b6b281 narrow: rework logic to check whether we need to widen and narrow
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40075
diff changeset
   542
    # deletions of excludes and includes
40503
5d8f291405e5 narrow: replace filtering in list comprehension by set operations
Martin von Zweigbergk <martinvonz@google.com>
parents: 40501
diff changeset
   543
    addedincludes -= oldincludes
5d8f291405e5 narrow: replace filtering in list comprehension by set operations
Martin von Zweigbergk <martinvonz@google.com>
parents: 40501
diff changeset
   544
    removedincludes &= oldincludes
5d8f291405e5 narrow: replace filtering in list comprehension by set operations
Martin von Zweigbergk <martinvonz@google.com>
parents: 40501
diff changeset
   545
    addedexcludes -= oldexcludes
5d8f291405e5 narrow: replace filtering in list comprehension by set operations
Martin von Zweigbergk <martinvonz@google.com>
parents: 40501
diff changeset
   546
    removedexcludes &= oldexcludes
40501
30a7d3b6b281 narrow: rework logic to check whether we need to widen and narrow
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40075
diff changeset
   547
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   548
    widening = addedincludes or removedexcludes
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   549
    narrowing = removedincludes or addedexcludes
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   550
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   551
    # Only print the current narrowspec.
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   552
    if only_show:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   553
        ui.pager(b'tracked')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   554
        fm = ui.formatter(b'narrow', opts)
40800
773572e5cba2 narrowcommands: remove an unrequired `repo.narrowpats` call
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40543
diff changeset
   555
        for i in sorted(oldincludes):
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   556
            fm.startitem()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   557
            fm.write(b'status', b'%s ', b'I', label=b'narrow.included')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   558
            fm.write(b'pat', b'%s\n', i, label=b'narrow.included')
40800
773572e5cba2 narrowcommands: remove an unrequired `repo.narrowpats` call
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40543
diff changeset
   559
        for i in sorted(oldexcludes):
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   560
            fm.startitem()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   561
            fm.write(b'status', b'%s ', b'X', label=b'narrow.excluded')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   562
            fm.write(b'pat', b'%s\n', i, label=b'narrow.excluded')
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   563
        fm.end()
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   564
        return 0
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   565
41046
ce0bc2952e2a narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents: 41042
diff changeset
   566
    if update_working_copy:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   567
        with repo.wlock(), repo.lock(), repo.transaction(b'narrow-wc'):
41176
4475322b7533 narrow: drop explicit dirstate write
Martin von Zweigbergk <martinvonz@google.com>
parents: 41079
diff changeset
   568
            narrowspec.updateworkingcopy(repo)
41229
50ca531f1f24 narrow: copy store narrowspec to working copy immediately
Martin von Zweigbergk <martinvonz@google.com>
parents: 41176
diff changeset
   569
            narrowspec.copytoworkingcopy(repo)
41046
ce0bc2952e2a narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents: 41042
diff changeset
   570
        return 0
ce0bc2952e2a narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents: 41042
diff changeset
   571
42949
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   572
    if not (widening or narrowing or autoremoveincludes):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   573
        ui.status(_(b"nothing to widen or narrow\n"))
40501
30a7d3b6b281 narrow: rework logic to check whether we need to widen and narrow
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40075
diff changeset
   574
        return 0
30a7d3b6b281 narrow: rework logic to check whether we need to widen and narrow
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40075
diff changeset
   575
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   576
    with repo.wlock(), repo.lock():
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   577
        cmdutil.bailifchanged(repo)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   578
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   579
        # Find the revisions we have in common with the remote. These will
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   580
        # be used for finding local-only changes for narrowing. They will
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   581
        # also define the set of revisions to update for widening.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   582
        remotepath = ui.expandpath(remotepath or b'default')
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   583
        url, branches = hg.parseurl(remotepath)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   584
        ui.status(_(b'comparing with %s\n') % util.hidepassword(url))
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   585
        remote = hg.peer(repo, opts, url)
39965
06e75fbf9d6b narrow: check for servers' narrow support before doing anything (BC)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39964
diff changeset
   586
06e75fbf9d6b narrow: check for servers' narrow support before doing anything (BC)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39964
diff changeset
   587
        # check narrow support before doing anything if widening needs to be
06e75fbf9d6b narrow: check for servers' narrow support before doing anything (BC)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39964
diff changeset
   588
        # performed. In future we should also abort if client is ellipses and
06e75fbf9d6b narrow: check for servers' narrow support before doing anything (BC)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39964
diff changeset
   589
        # server does not support ellipses
40075
f7011b44d205 wireprotoserver: move narrow capabilities to wireprototypes.py
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40071
diff changeset
   590
        if widening and wireprototypes.NARROWCAP not in remote.capabilities():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   591
            raise error.Abort(_(b"server does not support narrow clones"))
39965
06e75fbf9d6b narrow: check for servers' narrow support before doing anything (BC)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39964
diff changeset
   592
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   593
        commoninc = discovery.findcommonincoming(repo, remote)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   594
42949
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   595
        if autoremoveincludes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   596
            outgoing = discovery.findcommonoutgoing(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   597
                repo, remote, commoninc=commoninc
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   598
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   599
            ui.status(_(b'looking for unused includes to remove\n'))
42949
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   600
            localfiles = set()
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   601
            for n in itertools.chain(outgoing.missing, outgoing.excluded):
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   602
                localfiles.update(repo[n].files())
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   603
            suggestedremovals = []
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   604
            for include in sorted(oldincludes):
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   605
                match = narrowspec.match(repo.root, [include], oldexcludes)
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   606
                if not any(match(f) for f in localfiles):
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   607
                    suggestedremovals.append(include)
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   608
            if suggestedremovals:
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   609
                for s in suggestedremovals:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   610
                    ui.status(b'%s\n' % s)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   611
                if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   612
                    ui.promptchoice(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   613
                        _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   614
                            b'remove these unused includes (yn)?'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   615
                            b'$$ &Yes $$ &No'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   616
                        )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   617
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   618
                    == 0
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   619
                ):
42949
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   620
                    removedincludes.update(suggestedremovals)
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   621
                    narrowing = True
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   622
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   623
                ui.status(_(b'found no unused includes\n'))
42949
40f78072fda9 narrow: add option for automatically removing unused includes
Martin von Zweigbergk <martinvonz@google.com>
parents: 42948
diff changeset
   624
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   625
        if narrowing:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   626
            newincludes = oldincludes - removedincludes
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   627
            newexcludes = oldexcludes | addedexcludes
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   628
            _narrow(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   629
                ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   630
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   631
                remote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   632
                commoninc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   633
                oldincludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   634
                oldexcludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   635
                newincludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   636
                newexcludes,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   637
                opts[b'force_delete_local_changes'],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   638
            )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   639
            # _narrow() updated the narrowspec and _widen() below needs to
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   640
            # use the updated values as its base (otherwise removed includes
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   641
            # and addedexcludes will be lost in the resulting narrowspec)
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   642
            oldincludes = newincludes
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   643
            oldexcludes = newexcludes
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   644
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   645
        if widening:
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   646
            newincludes = oldincludes | addedincludes
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   647
            newexcludes = oldexcludes - removedexcludes
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   648
            _widen(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   649
                ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   650
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   651
                remote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   652
                commoninc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   653
                oldincludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   654
                oldexcludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   655
                newincludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   656
                newexcludes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42949
diff changeset
   657
            )
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   658
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff changeset
   659
    return 0