mercurial/cmdutil.py
author Julien Cristau <jcristau@debian.org>
Sat, 09 Apr 2022 14:23:52 +0200
changeset 49115 50bd2910d162
parent 49097 3f6ef67e7a60
child 49139 ea98850a136e
permissions -rw-r--r--
sslutil: be less strict about which ciphers are allowed when using --insecure Python 3.10 restricted which ciphers are enabled by default, leading to no available ciphers for TLS < 1.2. When using the --insecure flag we allow old TLS, so also adjust the cipher list to give connections a chance to work. On the server side, also loosen the cipher selection in tests (when using the devel.serverexactprotocol option). Differential Revision: https://phab.mercurial-scm.org/D12489
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2957
6e062d9b188f fix comment.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2885
diff changeset
     1
# cmdutil.py - help for command processing in mercurial
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     2
#
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 46796
diff changeset
     3
# Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8210
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10249
diff changeset
     6
# GNU General Public License version 2 or any later version.
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     7
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
     8
41330
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
     9
import copy as copymod
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    10
import errno
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    11
import os
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    12
import re
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    13
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    14
from .i18n import _
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    15
from .node import (
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    16
    hex,
46842
ad878e3f282b refactor: prefer lookup by revision, even for null
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
    17
    nullrev,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    18
    short,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    19
)
43087
66f2cc210a29 py3: manually import pycompat.setattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
    20
from .pycompat import (
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43087
diff changeset
    21
    getattr,
43087
66f2cc210a29 py3: manually import pycompat.setattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
    22
    open,
66f2cc210a29 py3: manually import pycompat.setattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
    23
    setattr,
66f2cc210a29 py3: manually import pycompat.setattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
    24
)
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
    25
from .thirdparty import attr
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    26
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    27
from . import (
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    28
    bookmarks,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    29
    changelog,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    30
    copies,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    31
    crecord as crecordmod,
33616
5ac845ca059a commit: don't let failed commit with --addremove update dirstate (issue5645)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33548
diff changeset
    32
    dirstateguard,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    33
    encoding,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    34
    error,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    35
    formatter,
35925
7625b4f7db70 cmdutil: split functions of log-like commands to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35914
diff changeset
    36
    logcmdutil,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    37
    match as matchmod,
36048
46a54de96a54 merge: cut import cycle at merge -> extensions
Yuya Nishihara <yuya@tcha.org>
parents: 36047
diff changeset
    38
    merge as mergemod,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44772
diff changeset
    39
    mergestate as mergestatemod,
35853
eeb87b24aea7 amend: abort if unresolved merge conflicts found (issue5805)
Yuya Nishihara <yuya@tcha.org>
parents: 35746
diff changeset
    40
    mergeutil,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    41
    obsolete,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    42
    patch,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    43
    pathutil,
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
    44
    phases,
30528
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30515
diff changeset
    45
    pycompat,
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
    46
    repair,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    47
    revlog,
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
    48
    rewriteutil,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    49
    scmutil,
42536
5f2f6912c9e6 states: moved cmdutil.unfinishedstates to state.py
Taapas Agrawal <taapas2897@gmail.com>
parents: 42494
diff changeset
    50
    state as statemod,
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35993
diff changeset
    51
    subrepoutil,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    52
    templatekw,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    53
    templater,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    54
    util,
31247
1b08aca7870a vfs: use 'vfs' module directly in 'mercurial.cmdutil'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31226
diff changeset
    55
    vfs as vfsmod,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    56
)
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
    57
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
    58
from .utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
    59
    dateutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
    60
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
    61
)
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
    62
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47062
diff changeset
    63
from .revlogutils import (
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47062
diff changeset
    64
    constants as revlog_constants,
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47062
diff changeset
    65
)
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47062
diff changeset
    66
43793
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43758
diff changeset
    67
if pycompat.TYPE_CHECKING:
43740
a58d2361b231 cmdutil: add a pytype annotation to help out some callsites
Augie Fackler <augie@google.com>
parents: 43738
diff changeset
    68
    from typing import (
a58d2361b231 cmdutil: add a pytype annotation to help out some callsites
Augie Fackler <augie@google.com>
parents: 43738
diff changeset
    69
        Any,
a58d2361b231 cmdutil: add a pytype annotation to help out some callsites
Augie Fackler <augie@google.com>
parents: 43738
diff changeset
    70
        Dict,
a58d2361b231 cmdutil: add a pytype annotation to help out some callsites
Augie Fackler <augie@google.com>
parents: 43738
diff changeset
    71
    )
a58d2361b231 cmdutil: add a pytype annotation to help out some callsites
Augie Fackler <augie@google.com>
parents: 43738
diff changeset
    72
a58d2361b231 cmdutil: add a pytype annotation to help out some callsites
Augie Fackler <augie@google.com>
parents: 43738
diff changeset
    73
    for t in (Any, Dict):
a58d2361b231 cmdutil: add a pytype annotation to help out some callsites
Augie Fackler <augie@google.com>
parents: 43738
diff changeset
    74
        assert t
a58d2361b231 cmdutil: add a pytype annotation to help out some callsites
Augie Fackler <augie@google.com>
parents: 43738
diff changeset
    75
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28837
diff changeset
    76
stringio = util.stringio
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    77
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
    78
# templates of common command options
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
    79
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
    80
dryrunopts = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    81
    (b'n', b'dry-run', None, _(b'do not perform actions, just print output')),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
    82
]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
    83
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38648
diff changeset
    84
confirmopts = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    85
    (b'', b'confirm', None, _(b'ask before applying actions')),
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38648
diff changeset
    86
]
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38648
diff changeset
    87
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
    88
remoteopts = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    89
    (b'e', b'ssh', b'', _(b'specify ssh command to use'), _(b'CMD')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
    90
    (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    91
        b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    92
        b'remotecmd',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    93
        b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    94
        _(b'specify hg command to run on the remote side'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    95
        _(b'CMD'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
    96
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
    97
    (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    98
        b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    99
        b'insecure',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   100
        None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   101
        _(b'do not verify server certificate (ignoring web.cacerts config)'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   102
    ),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   103
]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   104
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   105
walkopts = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   106
    (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   107
        b'I',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   108
        b'include',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   109
        [],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   110
        _(b'include names matching the given patterns'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   111
        _(b'PATTERN'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   112
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   113
    (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   114
        b'X',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   115
        b'exclude',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   116
        [],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   117
        _(b'exclude names matching the given patterns'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   118
        _(b'PATTERN'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   119
    ),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   120
]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   121
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   122
commitopts = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   123
    (b'm', b'message', b'', _(b'use text as commit message'), _(b'TEXT')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   124
    (b'l', b'logfile', b'', _(b'read commit message from file'), _(b'FILE')),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   125
]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   126
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   127
commitopts2 = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   128
    (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   129
        b'd',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   130
        b'date',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   131
        b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   132
        _(b'record the specified date as commit date'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   133
        _(b'DATE'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   134
    ),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   135
    (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   136
        b'u',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   137
        b'user',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   138
        b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   139
        _(b'record the specified user as committer'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   140
        _(b'USER'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   141
    ),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   142
]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   143
42909
66048f6b5d0d uncommit: add options to update to the current user or current date
Matt Harbison <matt_harbison@yahoo.com>
parents: 42898
diff changeset
   144
commitopts3 = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   145
    (b'D', b'currentdate', None, _(b'record the current date as commit date')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   146
    (b'U', b'currentuser', None, _(b'record the current user as committer')),
42909
66048f6b5d0d uncommit: add options to update to the current user or current date
Matt Harbison <matt_harbison@yahoo.com>
parents: 42898
diff changeset
   147
]
66048f6b5d0d uncommit: add options to update to the current user or current date
Matt Harbison <matt_harbison@yahoo.com>
parents: 42898
diff changeset
   148
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   149
formatteropts = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   150
    (b'T', b'template', b'', _(b'display with template'), _(b'TEMPLATE')),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   151
]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   152
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   153
templateopts = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   154
    (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   155
        b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   156
        b'style',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   157
        b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   158
        _(b'display using template map file (DEPRECATED)'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   159
        _(b'STYLE'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   160
    ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   161
    (b'T', b'template', b'', _(b'display with template'), _(b'TEMPLATE')),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   162
]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   163
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   164
logopts = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   165
    (b'p', b'patch', None, _(b'show patch')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   166
    (b'g', b'git', None, _(b'use git extended diff format')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   167
    (b'l', b'limit', b'', _(b'limit number of changes displayed'), _(b'NUM')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   168
    (b'M', b'no-merges', None, _(b'do not show merges')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   169
    (b'', b'stat', None, _(b'output diffstat-style summary of changes')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   170
    (b'G', b'graph', None, _(b"show the revision DAG")),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   171
] + templateopts
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   172
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   173
diffopts = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   174
    (b'a', b'text', None, _(b'treat all files as text')),
44349
a0ec05d93c8e cleanup: re-run black on the codebase
Augie Fackler <augie@google.com>
parents: 44342
diff changeset
   175
    (
a0ec05d93c8e cleanup: re-run black on the codebase
Augie Fackler <augie@google.com>
parents: 44342
diff changeset
   176
        b'g',
a0ec05d93c8e cleanup: re-run black on the codebase
Augie Fackler <augie@google.com>
parents: 44342
diff changeset
   177
        b'git',
a0ec05d93c8e cleanup: re-run black on the codebase
Augie Fackler <augie@google.com>
parents: 44342
diff changeset
   178
        None,
a0ec05d93c8e cleanup: re-run black on the codebase
Augie Fackler <augie@google.com>
parents: 44342
diff changeset
   179
        _(b'use git extended diff format (DEFAULT: diff.git)'),
a0ec05d93c8e cleanup: re-run black on the codebase
Augie Fackler <augie@google.com>
parents: 44342
diff changeset
   180
    ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   181
    (b'', b'binary', None, _(b'generate binary diffs in git mode (default)')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   182
    (b'', b'nodates', None, _(b'omit dates from diff headers')),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   183
]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   184
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   185
diffwsopts = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   186
    (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   187
        b'w',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   188
        b'ignore-all-space',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   189
        None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   190
        _(b'ignore white space when comparing lines'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   191
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   192
    (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   193
        b'b',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   194
        b'ignore-space-change',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   195
        None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   196
        _(b'ignore changes in the amount of white space'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   197
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   198
    (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   199
        b'B',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   200
        b'ignore-blank-lines',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   201
        None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   202
        _(b'ignore changes whose lines are all blank'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   203
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   204
    (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   205
        b'Z',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   206
        b'ignore-space-at-eol',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   207
        None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   208
        _(b'ignore changes in whitespace at EOL'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   209
    ),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   210
]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   211
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   212
diffopts2 = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   213
    [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   214
        (b'', b'noprefix', None, _(b'omit a/ and b/ prefixes from filenames')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   215
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   216
            b'p',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   217
            b'show-function',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   218
            None,
44349
a0ec05d93c8e cleanup: re-run black on the codebase
Augie Fackler <augie@google.com>
parents: 44342
diff changeset
   219
            _(
a0ec05d93c8e cleanup: re-run black on the codebase
Augie Fackler <augie@google.com>
parents: 44342
diff changeset
   220
                b'show which function each change is in (DEFAULT: diff.showfunc)'
a0ec05d93c8e cleanup: re-run black on the codebase
Augie Fackler <augie@google.com>
parents: 44342
diff changeset
   221
            ),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   222
        ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   223
        (b'', b'reverse', None, _(b'produce a diff that undoes the changes')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   224
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   225
    + diffwsopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   226
    + [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   227
        (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   228
            b'U',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   229
            b'unified',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   230
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   231
            _(b'number of lines of context to show'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   232
            _(b'NUM'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   233
        ),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   234
        (b'', b'stat', None, _(b'output diffstat-style summary of changes')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   235
        (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   236
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   237
            b'root',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   238
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   239
            _(b'produce diffs relative to subdirectory'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   240
            _(b'DIR'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   241
        ),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   242
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   243
)
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   244
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   245
mergetoolopts = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   246
    (b't', b'tool', b'', _(b'specify merge tool'), _(b'TOOL')),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   247
]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   248
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   249
similarityopts = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   250
    (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   251
        b's',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   252
        b'similarity',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   253
        b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   254
        _(b'guess renamed files by similarity (0<=s<=100)'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   255
        _(b'SIMILARITY'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   256
    )
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   257
]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   258
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   259
subrepoopts = [(b'S', b'subrepos', None, _(b'recurse into subrepositories'))]
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   260
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   261
debugrevlogopts = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   262
    (b'c', b'changelog', False, _(b'open changelog')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   263
    (b'm', b'manifest', False, _(b'open manifest')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   264
    (b'', b'dir', b'', _(b'open directory manifest')),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   265
]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
   266
30703
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
   267
# special string such that everything below this line will be ingored in the
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
   268
# editor text
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   269
_linebelow = b"^HG: ------------------------ >8 ------------------------$"
30703
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
   270
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   271
43898
d587937600be clone: extract helper for checking mutually exclusive args
Martin von Zweigbergk <martinvonz@google.com>
parents: 43872
diff changeset
   272
def check_at_most_one_arg(opts, *args):
43905
fff21278554b rebase: use cmdutil.check_at_most_one_arg() for action
Martin von Zweigbergk <martinvonz@google.com>
parents: 43904
diff changeset
   273
    """abort if more than one of the arguments are in opts
fff21278554b rebase: use cmdutil.check_at_most_one_arg() for action
Martin von Zweigbergk <martinvonz@google.com>
parents: 43904
diff changeset
   274
fff21278554b rebase: use cmdutil.check_at_most_one_arg() for action
Martin von Zweigbergk <martinvonz@google.com>
parents: 43904
diff changeset
   275
    Returns the unique argument or None if none of them were specified.
fff21278554b rebase: use cmdutil.check_at_most_one_arg() for action
Martin von Zweigbergk <martinvonz@google.com>
parents: 43904
diff changeset
   276
    """
43947
dfac25883dbf cmdutil: return underscore-separate name from check_at_most_one_arg()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43945
diff changeset
   277
dfac25883dbf cmdutil: return underscore-separate name from check_at_most_one_arg()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43945
diff changeset
   278
    def to_display(name):
43948
6c8108274dc5 cmdutil: allow native string as input to check_at_most_one_arg()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43947
diff changeset
   279
        return pycompat.sysbytes(name).replace(b'_', b'-')
43947
dfac25883dbf cmdutil: return underscore-separate name from check_at_most_one_arg()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43945
diff changeset
   280
43898
d587937600be clone: extract helper for checking mutually exclusive args
Martin von Zweigbergk <martinvonz@google.com>
parents: 43872
diff changeset
   281
    previous = None
d587937600be clone: extract helper for checking mutually exclusive args
Martin von Zweigbergk <martinvonz@google.com>
parents: 43872
diff changeset
   282
    for x in args:
d587937600be clone: extract helper for checking mutually exclusive args
Martin von Zweigbergk <martinvonz@google.com>
parents: 43872
diff changeset
   283
        if opts.get(x):
d587937600be clone: extract helper for checking mutually exclusive args
Martin von Zweigbergk <martinvonz@google.com>
parents: 43872
diff changeset
   284
            if previous:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
   285
                raise error.InputError(
43947
dfac25883dbf cmdutil: return underscore-separate name from check_at_most_one_arg()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43945
diff changeset
   286
                    _(b'cannot specify both --%s and --%s')
dfac25883dbf cmdutil: return underscore-separate name from check_at_most_one_arg()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43945
diff changeset
   287
                    % (to_display(previous), to_display(x))
43898
d587937600be clone: extract helper for checking mutually exclusive args
Martin von Zweigbergk <martinvonz@google.com>
parents: 43872
diff changeset
   288
                )
d587937600be clone: extract helper for checking mutually exclusive args
Martin von Zweigbergk <martinvonz@google.com>
parents: 43872
diff changeset
   289
            previous = x
43905
fff21278554b rebase: use cmdutil.check_at_most_one_arg() for action
Martin von Zweigbergk <martinvonz@google.com>
parents: 43904
diff changeset
   290
    return previous
43898
d587937600be clone: extract helper for checking mutually exclusive args
Martin von Zweigbergk <martinvonz@google.com>
parents: 43872
diff changeset
   291
d587937600be clone: extract helper for checking mutually exclusive args
Martin von Zweigbergk <martinvonz@google.com>
parents: 43872
diff changeset
   292
44269
d4c1501225c4 cmdutil: change check_incompatible_arguments() *arg to single iterable
Martin von Zweigbergk <martinvonz@google.com>
parents: 44098
diff changeset
   293
def check_incompatible_arguments(opts, first, others):
43904
023ad45e2fd2 releasenotes: extract helper for checking for incompatible arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43900
diff changeset
   294
    """abort if the first argument is given along with any of the others
023ad45e2fd2 releasenotes: extract helper for checking for incompatible arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43900
diff changeset
   295
023ad45e2fd2 releasenotes: extract helper for checking for incompatible arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43900
diff changeset
   296
    Unlike check_at_most_one_arg(), `others` are not mutually exclusive
44269
d4c1501225c4 cmdutil: change check_incompatible_arguments() *arg to single iterable
Martin von Zweigbergk <martinvonz@google.com>
parents: 44098
diff changeset
   297
    among themselves, and they're passed as a single collection.
43904
023ad45e2fd2 releasenotes: extract helper for checking for incompatible arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43900
diff changeset
   298
    """
023ad45e2fd2 releasenotes: extract helper for checking for incompatible arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43900
diff changeset
   299
    for other in others:
023ad45e2fd2 releasenotes: extract helper for checking for incompatible arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43900
diff changeset
   300
        check_at_most_one_arg(opts, first, other)
023ad45e2fd2 releasenotes: extract helper for checking for incompatible arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43900
diff changeset
   301
023ad45e2fd2 releasenotes: extract helper for checking for incompatible arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43900
diff changeset
   302
47438
7f7457f84311 cmdutil: make resolvecommitoptions() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
   303
def resolve_commit_options(ui, opts):
42909
66048f6b5d0d uncommit: add options to update to the current user or current date
Matt Harbison <matt_harbison@yahoo.com>
parents: 42898
diff changeset
   304
    """modify commit options dict to handle related options
42936
e4803231f538 amend: add option to update to the current user
Matt Harbison <matt_harbison@yahoo.com>
parents: 42925
diff changeset
   305
e4803231f538 amend: add option to update to the current user
Matt Harbison <matt_harbison@yahoo.com>
parents: 42925
diff changeset
   306
    The return value indicates that ``rewrite.update-timestamp`` is the reason
e4803231f538 amend: add option to update to the current user
Matt Harbison <matt_harbison@yahoo.com>
parents: 42925
diff changeset
   307
    the ``date`` option is set.
42909
66048f6b5d0d uncommit: add options to update to the current user or current date
Matt Harbison <matt_harbison@yahoo.com>
parents: 42898
diff changeset
   308
    """
47438
7f7457f84311 cmdutil: make resolvecommitoptions() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
   309
    check_at_most_one_arg(opts, 'date', 'currentdate')
7f7457f84311 cmdutil: make resolvecommitoptions() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
   310
    check_at_most_one_arg(opts, 'user', 'currentuser')
42925
4690902850df uncommit: make -D/--date and -U/--user mutually exclusive
Matt Harbison <matt_harbison@yahoo.com>
parents: 42924
diff changeset
   311
42936
e4803231f538 amend: add option to update to the current user
Matt Harbison <matt_harbison@yahoo.com>
parents: 42925
diff changeset
   312
    datemaydiffer = False  # date-only change should be ignored?
e4803231f538 amend: add option to update to the current user
Matt Harbison <matt_harbison@yahoo.com>
parents: 42925
diff changeset
   313
47438
7f7457f84311 cmdutil: make resolvecommitoptions() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
   314
    if opts.get('currentdate'):
7f7457f84311 cmdutil: make resolvecommitoptions() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
   315
        opts['date'] = b'%d %d' % dateutil.makedate()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   316
    elif (
47438
7f7457f84311 cmdutil: make resolvecommitoptions() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
   317
        not opts.get('date')
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   318
        and ui.configbool(b'rewrite', b'update-timestamp')
47438
7f7457f84311 cmdutil: make resolvecommitoptions() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
   319
        and opts.get('currentdate') is None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   320
    ):
47438
7f7457f84311 cmdutil: make resolvecommitoptions() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
   321
        opts['date'] = b'%d %d' % dateutil.makedate()
42936
e4803231f538 amend: add option to update to the current user
Matt Harbison <matt_harbison@yahoo.com>
parents: 42925
diff changeset
   322
        datemaydiffer = True
e4803231f538 amend: add option to update to the current user
Matt Harbison <matt_harbison@yahoo.com>
parents: 42925
diff changeset
   323
47438
7f7457f84311 cmdutil: make resolvecommitoptions() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
   324
    if opts.get('currentuser'):
7f7457f84311 cmdutil: make resolvecommitoptions() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
   325
        opts['user'] = ui.username()
42909
66048f6b5d0d uncommit: add options to update to the current user or current date
Matt Harbison <matt_harbison@yahoo.com>
parents: 42898
diff changeset
   326
42936
e4803231f538 amend: add option to update to the current user
Matt Harbison <matt_harbison@yahoo.com>
parents: 42925
diff changeset
   327
    return datemaydiffer
e4803231f538 amend: add option to update to the current user
Matt Harbison <matt_harbison@yahoo.com>
parents: 42925
diff changeset
   328
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   329
47434
54849b65dc5f cmdutil: make checknotesize() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47164
diff changeset
   330
def check_note_size(opts):
47031
f38bf44e077f black: make codebase compatible with black v21.4b2 and v20.8b1
Kyle Lippincott <spectral@google.com>
parents: 46969
diff changeset
   331
    """make sure note is of valid format"""
42937
7e9997041781 amend: prevent '\n' in the note string
Matt Harbison <matt_harbison@yahoo.com>
parents: 42936
diff changeset
   332
47434
54849b65dc5f cmdutil: make checknotesize() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47164
diff changeset
   333
    note = opts.get('note')
42937
7e9997041781 amend: prevent '\n' in the note string
Matt Harbison <matt_harbison@yahoo.com>
parents: 42936
diff changeset
   334
    if not note:
7e9997041781 amend: prevent '\n' in the note string
Matt Harbison <matt_harbison@yahoo.com>
parents: 42936
diff changeset
   335
        return
7e9997041781 amend: prevent '\n' in the note string
Matt Harbison <matt_harbison@yahoo.com>
parents: 42936
diff changeset
   336
7e9997041781 amend: prevent '\n' in the note string
Matt Harbison <matt_harbison@yahoo.com>
parents: 42936
diff changeset
   337
    if len(note) > 255:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
   338
        raise error.InputError(_(b"cannot store a note of more than 255 bytes"))
42937
7e9997041781 amend: prevent '\n' in the note string
Matt Harbison <matt_harbison@yahoo.com>
parents: 42936
diff changeset
   339
    if b'\n' in note:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
   340
        raise error.InputError(_(b"note cannot contain a newline"))
42937
7e9997041781 amend: prevent '\n' in the note string
Matt Harbison <matt_harbison@yahoo.com>
parents: 42936
diff changeset
   341
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   342
25256
5a8398b085ed record: extract ishunk to a function
Laurent Charignon <lcharignon@fb.com>
parents: 25228
diff changeset
   343
def ishunk(x):
5a8398b085ed record: extract ishunk to a function
Laurent Charignon <lcharignon@fb.com>
parents: 25228
diff changeset
   344
    hunkclasses = (crecordmod.uihunk, patch.recordhunk)
5a8398b085ed record: extract ishunk to a function
Laurent Charignon <lcharignon@fb.com>
parents: 25228
diff changeset
   345
    return isinstance(x, hunkclasses)
5a8398b085ed record: extract ishunk to a function
Laurent Charignon <lcharignon@fb.com>
parents: 25228
diff changeset
   346
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   347
47565
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   348
def isheader(x):
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   349
    headerclasses = (crecordmod.uiheader, patch.header)
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   350
    return isinstance(x, headerclasses)
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   351
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   352
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   353
def newandmodified(chunks):
25257
07326d76f19d record: extract code to compute newly added and modified files
Laurent Charignon <lcharignon@fb.com>
parents: 25256
diff changeset
   354
    newlyaddedandmodifiedfiles = set()
42862
3cf091843b4f split: handle partial commit of renames when doing split or record (issue5723)
Kyle Lippincott <spectral@google.com>
parents: 42643
diff changeset
   355
    alsorestore = set()
25257
07326d76f19d record: extract code to compute newly added and modified files
Laurent Charignon <lcharignon@fb.com>
parents: 25256
diff changeset
   356
    for chunk in chunks:
47565
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   357
        if isheader(chunk) and chunk.isnewfile():
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   358
            newlyaddedandmodifiedfiles.add(chunk.filename())
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   359
            alsorestore.update(set(chunk.files()) - {chunk.filename()})
42862
3cf091843b4f split: handle partial commit of renames when doing split or record (issue5723)
Kyle Lippincott <spectral@google.com>
parents: 42643
diff changeset
   360
    return newlyaddedandmodifiedfiles, alsorestore
25257
07326d76f19d record: extract code to compute newly added and modified files
Laurent Charignon <lcharignon@fb.com>
parents: 25256
diff changeset
   361
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   362
10401
6252852b4332 mq: add -Q option to all commands not in norepo
Brendan Cully <brendan@kublai.com>
parents: 10344
diff changeset
   363
def parsealiases(cmd):
46241
012e25abc603 command: automatically create alias for command using '-' in names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   364
    base_aliases = cmd.split(b"|")
012e25abc603 command: automatically create alias for command using '-' in names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   365
    all_aliases = set(base_aliases)
012e25abc603 command: automatically create alias for command using '-' in names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   366
    extra_aliases = []
012e25abc603 command: automatically create alias for command using '-' in names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   367
    for alias in base_aliases:
012e25abc603 command: automatically create alias for command using '-' in names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   368
        if b'-' in alias:
012e25abc603 command: automatically create alias for command using '-' in names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   369
            folded_alias = alias.replace(b'-', b'')
012e25abc603 command: automatically create alias for command using '-' in names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   370
            if folded_alias not in all_aliases:
012e25abc603 command: automatically create alias for command using '-' in names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   371
                all_aliases.add(folded_alias)
012e25abc603 command: automatically create alias for command using '-' in names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   372
                extra_aliases.append(folded_alias)
012e25abc603 command: automatically create alias for command using '-' in names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   373
    base_aliases.extend(extra_aliases)
012e25abc603 command: automatically create alias for command using '-' in names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   374
    return base_aliases
10401
6252852b4332 mq: add -Q option to all commands not in norepo
Brendan Cully <brendan@kublai.com>
parents: 10344
diff changeset
   375
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   376
24356
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
   377
def setupwrapcolorwrite(ui):
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
   378
    # wrap ui.write so diff output can be labeled/colorized
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
   379
    def wrapwrite(orig, *args, **kw):
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43539
diff changeset
   380
        label = kw.pop('label', b'')
24356
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
   381
        for chunk, l in patch.difflabel(lambda: args):
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
   382
            orig(chunk, label=label + l)
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
   383
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
   384
    oldwrite = ui.write
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   385
24356
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
   386
    def wrap(*args, **kwargs):
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
   387
        return wrapwrite(oldwrite, *args, **kwargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   388
24356
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
   389
    setattr(ui, 'write', wrap)
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
   390
    return oldwrite
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
   391
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   392
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   393
def filterchunks(ui, originalhunks, usecurses, testfile, match, operation=None):
38080
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
   394
    try:
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
   395
        if usecurses:
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
   396
            if testfile:
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
   397
                recordfn = crecordmod.testdecorator(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   398
                    testfile, crecordmod.testchunkselector
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   399
                )
38080
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
   400
            else:
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
   401
                recordfn = crecordmod.chunkselector
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
   402
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   403
            return crecordmod.filterpatch(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   404
                ui, originalhunks, recordfn, operation
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   405
            )
38080
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
   406
    except crecordmod.fallbackerror as e:
44098
19533e4c3450 py3: fix curses chunkselector fallback (when diffs are too large) on py3
Kyle Lippincott <spectral@google.com>
parents: 44049
diff changeset
   407
        ui.warn(b'%s\n' % e)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   408
        ui.warn(_(b'falling back to text mode\n'))
38080
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
   409
42071
db72f9f6580e interactive: do not prompt about files given in command line
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 42057
diff changeset
   410
    return patch.filterpatch(ui, originalhunks, match, operation)
db72f9f6580e interactive: do not prompt about files given in command line
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 42057
diff changeset
   411
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   412
42071
db72f9f6580e interactive: do not prompt about files given in command line
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 42057
diff changeset
   413
def recordfilter(ui, originalhunks, match, operation=None):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
   414
    """Prompts the user to filter the originalhunks and return a list of
25310
c1f5ef76d1c2 record: add an operation arguments to customize recording ui
Laurent Charignon <lcharignon@fb.com>
parents: 25273
diff changeset
   415
    selected hunks.
29326
d48fc6f318a3 patch: define full messages for interactive record/revert
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29283
diff changeset
   416
    *operation* is used for to build ui messages to indicate the user what
d48fc6f318a3 patch: define full messages for interactive record/revert
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29283
diff changeset
   417
    kind of filtering they are doing: reverting, committing, shelving, etc.
d48fc6f318a3 patch: define full messages for interactive record/revert
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29283
diff changeset
   418
    (see patch.filterpatch).
25310
c1f5ef76d1c2 record: add an operation arguments to customize recording ui
Laurent Charignon <lcharignon@fb.com>
parents: 25273
diff changeset
   419
    """
27531
84d686cb62c4 cmdutil: use crecordmod.checkcurses
Sean Farley <sean@farley.io>
parents: 27370
diff changeset
   420
    usecurses = crecordmod.checkcurses(ui)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   421
    testfile = ui.config(b'experimental', b'crecordtest')
24358
8d9e9063b040 record: move ui.write wrapping where it should be
Laurent Charignon <lcharignon@fb.com>
parents: 24357
diff changeset
   422
    oldwrite = setupwrapcolorwrite(ui)
8d9e9063b040 record: move ui.write wrapping where it should be
Laurent Charignon <lcharignon@fb.com>
parents: 24357
diff changeset
   423
    try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   424
        newchunks, newopts = filterchunks(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   425
            ui, originalhunks, usecurses, testfile, match, operation
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   426
        )
24358
8d9e9063b040 record: move ui.write wrapping where it should be
Laurent Charignon <lcharignon@fb.com>
parents: 24357
diff changeset
   427
    finally:
8d9e9063b040 record: move ui.write wrapping where it should be
Laurent Charignon <lcharignon@fb.com>
parents: 24357
diff changeset
   428
        ui.write = oldwrite
27155
8d3c5797a175 commit: add a way to return more information from the chunkselector
Laurent Charignon <lcharignon@fb.com>
parents: 27148
diff changeset
   429
    return newchunks, newopts
24357
2da601ab3125 record: refactor the filtering code
Laurent Charignon <lcharignon@fb.com>
parents: 24356
diff changeset
   430
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   431
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   432
def dorecord(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   433
    ui, repo, commitfunc, cmdsuggest, backupall, filterfn, *pats, **opts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   434
):
32193
93155367a2a6 py3: convert opts to bytes in cmdutil.dorecord()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32046
diff changeset
   435
    opts = pycompat.byteskwargs(opts)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   436
    if not ui.interactive():
25795
69145daacdfa cmdutil: allow callers of cmdutil.dorecord to omit suggestion
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25763
diff changeset
   437
        if cmdsuggest:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   438
            msg = _(b'running non-interactively, use %s instead') % cmdsuggest
25795
69145daacdfa cmdutil: allow callers of cmdutil.dorecord to omit suggestion
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25763
diff changeset
   439
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   440
            msg = _(b'running non-interactively')
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
   441
        raise error.InputError(msg)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   442
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   443
    # make sure username is set before going interactive
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   444
    if not opts.get(b'user'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   445
        ui.username()  # raise exception, username not provided
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   446
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   447
    def recordfunc(ui, repo, message, match, opts):
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   448
        """This is generic record driver.
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   449
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   450
        Its job is to interactively filter local changes, and
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   451
        accordingly prepare working directory into a state in which the
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   452
        job can be delegated to a non-interactive commit command such as
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   453
        'commit' or 'qrefresh'.
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   454
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   455
        After the actual job is done by non-interactive command, the
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   456
        working directory is restored to its original state.
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   457
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   458
        In the end we'll record interesting changes, and everything else
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   459
        will be left in place, so the user can continue working.
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   460
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   461
        if not opts.get(b'interactive-unshelve'):
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42582
diff changeset
   462
            checkunfinished(repo, commit=True)
28815
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
   463
        wctx = repo[None]
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
   464
        merge = len(wctx.parents()) > 1
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   465
        if merge:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
   466
            raise error.InputError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   467
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   468
                    b'cannot partially commit a merge '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   469
                    b'(use "hg commit" instead)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   470
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   471
            )
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   472
42163
e45c6b153e51 commit: allow --interactive to work again when naming a directory (issue6131)
Matt Harbison <matt_harbison@yahoo.com>
parents: 42071
diff changeset
   473
        def fail(f, msg):
45865
96ca817ec192 errors: raise InputError when given non-existent paths etc
Martin von Zweigbergk <martinvonz@google.com>
parents: 45859
diff changeset
   474
            raise error.InputError(b'%s: %s' % (f, msg))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   475
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   476
        force = opts.get(b'force')
42163
e45c6b153e51 commit: allow --interactive to work again when naming a directory (issue6131)
Matt Harbison <matt_harbison@yahoo.com>
parents: 42071
diff changeset
   477
        if not force:
42297
19b95afb0c01 record: avoid modifying the matcher passed as a method parameter
Matt Harbison <matt_harbison@yahoo.com>
parents: 42163
diff changeset
   478
            match = matchmod.badmatch(match, fail)
42163
e45c6b153e51 commit: allow --interactive to work again when naming a directory (issue6131)
Matt Harbison <matt_harbison@yahoo.com>
parents: 42071
diff changeset
   479
41330
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   480
        status = repo.status(match=match)
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   481
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   482
        overrides = {(b'ui', b'commitsubrepos'): True}
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   483
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   484
        with repo.ui.configoverride(overrides, b'record'):
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   485
            # subrepoutil.precommit() modifies the status
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   486
            tmpstatus = scmutil.status(
43688
e01e0641f18a cmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43571
diff changeset
   487
                copymod.copy(status.modified),
e01e0641f18a cmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43571
diff changeset
   488
                copymod.copy(status.added),
e01e0641f18a cmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43571
diff changeset
   489
                copymod.copy(status.removed),
e01e0641f18a cmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43571
diff changeset
   490
                copymod.copy(status.deleted),
e01e0641f18a cmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43571
diff changeset
   491
                copymod.copy(status.unknown),
e01e0641f18a cmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43571
diff changeset
   492
                copymod.copy(status.ignored),
e01e0641f18a cmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43571
diff changeset
   493
                copymod.copy(status.clean),  # pytype: disable=wrong-arg-count
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   494
            )
41330
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   495
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   496
            # Force allows -X subrepo to skip the subrepo.
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   497
            subs, commitsubs, newstate = subrepoutil.precommit(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   498
                repo.ui, wctx, tmpstatus, match, force=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   499
            )
41330
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   500
            for s in subs:
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   501
                if s in commitsubs:
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   502
                    dirtyreason = wctx.sub(s).dirtyreason(True)
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   503
                    raise error.Abort(dirtyreason)
4ea21df312ec record: prevent commits that don't pick up dirty subrepo changes (issue6102)
Matt Harbison <matt_harbison@yahoo.com>
parents: 41206
diff changeset
   504
28815
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
   505
        if not force:
43751
f965b1027fb0 commit: drop unused "vdirs" argument from repo.checkcommitpatterns()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43740
diff changeset
   506
            repo.checkcommitpatterns(wctx, match, status, fail)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   507
        diffopts = patch.difffeatureopts(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   508
            ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   509
            opts=opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   510
            whitespace=True,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   511
            section=b'commands',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   512
            configprefix=b'commit.interactive.',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   513
        )
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   514
        diffopts.nodates = True
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   515
        diffopts.git = True
27411
c84a07530040 record: turn on showfunc
timeless <timeless@mozdev.org>
parents: 27391
diff changeset
   516
        diffopts.showfunc = True
27637
b502138f5faa cleanup: remove superfluous space after space after equals (python)
timeless <timeless@mozdev.org>
parents: 27625
diff changeset
   517
        originaldiff = patch.diff(repo, changes=status, opts=diffopts)
47565
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   518
        original_headers = patch.parsepatch(originaldiff)
42071
db72f9f6580e interactive: do not prompt about files given in command line
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 42057
diff changeset
   519
        match = scmutil.match(repo[None], pats)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   520
28570
5508cf9a52fe crecord: rewrite a comment about filtering patches
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28452
diff changeset
   521
        # 1. filter patch, since we are intending to apply subset of it
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   522
        try:
47565
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   523
            chunks, newopts = filterfn(ui, original_headers, match)
48411
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
   524
        except error.PatchParseError as err:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
   525
            raise error.InputError(_(b'error parsing patch: %s') % err)
48411
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
   526
        except error.PatchApplicationError as err:
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
   527
            raise error.StateError(_(b'error applying patch: %s') % err)
27155
8d3c5797a175 commit: add a way to return more information from the chunkselector
Laurent Charignon <lcharignon@fb.com>
parents: 27148
diff changeset
   528
        opts.update(newopts)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   529
24845
8133494accf1 record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 24843
diff changeset
   530
        # We need to keep a backup of files that have been newly added and
8133494accf1 record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 24843
diff changeset
   531
        # modified during the recording process because there is a previous
42862
3cf091843b4f split: handle partial commit of renames when doing split or record (issue5723)
Kyle Lippincott <spectral@google.com>
parents: 42643
diff changeset
   532
        # version without the edit in the workdir. We also will need to restore
3cf091843b4f split: handle partial commit of renames when doing split or record (issue5723)
Kyle Lippincott <spectral@google.com>
parents: 42643
diff changeset
   533
        # files that were the sources of renames so that the patch application
3cf091843b4f split: handle partial commit of renames when doing split or record (issue5723)
Kyle Lippincott <spectral@google.com>
parents: 42643
diff changeset
   534
        # works.
47565
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   535
        newlyaddedandmodifiedfiles, alsorestore = newandmodified(chunks)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   536
        contenders = set()
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   537
        for h in chunks:
47565
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
   538
            if isheader(h):
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   539
                contenders.update(set(h.files()))
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   540
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   541
        changed = status.modified + status.added + status.removed
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   542
        newfiles = [f for f in changed if f in contenders]
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   543
        if not newfiles:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   544
            ui.status(_(b'no changes to record\n'))
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   545
            return 0
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   546
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   547
        modified = set(status.modified)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   548
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   549
        # 2. backup changed files, so we can restore them in the end
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   550
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   551
        if backupall:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   552
            tobackup = changed
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   553
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   554
            tobackup = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   555
                f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   556
                for f in newfiles
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   557
                if f in modified or f in newlyaddedandmodifiedfiles
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   558
            ]
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   559
        backups = {}
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   560
        if tobackup:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   561
            backupdir = repo.vfs.join(b'record-backups')
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   562
            try:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   563
                os.mkdir(backupdir)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25657
diff changeset
   564
            except OSError as err:
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   565
                if err.errno != errno.EEXIST:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   566
                    raise
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   567
        try:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   568
            # backup continues
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   569
            for f in tobackup:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   570
                fd, tmpname = pycompat.mkstemp(
45716
9628d3cd9d13 record: when backing up, avoid generating very long filenames
Kyle Lippincott <spectral@google.com>
parents: 45653
diff changeset
   571
                    prefix=os.path.basename(f) + b'.', dir=backupdir
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   572
                )
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   573
                os.close(fd)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   574
                ui.debug(b'backup %r as %r\n' % (f, tmpname))
27370
d9e3ebe56970 record: don't dereference symlinks while copying over stat data
Siddharth Agarwal <sid0@fb.com>
parents: 26781
diff changeset
   575
                util.copyfile(repo.wjoin(f), tmpname, copystat=True)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   576
                backups[f] = tmpname
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   577
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28837
diff changeset
   578
            fp = stringio()
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   579
            for c in chunks:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   580
                fname = c.filename()
24837
edf907bd8144 record: fix record with change on moved file crashes (issue4619)
Laurent Charignon <lcharignon@fb.com>
parents: 24720
diff changeset
   581
                if fname in backups:
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   582
                    c.write(fp)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   583
            dopatch = fp.tell()
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   584
            fp.seek(0)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   585
28638
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
   586
            # 2.5 optionally review / modify patch in text editor
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   587
            if opts.get(b'review', False):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   588
                patchtext = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   589
                    crecordmod.diffhelptext
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   590
                    + crecordmod.patchhelptext
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   591
                    + fp.read()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   592
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   593
                reviewedpatch = ui.edit(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   594
                    patchtext, b"", action=b"diff", repopath=repo.path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   595
                )
28638
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
   596
                fp.truncate(0)
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
   597
                fp.write(reviewedpatch)
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
   598
                fp.seek(0)
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
   599
24866
e1ec3d075c67 record: fix adding new file with record from within a subdir (issue4626)
Laurent Charignon <lcharignon@fb.com>
parents: 24864
diff changeset
   600
            [os.unlink(repo.wjoin(c)) for c in newlyaddedandmodifiedfiles]
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   601
            # 3a. apply filtered patch to clean repo  (clean)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   602
            if backups:
42862
3cf091843b4f split: handle partial commit of renames when doing split or record (issue5723)
Kyle Lippincott <spectral@google.com>
parents: 42643
diff changeset
   603
                m = scmutil.matchfiles(repo, set(backups.keys()) | alsorestore)
44318
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44269
diff changeset
   604
                mergemod.revert_to(repo[b'.'], matcher=m)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   605
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   606
            # 3b. (apply)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   607
            if dopatch:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   608
                try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   609
                    ui.debug(b'applying patch\n')
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   610
                    ui.debug(fp.getvalue())
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   611
                    patch.internalpatch(ui, repo, fp, 1, eolmode=None)
48411
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
   612
                except error.PatchParseError as err:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
   613
                    raise error.InputError(pycompat.bytestr(err))
48411
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
   614
                except error.PatchApplicationError as err:
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
   615
                    raise error.StateError(pycompat.bytestr(err))
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   616
            del fp
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   617
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   618
            # 4. We prepared working directory according to filtered
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   619
            #    patch. Now is the time to delegate the job to
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   620
            #    commit/qrefresh or the like!
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   621
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   622
            # Make all of the pathnames absolute.
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   623
            newfiles = [repo.wjoin(nf) for nf in newfiles]
35359
82ee401135dd py3: handle keyword arguments correctly in cmdutil.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35286
diff changeset
   624
            return commitfunc(ui, repo, *newfiles, **pycompat.strkwargs(opts))
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   625
        finally:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   626
            # 5. finally restore backed-up files
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   627
            try:
25759
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
   628
                dirstate = repo.dirstate
49004
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
   629
                for realname, tmpname in backups.items():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   630
                    ui.debug(b'restoring %r to %r\n' % (tmpname, realname))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   631
48112
571dd808c6c8 dirstate-item: use `maybe_clean` instead of `state` in record
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47746
diff changeset
   632
                    if dirstate.get_entry(realname).maybe_clean:
25759
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
   633
                        # without normallookup, restoring timestamp
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
   634
                        # may cause partially committed files
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
   635
                        # to be treated as unmodified
47730
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   636
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   637
                        # XXX-PENDINGCHANGE: We should clarify the context in
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   638
                        # which this function is called  to make sure it
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   639
                        # already called within a `pendingchange`, However we
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   640
                        # are taking a shortcut here in order to be able to
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   641
                        # quickly deprecated the older API.
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   642
                        with dirstate.parentchange():
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   643
                            dirstate.update_file(
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   644
                                realname,
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   645
                                p1_tracked=True,
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   646
                                wc_tracked=True,
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   647
                                possibly_dirty=True,
cc438f793b98 record: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47728
diff changeset
   648
                            )
25759
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
   649
27370
d9e3ebe56970 record: don't dereference symlinks while copying over stat data
Siddharth Agarwal <sid0@fb.com>
parents: 26781
diff changeset
   650
                    # copystat=True here and above are a hack to trick any
d9e3ebe56970 record: don't dereference symlinks while copying over stat data
Siddharth Agarwal <sid0@fb.com>
parents: 26781
diff changeset
   651
                    # editors that have f open that we haven't modified them.
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   652
                    #
27370
d9e3ebe56970 record: don't dereference symlinks while copying over stat data
Siddharth Agarwal <sid0@fb.com>
parents: 26781
diff changeset
   653
                    # Also note that this racy as an editor could notice the
d9e3ebe56970 record: don't dereference symlinks while copying over stat data
Siddharth Agarwal <sid0@fb.com>
parents: 26781
diff changeset
   654
                    # file's mtime before we've finished writing it.
d9e3ebe56970 record: don't dereference symlinks while copying over stat data
Siddharth Agarwal <sid0@fb.com>
parents: 26781
diff changeset
   655
                    util.copyfile(tmpname, repo.wjoin(realname), copystat=True)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   656
                    os.unlink(tmpname)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   657
                if tobackup:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   658
                    os.rmdir(backupdir)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   659
            except OSError:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   660
                pass
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   661
25758
c5dfa47ad7ee cmdutil: put recordfunc invocation into wlock scope for consistency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25755
diff changeset
   662
    def recordinwlock(ui, repo, message, match, opts):
27801
7be6371c732e with: use context manager for wlock in recordinwlock
Bryan O'Sullivan <bryano@fb.com>
parents: 27698
diff changeset
   663
        with repo.wlock():
25758
c5dfa47ad7ee cmdutil: put recordfunc invocation into wlock scope for consistency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25755
diff changeset
   664
            return recordfunc(ui, repo, message, match, opts)
c5dfa47ad7ee cmdutil: put recordfunc invocation into wlock scope for consistency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25755
diff changeset
   665
c5dfa47ad7ee cmdutil: put recordfunc invocation into wlock scope for consistency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25755
diff changeset
   666
    return commit(ui, repo, recordinwlock, pats, opts)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
   667
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   668
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49004
diff changeset
   669
class dirnode:
33548
4cd4344a53c4 status: add a flag to terse the output (issue4119)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33509
diff changeset
   670
    """
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   671
    Represent a directory in user working copy with information required for
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   672
    the purpose of tersing its status.
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   673
38231
51e420a7a41a cmdutil: use internal separators when building the terse list
Matt Harbison <matt_harbison@yahoo.com>
parents: 38197
diff changeset
   674
    path is the path to the directory, without a trailing '/'
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   675
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   676
    statuses is a set of statuses of all files in this directory (this includes
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   677
    all the files in all the subdirectories too)
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   678
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   679
    files is a list of files which are direct child of this directory
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   680
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   681
    subdirs is a dictionary of sub-directory name as the key and it's own
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   682
    dirnode object as the value
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   683
    """
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   684
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   685
    def __init__(self, dirpath):
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   686
        self.path = dirpath
42057
566daffc607d cleanup: use set literals where possible
Martin von Zweigbergk <martinvonz@google.com>
parents: 41994
diff changeset
   687
        self.statuses = set()
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   688
        self.files = []
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   689
        self.subdirs = {}
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   690
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   691
    def _addfileindir(self, filename, status):
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   692
        """Add a file in this directory as a direct child."""
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   693
        self.files.append((filename, status))
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   694
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   695
    def addfile(self, filename, status):
33548
4cd4344a53c4 status: add a flag to terse the output (issue4119)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33509
diff changeset
   696
        """
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   697
        Add a file to this directory or to its direct parent directory.
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   699
        If the file is not direct child of this directory, we traverse to the
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   700
        directory of which this file is a direct child of and add the file
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   701
        there.
33548
4cd4344a53c4 status: add a flag to terse the output (issue4119)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33509
diff changeset
   702
        """
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   703
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   704
        # the filename contains a path separator, it means it's not the direct
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   705
        # child of this directory
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   706
        if b'/' in filename:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   707
            subdir, filep = filename.split(b'/', 1)
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   708
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   709
            # does the dirnode object for subdir exists
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   710
            if subdir not in self.subdirs:
38231
51e420a7a41a cmdutil: use internal separators when building the terse list
Matt Harbison <matt_harbison@yahoo.com>
parents: 38197
diff changeset
   711
                subdirpath = pathutil.join(self.path, subdir)
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   712
                self.subdirs[subdir] = dirnode(subdirpath)
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   713
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   714
            # try adding the file in subdir
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   715
            self.subdirs[subdir].addfile(filep, status)
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   716
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   717
        else:
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   718
            self._addfileindir(filename, status)
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   719
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   720
        if status not in self.statuses:
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   721
            self.statuses.add(status)
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   722
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   723
    def iterfilepaths(self):
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   724
        """Yield (status, path) for files directly under this directory."""
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   725
        for f, st in self.files:
38231
51e420a7a41a cmdutil: use internal separators when building the terse list
Matt Harbison <matt_harbison@yahoo.com>
parents: 38197
diff changeset
   726
            yield st, pathutil.join(self.path, f)
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   727
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   728
    def tersewalk(self, terseargs):
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   729
        """
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   730
        Yield (status, path) obtained by processing the status of this
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   731
        dirnode.
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   732
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   733
        terseargs is the string of arguments passed by the user with `--terse`
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   734
        flag.
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   735
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   736
        Following are the cases which can happen:
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   737
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   738
        1) All the files in the directory (including all the files in its
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   739
        subdirectories) share the same status and the user has asked us to terse
38231
51e420a7a41a cmdutil: use internal separators when building the terse list
Matt Harbison <matt_harbison@yahoo.com>
parents: 38197
diff changeset
   740
        that status. -> yield (status, dirpath).  dirpath will end in '/'.
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   741
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   742
        2) Otherwise, we do following:
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   743
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   744
                a) Yield (status, filepath)  for all the files which are in this
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   745
                    directory (only the ones in this directory, not the subdirs)
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   746
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   747
                b) Recurse the function on all the subdirectories of this
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   748
                   directory
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   749
        """
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   750
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   751
        if len(self.statuses) == 1:
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   752
            onlyst = self.statuses.pop()
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   753
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   754
            # Making sure we terse only when the status abbreviation is
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   755
            # passed as terse argument
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   756
            if onlyst in terseargs:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   757
                yield onlyst, self.path + b'/'
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   758
                return
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   759
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   760
        # add the files to status list
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   761
        for st, fpath in self.iterfilepaths():
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   762
            yield st, fpath
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   763
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   764
        # recurse on the subdirs
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
   765
        for dirobj in self.subdirs.values():
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   766
            for st, fpath in dirobj.tersewalk(terseargs):
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   767
                yield st, fpath
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   768
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   769
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   770
def tersedir(statuslist, terseargs):
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   771
    """
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
   772
    Terse the status if all the files in a directory shares the same status.
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   773
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   774
    statuslist is scmutil.status() object which contains a list of files for
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   775
    each status.
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   776
    terseargs is string which is passed by the user as the argument to `--terse`
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   777
    flag.
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   778
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   779
    The function makes a tree of objects of dirnode class, and at each node it
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   780
    stores the information required to know whether we can terse a certain
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   781
    directory or not.
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   782
    """
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   783
    # the order matters here as that is used to produce final list
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   784
    allst = (b'm', b'a', b'r', b'd', b'u', b'i', b'c')
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   785
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   786
    # checking the argument validity
34893
068e0e531584 cmdutil: fix status tersing on Python 3
Augie Fackler <augie@google.com>
parents: 34857
diff changeset
   787
    for s in pycompat.bytestr(terseargs):
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   788
        if s not in allst:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
   789
            raise error.InputError(_(b"'%s' not recognized") % s)
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   790
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   791
    # creating a dirnode object for the root of the repo
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   792
    rootobj = dirnode(b'')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   793
    pstatus = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   794
        b'modified',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   795
        b'added',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   796
        b'deleted',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   797
        b'clean',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   798
        b'unknown',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   799
        b'ignored',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   800
        b'removed',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   801
    )
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   802
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   803
    tersedict = {}
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   804
    for attrname in pstatus:
34893
068e0e531584 cmdutil: fix status tersing on Python 3
Augie Fackler <augie@google.com>
parents: 34857
diff changeset
   805
        statuschar = attrname[0:1]
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   806
        for f in getattr(statuslist, attrname):
34893
068e0e531584 cmdutil: fix status tersing on Python 3
Augie Fackler <augie@google.com>
parents: 34857
diff changeset
   807
            rootobj.addfile(f, statuschar)
068e0e531584 cmdutil: fix status tersing on Python 3
Augie Fackler <augie@google.com>
parents: 34857
diff changeset
   808
        tersedict[statuschar] = []
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   809
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   810
    # we won't be tersing the root dir, so add files in it
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   811
    for st, fpath in rootobj.iterfilepaths():
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   812
        tersedict[st].append(fpath)
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   813
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   814
    # process each sub-directory and build tersedict
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   815
    for subdir in rootobj.subdirs.values():
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   816
        for st, f in subdir.tersewalk(terseargs):
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
   817
            tersedict[st].append(f)
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   818
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   819
    tersedlist = []
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   820
    for st in allst:
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   821
        tersedict[st].sort()
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   822
        tersedlist.append(tersedict[st])
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
   823
43689
9cb7f855e2fc cmdutil: convert terse status result back to an scmutil.status
Augie Fackler <augie@google.com>
parents: 43688
diff changeset
   824
    return scmutil.status(*tersedlist)
33548
4cd4344a53c4 status: add a flag to terse the output (issue4119)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33509
diff changeset
   825
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   826
33792
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
   827
def _commentlines(raw):
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
   828
    '''Surround lineswith a comment char and a new line'''
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
   829
    lines = raw.splitlines()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   830
    commentedlines = [b'# %s' % line for line in lines]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   831
    return b'\n'.join(commentedlines) + b'\n'
33792
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
   832
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   833
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   834
@attr.s(frozen=True)
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49004
diff changeset
   835
class morestatus:
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   836
    reporoot = attr.ib()
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   837
    unfinishedop = attr.ib()
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   838
    unfinishedmsg = attr.ib()
43943
4ca89cc20d02 status: extract active-merge state for reuse
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43932
diff changeset
   839
    activemerge = attr.ib()
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   840
    unresolvedpaths = attr.ib()
43945
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   841
    _formattedpaths = attr.ib(init=False, default=set())
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   842
    _label = b'status.morestatus'
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   843
43860
7315464f0613 status: add template/json data about whether a file has unresolved conflicts
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43859
diff changeset
   844
    def formatfile(self, path, fm):
43945
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   845
        self._formattedpaths.add(path)
43943
4ca89cc20d02 status: extract active-merge state for reuse
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43932
diff changeset
   846
        if self.activemerge and path in self.unresolvedpaths:
43860
7315464f0613 status: add template/json data about whether a file has unresolved conflicts
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43859
diff changeset
   847
            fm.data(unresolved=True)
7315464f0613 status: add template/json data about whether a file has unresolved conflicts
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43859
diff changeset
   848
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   849
    def formatfooter(self, fm):
43944
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   850
        if self.unfinishedop or self.unfinishedmsg:
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   851
            fm.startitem()
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   852
            fm.data(itemtype=b'morestatus')
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   853
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   854
        if self.unfinishedop:
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   855
            fm.data(unfinished=self.unfinishedop)
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   856
            statemsg = (
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   857
                _(b'The repository is in an unfinished *%s* state.')
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   858
                % self.unfinishedop
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   859
            )
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   860
            fm.plain(b'%s\n' % _commentlines(statemsg), label=self._label)
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   861
        if self.unfinishedmsg:
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   862
            fm.data(unfinishedmsg=self.unfinishedmsg)
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   863
43945
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   864
        # May also start new data items.
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   865
        self._formatconflicts(fm)
43944
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   866
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   867
        if self.unfinishedmsg:
43866
612951e08278 formatting: fix some recent formatting regressions
Martin von Zweigbergk <martinvonz@google.com>
parents: 43860
diff changeset
   868
            fm.plain(
612951e08278 formatting: fix some recent formatting regressions
Martin von Zweigbergk <martinvonz@google.com>
parents: 43860
diff changeset
   869
                b'%s\n' % _commentlines(self.unfinishedmsg), label=self._label
612951e08278 formatting: fix some recent formatting regressions
Martin von Zweigbergk <martinvonz@google.com>
parents: 43860
diff changeset
   870
            )
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   871
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   872
    def _formatconflicts(self, fm):
43943
4ca89cc20d02 status: extract active-merge state for reuse
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43932
diff changeset
   873
        if not self.activemerge:
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   874
            return
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   875
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   876
        if self.unresolvedpaths:
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   877
            mergeliststr = b'\n'.join(
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   878
                [
43866
612951e08278 formatting: fix some recent formatting regressions
Martin von Zweigbergk <martinvonz@google.com>
parents: 43860
diff changeset
   879
                    b'    %s'
612951e08278 formatting: fix some recent formatting regressions
Martin von Zweigbergk <martinvonz@google.com>
parents: 43860
diff changeset
   880
                    % util.pathto(self.reporoot, encoding.getcwd(), path)
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   881
                    for path in self.unresolvedpaths
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   882
                ]
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   883
            )
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   884
            msg = (
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   885
                _(
46394
83ffc49f7e48 morestatus: convert a UI message about merge conflicts to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 46364
diff changeset
   886
                    b'''Unresolved merge conflicts:
33792
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
   887
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
   888
%s
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
   889
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   890
To mark files as resolved:  hg resolve --mark FILE'''
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   891
                )
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   892
                % mergeliststr
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   893
            )
43945
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   894
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   895
            # If any paths with unresolved conflicts were not previously
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   896
            # formatted, output them now.
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   897
            for f in self.unresolvedpaths:
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   898
                if f in self._formattedpaths:
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   899
                    # Already output.
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   900
                    continue
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   901
                fm.startitem()
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   902
                # We can't claim to know the status of the file - it may just
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   903
                # have been in one of the states that were not requested for
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   904
                # display, so it could be anything.
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   905
                fm.data(itemtype=b'file', path=f, unresolved=True)
07ebb567e8bb status: make unresolved files always be in the morestatus structured output
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43944
diff changeset
   906
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   907
        else:
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   908
            msg = _(b'No unresolved merge conflicts.')
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   909
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   910
        fm.plain(b'%s\n' % _commentlines(msg), label=self._label)
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   911
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   912
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   913
def readmorestatus(repo):
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   914
    """Returns a morestatus object if the repo has unfinished state."""
42538
5bddd2244814 state: moved cmdutil.STATES and utilities to state.py
Taapas Agrawal <taapas2897@gmail.com>
parents: 42537
diff changeset
   915
    statetuple = statemod.getrepostate(repo)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44772
diff changeset
   916
    mergestate = mergestatemod.mergestate.read(repo)
43943
4ca89cc20d02 status: extract active-merge state for reuse
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43932
diff changeset
   917
    activemerge = mergestate.active()
43944
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   918
    if not statetuple and not activemerge:
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   919
        return None
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   920
43944
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   921
    unfinishedop = unfinishedmsg = unresolved = None
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   922
    if statetuple:
489fdf27769c status: make morestatus call out unresolved conflicts after update
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43943
diff changeset
   923
        unfinishedop, unfinishedmsg = statetuple
43943
4ca89cc20d02 status: extract active-merge state for reuse
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43932
diff changeset
   924
    if activemerge:
43859
fb4a6d584756 status: split morestatus data loading from display
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43838
diff changeset
   925
        unresolved = sorted(mergestate.unresolved())
43866
612951e08278 formatting: fix some recent formatting regressions
Martin von Zweigbergk <martinvonz@google.com>
parents: 43860
diff changeset
   926
    return morestatus(
43943
4ca89cc20d02 status: extract active-merge state for reuse
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 43932
diff changeset
   927
        repo.root, unfinishedop, unfinishedmsg, activemerge, unresolved
43866
612951e08278 formatting: fix some recent formatting regressions
Martin von Zweigbergk <martinvonz@google.com>
parents: 43860
diff changeset
   928
    )
33792
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
   929
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   930
7213
b4c035057d34 findcmd: have dispatch look up strict flag
Matt Mackall <mpm@selenic.com>
parents: 7121
diff changeset
   931
def findpossible(cmd, table, strict=False):
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   932
    """
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   933
    Return cmd -> (aliases, command table entry)
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   934
    for each matching command.
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   935
    Return debug commands (or their aliases) only if no normal command matches.
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   936
    """
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   937
    choice = {}
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   938
    debugchoice = {}
15600
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
   939
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
   940
    if cmd in table:
40295
fa88170c10bb help: adding a proper declaration for shortlist/basic commands (API)
Rodrigo Damazio <rdamazio@google.com>
parents: 40102
diff changeset
   941
        # short-circuit exact matches, "log" alias beats "log|history"
15600
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
   942
        keys = [cmd]
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
   943
    else:
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
   944
        keys = table.keys()
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
   945
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24216
diff changeset
   946
    allcmds = []
15600
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
   947
    for e in keys:
10401
6252852b4332 mq: add -Q option to all commands not in norepo
Brendan Cully <brendan@kublai.com>
parents: 10344
diff changeset
   948
        aliases = parsealiases(e)
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24216
diff changeset
   949
        allcmds.extend(aliases)
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   950
        found = None
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   951
        if cmd in aliases:
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   952
            found = cmd
7213
b4c035057d34 findcmd: have dispatch look up strict flag
Matt Mackall <mpm@selenic.com>
parents: 7121
diff changeset
   953
        elif not strict:
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   954
            for a in aliases:
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   955
                if a.startswith(cmd):
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   956
                    found = a
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   957
                    break
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   958
        if found is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   959
            if aliases[0].startswith(b"debug") or found.startswith(b"debug"):
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents: 5177
diff changeset
   960
                debugchoice[found] = (aliases, table[e])
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   961
            else:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents: 5177
diff changeset
   962
                choice[found] = (aliases, table[e])
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   963
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   964
    if not choice and debugchoice:
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   965
        choice = debugchoice
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   966
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24216
diff changeset
   967
    return choice, allcmds
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   968
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   969
7213
b4c035057d34 findcmd: have dispatch look up strict flag
Matt Mackall <mpm@selenic.com>
parents: 7121
diff changeset
   970
def findcmd(cmd, table, strict=True):
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   971
    """Return (aliases, command table entry) for command string."""
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24216
diff changeset
   972
    choice, allcmds = findpossible(cmd, table, strict)
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   973
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5843
diff changeset
   974
    if cmd in choice:
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   975
        return choice[cmd]
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   976
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   977
    if len(choice) > 1:
32561
9f56d462634c cmdutil: use sorted(dict) instead of x = dict.keys(); x.sort()
Augie Fackler <raf@durin42.com>
parents: 32472
diff changeset
   978
        clist = sorted(choice)
7643
9a1ea6587557 error: move UnknownCommand and AmbiguousCommand
Matt Mackall <mpm@selenic.com>
parents: 7404
diff changeset
   979
        raise error.AmbiguousCommand(cmd, clist)
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   980
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   981
    if choice:
32880
e4a43b810528 py3: explicitly convert dict.values() to a list on py3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32860
diff changeset
   982
        return list(choice.values())[0]
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   983
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24216
diff changeset
   984
    raise error.UnknownCommand(cmd, allcmds)
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
   985
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
   986
44190
92b7caf4cb9e branch: make --force work even when specifying revs
Manuel Jacob <me@manueljacob.de>
parents: 44184
diff changeset
   987
def changebranch(ui, repo, revs, label, opts):
47031
f38bf44e077f black: make codebase compatible with black v21.4b2 and v20.8b1
Kyle Lippincott <spectral@google.com>
parents: 46969
diff changeset
   988
    """Change the branch name of given revs to label"""
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
   989
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   990
    with repo.wlock(), repo.lock(), repo.transaction(b'branches'):
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
   991
        # abort in case of uncommitted merge or dirty wdir
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
   992
        bailifchanged(repo)
48128
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   993
        revs = logcmdutil.revrange(repo, revs)
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
   994
        if not revs:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
   995
            raise error.InputError(b"empty revision set")
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   996
        roots = repo.revs(b'roots(%ld)', revs)
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
   997
        if len(roots) > 1:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
   998
            raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   999
                _(b"cannot change branch of non-linear revisions")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1000
            )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1001
        rewriteutil.precheck(repo, revs, b'change branch of')
35746
e5b6ba786d83 branch: allow changing branch name to existing name if possible
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35745
diff changeset
  1002
e5b6ba786d83 branch: allow changing branch name to existing name if possible
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35745
diff changeset
  1003
        root = repo[roots.first()]
40707
69268a13ffa5 branch: allow changing branch of merge commits with --rev
Anton Shestakov <av6@dwimlabs.net>
parents: 40367
diff changeset
  1004
        rpb = {parent.branch() for parent in root.parents()}
44190
92b7caf4cb9e branch: make --force work even when specifying revs
Manuel Jacob <me@manueljacob.de>
parents: 44184
diff changeset
  1005
        if (
92b7caf4cb9e branch: make --force work even when specifying revs
Manuel Jacob <me@manueljacob.de>
parents: 44184
diff changeset
  1006
            not opts.get(b'force')
92b7caf4cb9e branch: make --force work even when specifying revs
Manuel Jacob <me@manueljacob.de>
parents: 44184
diff changeset
  1007
            and label not in rpb
92b7caf4cb9e branch: make --force work even when specifying revs
Manuel Jacob <me@manueljacob.de>
parents: 44184
diff changeset
  1008
            and label in repo.branchmap()
92b7caf4cb9e branch: make --force work even when specifying revs
Manuel Jacob <me@manueljacob.de>
parents: 44184
diff changeset
  1009
        ):
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1010
            raise error.InputError(
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1011
                _(b"a branch of the same name already exists")
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1012
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1013
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1014
        # make sure only topological heads
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1015
        if repo.revs(b'heads(%ld) - head()', revs):
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1016
            raise error.InputError(
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1017
                _(b"cannot change branch in middle of a stack")
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1018
            )
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1019
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1020
        replacements = {}
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1021
        # avoid import cycle mercurial.cmdutil -> mercurial.context ->
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1022
        # mercurial.subrepo -> mercurial.cmdutil
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1023
        from . import context
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1024
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1025
        for rev in revs:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1026
            ctx = repo[rev]
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1027
            oldbranch = ctx.branch()
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1028
            # check if ctx has same branch
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1029
            if oldbranch == label:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1030
                continue
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1031
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1032
            def filectxfn(repo, newctx, path):
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1033
                try:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1034
                    return ctx[path]
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1035
                except error.ManifestLookupError:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1036
                    return None
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1037
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1038
            ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1039
                b"changing branch of '%s' from '%s' to '%s'\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1040
                % (hex(ctx.node()), oldbranch, label)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1041
            )
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1042
            extra = ctx.extra()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1043
            extra[b'branch_change'] = hex(ctx.node())
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1044
            # While changing branch of set of linear commits, make sure that
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1045
            # we base our commits on new parent rather than old parent which
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1046
            # was obsoleted while changing the branch
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1047
            p1 = ctx.p1().node()
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1048
            p2 = ctx.p2().node()
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1049
            if p1 in replacements:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1050
                p1 = replacements[p1][0]
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1051
            if p2 in replacements:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1052
                p2 = replacements[p2][0]
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1053
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1054
            mc = context.memctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1055
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1056
                (p1, p2),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1057
                ctx.description(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1058
                ctx.files(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1059
                filectxfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1060
                user=ctx.user(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1061
                date=ctx.date(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1062
                extra=extra,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1063
                branch=label,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1064
            )
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1065
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
  1066
            newnode = repo.commitctx(mc)
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1067
            replacements[ctx.node()] = (newnode,)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1068
            ui.debug(b'new node id is %s\n' % hex(newnode))
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1069
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1070
        # create obsmarkers and move bookmarks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1071
        scmutil.cleanupnodes(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1072
            repo, replacements, b'branch-change', fixphase=True
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1073
        )
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1074
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1075
        # move the working copy too
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1076
        wctx = repo[None]
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1077
        # in-progress merge is a bit too complex for now.
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1078
        if len(wctx.parents()) == 1:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1079
            newid = replacements.get(wctx.p1().node())
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1080
            if newid is not None:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1081
                # avoid import cycle mercurial.cmdutil -> mercurial.hg ->
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1082
                # mercurial.cmdutil
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1083
                from . import hg
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1084
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1085
                hg.update(repo, newid[0], quietempty=True)
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1086
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1087
        ui.status(_(b"changed branch on %d changesets\n") % len(replacements))
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
  1088
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1089
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  1090
def findrepo(p):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1091
    while not os.path.isdir(os.path.join(p, b".hg")):
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  1092
        oldp, p = p, os.path.dirname(p)
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  1093
        if p == oldp:
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  1094
            return None
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  1095
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  1096
    return p
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  1097
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1098
30755
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
  1099
def bailifchanged(repo, merge=True, hint=None):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  1100
    """enforce the precondition that working directory must be clean.
30755
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
  1101
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
  1102
    'merge' can be set to false if a pending uncommitted merge should be
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
  1103
    ignored (such as when 'update --check' runs).
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
  1104
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
  1105
    'hint' is the usual hint given to Abort exception.
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
  1106
    """
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
  1107
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46969
diff changeset
  1108
    if merge and repo.dirstate.p2() != repo.nullid:
45859
527ce85c2e60 errors: introduce StateError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45846
diff changeset
  1109
        raise error.StateError(_(b'outstanding uncommitted merge'), hint=hint)
43688
e01e0641f18a cmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43571
diff changeset
  1110
    st = repo.status()
e01e0641f18a cmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43571
diff changeset
  1111
    if st.modified or st.added or st.removed or st.deleted:
45859
527ce85c2e60 errors: introduce StateError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45846
diff changeset
  1112
        raise error.StateError(_(b'uncommitted changes'), hint=hint)
15231
cd6f10dccf16 cmdutil.bailifchanged: abort for dirty subrepos
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15214
diff changeset
  1113
    ctx = repo[None]
18364
6252b4f1c4b4 subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18340
diff changeset
  1114
    for s in sorted(ctx.substate):
30755
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
  1115
        ctx.sub(s).bailifchanged(hint=hint)
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
  1116
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1117
14635
217b7d83afc3 cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14518
diff changeset
  1118
def logmessage(ui, opts):
47031
f38bf44e077f black: make codebase compatible with black v21.4b2 and v20.8b1
Kyle Lippincott <spectral@google.com>
parents: 46969
diff changeset
  1119
    """get the log message according to -m and -l option"""
43900
774cee0e95c6 amend: use cmdutil.check_at_most_one_arg()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43899
diff changeset
  1120
774cee0e95c6 amend: use cmdutil.check_at_most_one_arg()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43899
diff changeset
  1121
    check_at_most_one_arg(opts, b'message', b'logfile')
774cee0e95c6 amend: use cmdutil.check_at_most_one_arg()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43899
diff changeset
  1122
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1123
    message = opts.get(b'message')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1124
    logfile = opts.get(b'logfile')
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
  1125
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
  1126
    if not message and logfile:
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
  1127
        try:
32641
d3e1c5b4986c cmdutil: use isstdiofilename() where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 32610
diff changeset
  1128
            if isstdiofilename(logfile):
14635
217b7d83afc3 cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14518
diff changeset
  1129
                message = ui.fin.read()
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
  1130
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1131
                message = b'\n'.join(util.readfile(logfile).splitlines())
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25657
diff changeset
  1132
        except IOError as inst:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1133
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1134
                _(b"can't read commit message '%s': %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1135
                % (logfile, encoding.strtolocal(inst.strerror))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1136
            )
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
  1137
    return message
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
  1138
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1139
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
  1140
def mergeeditform(ctxorbool, baseformname):
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
  1141
    """return appropriate editform name (referencing a committemplate)
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
  1142
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
  1143
    'ctxorbool' is either a ctx to be committed, or a bool indicating whether
22248
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
  1144
    merging is committed.
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
  1145
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
  1146
    This returns baseformname with '.merge' appended if it is a merge,
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
  1147
    otherwise '.normal' is appended.
22248
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
  1148
    """
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
  1149
    if isinstance(ctxorbool, bool):
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
  1150
        if ctxorbool:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1151
            return baseformname + b".merge"
40030
e2697acd9381 cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents: 39936
diff changeset
  1152
    elif len(ctxorbool.parents()) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1153
        return baseformname + b".merge"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1154
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1155
    return baseformname + b".normal"
22248
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
  1156
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1157
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1158
def getcommiteditor(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1159
    edit=False, finishdesc=None, extramsg=None, editform=b'', **opts
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1160
):
21419
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1161
    """get appropriate commit message editor according to '--edit' option
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1162
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1163
    'finishdesc' is a function to be called with edited commit message
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1164
    (= 'description' of the new changeset) just after editing, but
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1165
    before checking empty-ness. It should return actual text to be
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1166
    stored into history. This allows to change description before
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1167
    storing.
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1168
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1169
    'extramsg' is a extra message to be shown in the editor instead of
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1170
    'Leave message empty to abort commit' line. 'HG: ' prefix and EOL
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1171
    is automatically added.
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1172
21999
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
  1173
    'editform' is a dot-separated list of names, to distinguish
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
  1174
    the purpose of commit text editing.
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
  1175
21419
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1176
    'getcommiteditor' returns 'commitforceeditor' regardless of
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1177
    'edit', if one of 'finishdesc' or 'extramsg' is specified, because
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1178
    they are specific for usage in MQ.
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1179
    """
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
  1180
    if edit or finishdesc or extramsg:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1181
        return lambda r, c, s: commitforceeditor(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1182
            r, c, s, finishdesc=finishdesc, extramsg=extramsg, editform=editform
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1183
        )
21999
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
  1184
    elif editform:
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
  1185
        return lambda r, c, s: commiteditor(r, c, s, editform=editform)
21405
dcf20f244c2a cmdutil: introduce "getcommiteditor()" to simplify code paths to choose editor
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21241
diff changeset
  1186
    else:
dcf20f244c2a cmdutil: introduce "getcommiteditor()" to simplify code paths to choose editor
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21241
diff changeset
  1187
        return commiteditor
dcf20f244c2a cmdutil: introduce "getcommiteditor()" to simplify code paths to choose editor
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21241
diff changeset
  1188
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1189
37774
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1190
def _escapecommandtemplate(tmpl):
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1191
    parts = []
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1192
    for typ, start, end in templater.scantemplate(tmpl, raw=True):
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1193
        if typ == b'string':
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1194
            parts.append(stringutil.escapestr(tmpl[start:end]))
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1195
        else:
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1196
            parts.append(tmpl[start:end])
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1197
    return b''.join(parts)
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1198
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1199
37774
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1200
def rendercommandtemplate(ui, tmpl, props):
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1201
    r"""Expand a literal template 'tmpl' in a way suitable for command line
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1202
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1203
    '\' in outermost string is not taken as an escape character because it
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1204
    is a directory separator on Windows.
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1205
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1206
    >>> from . import ui as uimod
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1207
    >>> ui = uimod.ui()
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1208
    >>> rendercommandtemplate(ui, b'c:\\{path}', {b'path': b'foo'})
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1209
    'c:\\foo'
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1210
    >>> rendercommandtemplate(ui, b'{"c:\\{path}"}', {'path': b'foo'})
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1211
    'c:{path}'
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1212
    """
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1213
    if not tmpl:
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1214
        return tmpl
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1215
    t = formatter.maketemplater(ui, _escapecommandtemplate(tmpl))
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1216
    return t.renderdefault(props)
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
  1217
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1218
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1219
def rendertemplate(ctx, tmpl, props=None):
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1220
    """Expand a literal template 'tmpl' byte-string against one changeset
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1221
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1222
    Each props item must be a stringify-able value or a callable returning
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1223
    such value, i.e. no bare list nor dict should be passed.
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1224
    """
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1225
    repo = ctx.repo()
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1226
    tres = formatter.templateresources(repo.ui, repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1227
    t = formatter.maketemplater(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1228
        repo.ui, tmpl, defaults=templatekw.keywords, resources=tres
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1229
    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1230
    mapping = {b'ctx': ctx}
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1231
    if props:
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1232
        mapping.update(props)
36991
317382151ac3 templater: rename .render(mapping) to .renderdefault(mapping) (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
  1233
    return t.renderdefault(mapping)
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1234
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1235
45793
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1236
def format_changeset_summary(ui, ctx, command=None, default_spec=None):
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1237
    """Format a changeset summary (one line)."""
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1238
    spec = None
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1239
    if command:
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1240
        spec = ui.config(
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1241
            b'command-templates', b'oneline-summary.%s' % command, None
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1242
        )
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1243
    if not spec:
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1244
        spec = ui.config(b'command-templates', b'oneline-summary')
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1245
    if not spec:
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1246
        spec = default_spec
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1247
    if not spec:
45794
f90a5c211251 rebase: change and standarize template for rebase's one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45793
diff changeset
  1248
        spec = (
f90a5c211251 rebase: change and standarize template for rebase's one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45793
diff changeset
  1249
            b'{separate(" ", '
45819
e9555305c5c6 templates: include all non-branch namespaces in default one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45794
diff changeset
  1250
            b'label("oneline-summary.changeset", "{rev}:{node|short}")'
45794
f90a5c211251 rebase: change and standarize template for rebase's one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45793
diff changeset
  1251
            b', '
45819
e9555305c5c6 templates: include all non-branch namespaces in default one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45794
diff changeset
  1252
            b'join(filter(namespaces % "{ifeq(namespace, "branches", "", join(names % "{label("oneline-summary.{namespace}", name)}", " "))}"), " ")'
45794
f90a5c211251 rebase: change and standarize template for rebase's one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45793
diff changeset
  1253
            b')} '
45819
e9555305c5c6 templates: include all non-branch namespaces in default one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45794
diff changeset
  1254
            b'"{label("oneline-summary.desc", desc|firstline)}"'
45794
f90a5c211251 rebase: change and standarize template for rebase's one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45793
diff changeset
  1255
        )
45793
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1256
    text = rendertemplate(ctx, spec)
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1257
    return text.split(b'\n')[0]
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1258
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
  1259
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1260
def _buildfntemplate(pat, total=None, seqno=None, revwidth=None, pathname=None):
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1261
    r"""Convert old-style filename format string to template string
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1262
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1263
    >>> _buildfntemplate(b'foo-%b-%n.patch', seqno=0)
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1264
    'foo-{reporoot|basename}-{seqno}.patch'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1265
    >>> _buildfntemplate(b'%R{tags % "{tag}"}%H')
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1266
    '{rev}{tags % "{tag}"}{node}'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1267
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1268
    '\' in outermost strings has to be escaped because it is a directory
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1269
    separator on Windows:
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1270
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1271
    >>> _buildfntemplate(b'c:\\tmp\\%R\\%n.patch', seqno=0)
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1272
    'c:\\\\tmp\\\\{rev}\\\\{seqno}.patch'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1273
    >>> _buildfntemplate(b'\\\\foo\\bar.patch')
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1274
    '\\\\\\\\foo\\\\bar.patch'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1275
    >>> _buildfntemplate(b'\\{tags % "{tag}"}')
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1276
    '\\\\{tags % "{tag}"}'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1277
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1278
    but inner strings follow the template rules (i.e. '\' is taken as an
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1279
    escape character):
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1280
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1281
    >>> _buildfntemplate(br'{"c:\tmp"}', seqno=0)
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1282
    '{"c:\\tmp"}'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1283
    """
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1284
    expander = {
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1285
        b'H': b'{node}',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1286
        b'R': b'{rev}',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1287
        b'h': b'{node|short}',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1288
        b'm': br'{sub(r"[^\w]", "_", desc|firstline)}',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1289
        b'r': b'{if(revwidth, pad(rev, revwidth, "0", left=True), rev)}',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1290
        b'%': b'%',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1291
        b'b': b'{reporoot|basename}',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1292
    }
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
  1293
    if total is not None:
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1294
        expander[b'N'] = b'{total}'
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
  1295
    if seqno is not None:
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1296
        expander[b'n'] = b'{seqno}'
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
  1297
    if total is not None and seqno is not None:
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1298
        expander[b'n'] = b'{pad(seqno, total|stringify|count, "0", left=True)}'
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
  1299
    if pathname is not None:
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1300
        expander[b's'] = b'{pathname|basename}'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1301
        expander[b'd'] = b'{if(pathname|dirname, pathname|dirname, ".")}'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1302
        expander[b'p'] = b'{pathname}'
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
  1303
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
  1304
    newname = []
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1305
    for typ, start, end in templater.scantemplate(pat, raw=True):
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1306
        if typ != b'string':
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1307
            newname.append(pat[start:end])
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1308
            continue
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1309
        i = start
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1310
        while i < end:
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1311
            n = pat.find(b'%', i, end)
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1312
            if n < 0:
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
  1313
                newname.append(stringutil.escapestr(pat[i:end]))
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1314
                break
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
  1315
            newname.append(stringutil.escapestr(pat[i:n]))
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1316
            if n + 2 > end:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1317
                raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
  1318
                    _(b"incomplete format spec in output filename")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1319
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1320
            c = pat[n + 1 : n + 2]
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1321
            i = n + 2
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
  1322
            try:
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1323
                newname.append(expander[c])
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
  1324
            except KeyError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1325
                raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
  1326
                    _(b"invalid format spec '%%%s' in output filename") % c
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1327
                )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1328
    return b''.join(newname)
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1329
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1330
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1331
def makefilename(ctx, pat, **props):
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1332
    if not pat:
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1333
        return pat
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1334
    tmpl = _buildfntemplate(pat, **props)
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1335
    # BUG: alias expansion shouldn't be made against template fragments
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1336
    # rewritten from %-format strings, but we have no easy way to partially
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1337
    # disable the expansion.
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
  1338
    return rendertemplate(ctx, tmpl, pycompat.byteskwargs(props))
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1339
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1340
32572
447bbd970047 cmdutil: extract function checking if pattern should be taken as stdin/out
Yuya Nishihara <yuya@tcha.org>
parents: 32571
diff changeset
  1341
def isstdiofilename(pat):
447bbd970047 cmdutil: extract function checking if pattern should be taken as stdin/out
Yuya Nishihara <yuya@tcha.org>
parents: 32571
diff changeset
  1342
    """True if the given pat looks like a filename denoting stdin/stdout"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1343
    return not pat or pat == b'-'
32572
447bbd970047 cmdutil: extract function checking if pattern should be taken as stdin/out
Yuya Nishihara <yuya@tcha.org>
parents: 32571
diff changeset
  1344
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1345
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49004
diff changeset
  1346
class _unclosablefile:
27418
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
  1347
    def __init__(self, fp):
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
  1348
        self._fp = fp
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
  1349
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
  1350
    def close(self):
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
  1351
        pass
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
  1352
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
  1353
    def __iter__(self):
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
  1354
        return iter(self._fp)
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
  1355
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
  1356
    def __getattr__(self, attr):
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
  1357
        return getattr(self._fp, attr)
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
  1358
30142
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 30018
diff changeset
  1359
    def __enter__(self):
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 30018
diff changeset
  1360
        return self
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 30018
diff changeset
  1361
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 30018
diff changeset
  1362
    def __exit__(self, exc_type, exc_value, exc_tb):
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 30018
diff changeset
  1363
        pass
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 30018
diff changeset
  1364
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1365
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1366
def makefileobj(ctx, pat, mode=b'wb', **props):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1367
    writable = mode not in (b'r', b'rb')
7319
eae1767cc6a8 export: fixed silent output file overwriting
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 7308
diff changeset
  1368
32572
447bbd970047 cmdutil: extract function checking if pattern should be taken as stdin/out
Yuya Nishihara <yuya@tcha.org>
parents: 32571
diff changeset
  1369
    if isstdiofilename(pat):
36243
976e1cfb2f64 cmdutil: pass ctx to makefileobj() in place of repo/node pair (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36242
diff changeset
  1370
        repo = ctx.repo()
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24301
diff changeset
  1371
        if writable:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24301
diff changeset
  1372
            fp = repo.ui.fout
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24301
diff changeset
  1373
        else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24301
diff changeset
  1374
            fp = repo.ui.fin
27419
7e2495bf0ad8 cmdutil: do not duplicate stdout by makefileobj()
Yuya Nishihara <yuya@tcha.org>
parents: 27418
diff changeset
  1375
        return _unclosablefile(fp)
36538
d7a23d6184a2 cmdutil: reorder optional arguments passed to makefileobj()
Yuya Nishihara <yuya@tcha.org>
parents: 36537
diff changeset
  1376
    fn = makefilename(ctx, pat, **props)
18613
1a2f4c633410 export: clobber files with -o (bc) (issue3652)
Augie Fackler <raf@durin42.com>
parents: 18538
diff changeset
  1377
    return open(fn, mode)
2882
cf98cd70d2c4 move walk and matchpats from commands to cmdutil.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
  1378
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1379
39305
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1380
def openstorage(repo, cmd, file_, opts, returnrevlog=False):
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1381
    """opens the changelog, manifest, a filelog or a given revlog"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1382
    cl = opts[b'changelog']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1383
    mf = opts[b'manifest']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1384
    dir = opts[b'dir']
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1385
    msg = None
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1386
    if cl and mf:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1387
        msg = _(b'cannot specify --changelog and --manifest at the same time')
25119
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
  1388
    elif cl and dir:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1389
        msg = _(b'cannot specify --changelog and --dir at the same time')
29427
33a6b750b5b9 debug: make debug{revlog,index,data} --dir not just a flag
Martin von Zweigbergk <martinvonz@google.com>
parents: 29397
diff changeset
  1390
    elif cl or mf or dir:
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1391
        if file_:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1392
            msg = _(b'cannot specify filename with --changelog or --manifest')
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1393
        elif not repo:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1394
            msg = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1395
                b'cannot specify --changelog or --manifest or --dir '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1396
                b'without a repository'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1397
            )
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1398
    if msg:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1399
        raise error.InputError(msg)
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1400
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1401
    r = None
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1402
    if repo:
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1403
        if cl:
21033
254f55b64e31 debugrevlog: use unfiltered view for changelog
Matt Mackall <mpm@selenic.com>
parents: 21024
diff changeset
  1404
            r = repo.unfiltered().changelog
25119
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
  1405
        elif dir:
45558
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45491
diff changeset
  1406
            if not scmutil.istreemanifest(repo):
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1407
                raise error.InputError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1408
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1409
                        b"--dir can only be used on repos with "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1410
                        b"treemanifest enabled"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1411
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1412
                )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1413
            if not dir.endswith(b'/'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1414
                dir = dir + b'/'
39272
73cf21b2e8a6 manifest: add getstorage() to manifestlog and use it globally
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39127
diff changeset
  1415
            dirlog = repo.manifestlog.getstorage(dir)
25119
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
  1416
            if len(dirlog):
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
  1417
                r = dirlog
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1418
        elif mf:
39272
73cf21b2e8a6 manifest: add getstorage() to manifestlog and use it globally
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39127
diff changeset
  1419
            r = repo.manifestlog.getstorage(b'')
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1420
        elif file_:
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1421
            filelog = repo.file(file_)
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1422
            if len(filelog):
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1423
                r = filelog
39305
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1424
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1425
        # Not all storage may be revlogs. If requested, try to return an actual
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1426
        # revlog instance.
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1427
        if returnrevlog:
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1428
            if isinstance(r, revlog.revlog):
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1429
                pass
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1430
            elif util.safehasattr(r, b'_revlog'):
43539
9391784299e9 cmdutil: suppress bogus pytype errors
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  1431
                r = r._revlog  # pytype: disable=attribute-error
39305
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1432
            elif r is not None:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1433
                raise error.InputError(
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1434
                    _(b'%r does not appear to be a revlog') % r
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1435
                )
39305
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1436
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1437
    if not r:
39305
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1438
        if not returnrevlog:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1439
            raise error.InputError(_(b'cannot give path to non-revlog'))
39305
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1440
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1441
        if not file_:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1442
            raise error.CommandError(cmd, _(b'invalid arguments'))
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1443
        if not os.path.isfile(file_):
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1444
            raise error.InputError(_(b"revlog '%s' not found") % file_)
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47062
diff changeset
  1445
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47062
diff changeset
  1446
        target = (revlog_constants.KIND_OTHER, b'free-form:%s' % file_)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1447
        r = revlog.revlog(
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47062
diff changeset
  1448
            vfsmod.vfs(encoding.getcwd(), audit=False),
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47062
diff changeset
  1449
            target=target,
47164
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47142
diff changeset
  1450
            radix=file_[:-2],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1451
        )
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1452
    return r
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
  1453
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1454
39305
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1455
def openrevlog(repo, cmd, file_, opts):
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1456
    """Obtain a revlog backing storage of an item.
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1457
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1458
    This is similar to ``openstorage()`` except it always returns a revlog.
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1459
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1460
    In most cases, a caller cares about the main storage object - not the
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1461
    revlog backing it. Therefore, this function should only be used by code
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1462
    that needs to examine low-level revlog implementation details. e.g. debug
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1463
    commands.
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1464
    """
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1465
    return openstorage(repo, cmd, file_, opts, returnrevlog=True)
53e532007878 cmdutil: return a revlog from openrevlog() and split function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
  1466
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1467
5610
2493a478f395 copy: handle rename internally
Matt Mackall <mpm@selenic.com>
parents: 5609
diff changeset
  1468
def copy(ui, repo, pats, opts, rename=False):
44398
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1469
    check_incompatible_arguments(opts, b'forget', [b'dry_run'])
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1470
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1471
    # called with the repo lock held
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1472
    #
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1473
    # hgsep => pathname that uses "/" to separate directories
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1474
    # ossep => pathname that uses os.sep to separate directories
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1475
    cwd = repo.getcwd()
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1476
    targets = {}
44398
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1477
    forget = opts.get(b"forget")
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1478
    after = opts.get(b"after")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1479
    dryrun = opts.get(b"dry_run")
44401
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1480
    rev = opts.get(b'at_rev')
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1481
    if rev:
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1482
        if not forget and not after:
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1483
            # TODO: Remove this restriction and make it also create the copy
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1484
            #       targets (and remove the rename source if rename==True).
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1485
            raise error.InputError(_(b'--at-rev requires --after'))
48130
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48128
diff changeset
  1486
        ctx = logcmdutil.revsingle(repo, rev)
44401
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1487
        if len(ctx.parents()) > 1:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1488
            raise error.InputError(
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1489
                _(b'cannot mark/unmark copy in merge commit')
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1490
            )
44401
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1491
    else:
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1492
        ctx = repo[None]
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1493
44395
27a78ea30b48 copy: rename `wctx` to `ctx` since it will not necessarily be working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  1494
    pctx = ctx.p1()
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1495
41668
e41449818bee copy: respect ui.relative-paths in copy/rename
Martin von Zweigbergk <martinvonz@google.com>
parents: 41664
diff changeset
  1496
    uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1497
44398
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1498
    if forget:
44399
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1499
        if ctx.rev() is None:
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1500
            new_ctx = ctx
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1501
        else:
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1502
            if len(ctx.parents()) > 1:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1503
                raise error.InputError(_(b'cannot unmark copy in merge commit'))
44399
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1504
            # avoid cycle context -> subrepo -> cmdutil
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1505
            from . import context
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1506
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1507
            rewriteutil.precheck(repo, [ctx.rev()], b'uncopy')
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1508
            new_ctx = context.overlayworkingctx(repo)
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1509
            new_ctx.setbase(ctx.p1())
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1510
            mergemod.graft(repo, ctx, wctx=new_ctx)
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1511
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1512
        match = scmutil.match(ctx, pats, opts)
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1513
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1514
        current_copies = ctx.p1copies()
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1515
        current_copies.update(ctx.p2copies())
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1516
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1517
        uipathfn = scmutil.getuipathfn(repo)
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1518
        for f in ctx.walk(match):
44398
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1519
            if f in current_copies:
44399
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1520
                new_ctx[f].markcopied(None)
44398
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1521
            elif match.exact(f):
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1522
                ui.warn(
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1523
                    _(
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1524
                        b'%s: not unmarking as copy - file is not marked as copied\n'
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1525
                    )
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1526
                    % uipathfn(f)
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1527
                )
44399
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1528
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1529
        if ctx.rev() is not None:
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1530
            with repo.lock():
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1531
                mem_ctx = new_ctx.tomemctx_for_amend(ctx)
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1532
                new_node = mem_ctx.commit()
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1533
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1534
                if repo.dirstate.p1() == ctx.node():
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1535
                    with repo.dirstate.parentchange():
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1536
                        scmutil.movedirstate(repo, repo[new_node])
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1537
                replacements = {ctx.node(): [new_node]}
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1538
                scmutil.cleanupnodes(
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1539
                    repo, replacements, b'uncopy', fixphase=True
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1540
                )
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44398
diff changeset
  1541
44398
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1542
        return
8be0c63535b5 copy: add option to unmark file as copied
Martin von Zweigbergk <martinvonz@google.com>
parents: 44395
diff changeset
  1543
44400
d8b49bf6cfec copy: move argument validation a little earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 44399
diff changeset
  1544
    pats = scmutil.expandpats(pats)
d8b49bf6cfec copy: move argument validation a little earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 44399
diff changeset
  1545
    if not pats:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1546
        raise error.InputError(_(b'no source or destination specified'))
44400
d8b49bf6cfec copy: move argument validation a little earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 44399
diff changeset
  1547
    if len(pats) == 1:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1548
        raise error.InputError(_(b'no destination specified'))
44400
d8b49bf6cfec copy: move argument validation a little earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 44399
diff changeset
  1549
    dest = pats.pop()
d8b49bf6cfec copy: move argument validation a little earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 44399
diff changeset
  1550
5605
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
  1551
    def walkpat(pat):
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
  1552
        srcs = []
44770
1cdc80280286 copy: to find copy source, walk parent of revision we're marking copies in
Martin von Zweigbergk <martinvonz@google.com>
parents: 44470
diff changeset
  1553
        # TODO: Inline and simplify the non-working-copy version of this code
1cdc80280286 copy: to find copy source, walk parent of revision we're marking copies in
Martin von Zweigbergk <martinvonz@google.com>
parents: 44470
diff changeset
  1554
        # since it shares very little with the working-copy version of it.
1cdc80280286 copy: to find copy source, walk parent of revision we're marking copies in
Martin von Zweigbergk <martinvonz@google.com>
parents: 44470
diff changeset
  1555
        ctx_to_walk = ctx if ctx.rev() is None else pctx
1cdc80280286 copy: to find copy source, walk parent of revision we're marking copies in
Martin von Zweigbergk <martinvonz@google.com>
parents: 44470
diff changeset
  1556
        m = scmutil.match(ctx_to_walk, [pat], opts, globbed=True)
1cdc80280286 copy: to find copy source, walk parent of revision we're marking copies in
Martin von Zweigbergk <martinvonz@google.com>
parents: 44470
diff changeset
  1557
        for abs in ctx_to_walk.walk(m):
41668
e41449818bee copy: respect ui.relative-paths in copy/rename
Martin von Zweigbergk <martinvonz@google.com>
parents: 41664
diff changeset
  1558
            rel = uipathfn(abs)
6584
29c77e5dfb3c walk: remove rel and exact returns
Matt Mackall <mpm@selenic.com>
parents: 6582
diff changeset
  1559
            exact = m.exact(abs)
44395
27a78ea30b48 copy: rename `wctx` to `ctx` since it will not necessarily be working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  1560
            if abs not in ctx:
44394
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1561
                if abs in pctx:
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1562
                    if not after:
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1563
                        if exact:
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1564
                            ui.warn(
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1565
                                _(
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1566
                                    b'%s: not copying - file has been marked '
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1567
                                    b'for remove\n'
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1568
                                )
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1569
                                % rel
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1570
                            )
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1571
                        continue
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1572
                else:
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1573
                    if exact:
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1574
                        ui.warn(
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1575
                            _(b'%s: not copying - file is not managed\n') % rel
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1576
                        )
44394
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1577
                    continue
2bd3b95fdce0 copy: rewrite walkpat() to depend less on dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44349
diff changeset
  1578
5605
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
  1579
            # abs: hgsep
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
  1580
            # rel: ossep
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
  1581
            srcs.append((abs, rel, exact))
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
  1582
        return srcs
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1583
44401
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1584
    if ctx.rev() is not None:
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1585
        rewriteutil.precheck(repo, [ctx.rev()], b'uncopy')
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1586
        absdest = pathutil.canonpath(repo.root, cwd, dest)
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1587
        if ctx.hasdir(absdest):
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1588
            raise error.InputError(
44401
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1589
                _(b'%s: --at-rev does not support a directory as destination')
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1590
                % uipathfn(absdest)
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1591
            )
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1592
        if absdest not in ctx:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1593
            raise error.InputError(
44401
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1594
                _(b'%s: copy destination does not exist in %s')
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1595
                % (uipathfn(absdest), ctx)
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1596
            )
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1597
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1598
        # avoid cycle context -> subrepo -> cmdutil
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1599
        from . import context
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1600
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1601
        copylist = []
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1602
        for pat in pats:
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1603
            srcs = walkpat(pat)
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1604
            if not srcs:
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1605
                continue
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1606
            for abs, rel, exact in srcs:
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1607
                copylist.append(abs)
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1608
44772
c5574408254a copy: give better error message when no source paths found with --at-rev
Martin von Zweigbergk <martinvonz@google.com>
parents: 44770
diff changeset
  1609
        if not copylist:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1610
            raise error.InputError(_(b'no files to copy'))
44401
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1611
        # TODO: Add support for `hg cp --at-rev . foo bar dir` and
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1612
        # `hg cp --at-rev . dir1 dir2`, preferably unifying the code with the
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1613
        # existing functions below.
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1614
        if len(copylist) != 1:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1615
            raise error.InputError(_(b'--at-rev requires a single source'))
44401
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1616
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1617
        new_ctx = context.overlayworkingctx(repo)
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1618
        new_ctx.setbase(ctx.p1())
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1619
        mergemod.graft(repo, ctx, wctx=new_ctx)
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1620
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1621
        new_ctx.markcopied(absdest, copylist[0])
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1622
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1623
        with repo.lock():
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1624
            mem_ctx = new_ctx.tomemctx_for_amend(ctx)
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1625
            new_node = mem_ctx.commit()
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1626
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1627
            if repo.dirstate.p1() == ctx.node():
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1628
                with repo.dirstate.parentchange():
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1629
                    scmutil.movedirstate(repo, repo[new_node])
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1630
            replacements = {ctx.node(): [new_node]}
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1631
            scmutil.cleanupnodes(repo, replacements, b'copy', fixphase=True)
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1632
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1633
        return
9dab3fa64325 copy: add experimental support for marking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44400
diff changeset
  1634
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1635
    # abssrc: hgsep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1636
    # relsrc: ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1637
    # otarget: ossep
5605
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
  1638
    def copyfile(abssrc, relsrc, otarget, exact):
20033
f962870712da pathutil: tease out a new library to break an import cycle from canonpath use
Augie Fackler <raf@durin42.com>
parents: 19944
diff changeset
  1639
        abstarget = pathutil.canonpath(repo.root, cwd, otarget)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1640
        if b'/' in abstarget:
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16458
diff changeset
  1641
            # We cannot normalize abstarget itself, this would prevent
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16458
diff changeset
  1642
            # case only renames, like a => A.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1643
            abspath, absname = abstarget.rsplit(b'/', 1)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1644
            abstarget = repo.dirstate.normalize(abspath) + b'/' + absname
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1645
        reltarget = repo.pathto(abstarget, cwd)
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1646
        target = repo.wjoin(abstarget)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1647
        src = repo.wjoin(abssrc)
48114
304267b077de dirstate-item: use item's property instead of `state` in copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48112
diff changeset
  1648
        entry = repo.dirstate.get_entry(abstarget)
304267b077de dirstate-item: use item's property instead of `state` in copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48112
diff changeset
  1649
304267b077de dirstate-item: use item's property instead of `state` in copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48112
diff changeset
  1650
        already_commited = entry.tracked and not entry.added
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1651
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13945
diff changeset
  1652
        scmutil.checkportable(ui, abstarget)
13945
03f3ce7ca2a8 copy: do not copy file if name is disallowed anyway
Adrian Buehlmann <adrian@cadifra.com>
parents: 13878
diff changeset
  1653
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1654
        # check for collisions
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1655
        prevsrc = targets.get(abstarget)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1656
        if prevsrc is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1657
            ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1658
                _(b'%s: not overwriting - %s collides with %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1659
                % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1660
                    reltarget,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1661
                    repo.pathto(abssrc, cwd),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1662
                    repo.pathto(prevsrc, cwd),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1663
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1664
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1665
            return True  # report a failure
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1666
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1667
        # check for overwrites
12342
70236d6fd844 rename: do not overwrite existing broken symlinks
Patrick Mezard <pmezard@gmail.com>
parents: 11950
diff changeset
  1668
        exists = os.path.lexists(target)
16283
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
  1669
        samefile = False
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
  1670
        if exists and abssrc != abstarget:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1671
            if repo.dirstate.normalize(abssrc) == repo.dirstate.normalize(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1672
                abstarget
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1673
            ):
16283
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
  1674
                if not rename:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1675
                    ui.warn(_(b"%s: can't copy - same file\n") % reltarget)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1676
                    return True  # report a failure
16283
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
  1677
                exists = False
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
  1678
                samefile = True
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
  1679
48114
304267b077de dirstate-item: use item's property instead of `state` in copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48112
diff changeset
  1680
        if not after and exists or after and already_commited:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1681
            if not opts[b'force']:
48114
304267b077de dirstate-item: use item's property instead of `state` in copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48112
diff changeset
  1682
                if already_commited:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1683
                    msg = _(b'%s: not overwriting - file already committed\n')
48258
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1684
                    # Check if if the target was added in the parent and the
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1685
                    # source already existed in the grandparent.
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1686
                    looks_like_copy_in_pctx = abstarget in pctx and any(
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1687
                        abssrc in gpctx and abstarget not in gpctx
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1688
                        for gpctx in pctx.parents()
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1689
                    )
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1690
                    if looks_like_copy_in_pctx:
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1691
                        if rename:
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1692
                            hint = _(
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1693
                                b"('hg rename --at-rev .' to record the rename "
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1694
                                b"in the parent of the working copy)\n"
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1695
                            )
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1696
                        else:
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1697
                            hint = _(
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1698
                                b"('hg copy --at-rev .' to record the copy in "
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1699
                                b"the parent of the working copy)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1700
                            )
30151
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
  1701
                    else:
48258
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1702
                        if after:
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1703
                            flags = b'--after --force'
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1704
                        else:
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1705
                            flags = b'--force'
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1706
                        if rename:
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1707
                            hint = (
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1708
                                _(
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1709
                                    b"('hg rename %s' to replace the file by "
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1710
                                    b'recording a rename)\n'
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1711
                                )
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1712
                                % flags
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1713
                            )
48258
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1714
                        else:
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1715
                            hint = (
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1716
                                _(
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1717
                                    b"('hg copy %s' to replace the file by "
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1718
                                    b'recording a copy)\n'
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1719
                                )
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1720
                                % flags
c62e4397eb28 copy: recommend `--at-rev .` if target was added in parent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48130
diff changeset
  1721
                            )
30151
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
  1722
                else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1723
                    msg = _(b'%s: not overwriting - file exists\n')
30151
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
  1724
                    if rename:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1725
                        hint = _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1726
                            b"('hg rename --after' to record the rename)\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1727
                        )
30151
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
  1728
                    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1729
                        hint = _(b"('hg copy --after' to record the copy)\n")
30151
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
  1730
                ui.warn(msg % reltarget)
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
  1731
                ui.warn(hint)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1732
                return True  # report a failure
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1733
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1734
        if after:
5608
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
  1735
            if not exists:
11152
e8d10d085f47 cmdutil: Warn when trying to copy/rename --after to a nonexistant file.
Steve Losh <steve@stevelosh.com>
parents: 11061
diff changeset
  1736
                if rename:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1737
                    ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1738
                        _(b'%s: not recording move - %s does not exist\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1739
                        % (relsrc, reltarget)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1740
                    )
11152
e8d10d085f47 cmdutil: Warn when trying to copy/rename --after to a nonexistant file.
Steve Losh <steve@stevelosh.com>
parents: 11061
diff changeset
  1741
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1742
                    ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1743
                        _(b'%s: not recording copy - %s does not exist\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1744
                        % (relsrc, reltarget)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1745
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1746
                return True  # report a failure
5608
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
  1747
        elif not dryrun:
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1748
            try:
5608
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
  1749
                if exists:
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
  1750
                    os.unlink(target)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1751
                targetdir = os.path.dirname(target) or b'.'
5608
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
  1752
                if not os.path.isdir(targetdir):
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
  1753
                    os.makedirs(targetdir)
16283
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
  1754
                if samefile:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1755
                    tmp = target + b"~hgrename"
16283
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
  1756
                    os.rename(src, tmp)
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
  1757
                    os.rename(tmp, target)
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
  1758
                else:
37091
08890706366e copyfile: preserve stat info (mtime, etc.) when doing copies/renames
Kyle Lippincott <spectral@google.com>
parents: 37087
diff changeset
  1759
                    # Preserve stat info on renames, not on copies; this matches
08890706366e copyfile: preserve stat info (mtime, etc.) when doing copies/renames
Kyle Lippincott <spectral@google.com>
parents: 37087
diff changeset
  1760
                    # Linux CLI behavior.
08890706366e copyfile: preserve stat info (mtime, etc.) when doing copies/renames
Kyle Lippincott <spectral@google.com>
parents: 37087
diff changeset
  1761
                    util.copyfile(src, target, copystat=rename)
14518
a67e866f46f9 workingctx: eliminate remove function
Adrian Buehlmann <adrian@cadifra.com>
parents: 14442
diff changeset
  1762
                srcexists = True
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25657
diff changeset
  1763
            except IOError as inst:
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1764
                if inst.errno == errno.ENOENT:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1765
                    ui.warn(_(b'%s: deleted in working directory\n') % relsrc)
14518
a67e866f46f9 workingctx: eliminate remove function
Adrian Buehlmann <adrian@cadifra.com>
parents: 14442
diff changeset
  1766
                    srcexists = False
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1767
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1768
                    ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1769
                        _(b'%s: cannot copy - %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1770
                        % (relsrc, encoding.strtolocal(inst.strerror))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1771
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1772
                    return True  # report a failure
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1773
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1774
        if ui.verbose or not exact:
7894
caef5fdf1375 cmdutil: fix untranslatable string in copy
Martin Geisler <mg@daimi.au.dk>
parents: 7879
diff changeset
  1775
            if rename:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1776
                ui.status(_(b'moving %s to %s\n') % (relsrc, reltarget))
7894
caef5fdf1375 cmdutil: fix untranslatable string in copy
Martin Geisler <mg@daimi.au.dk>
parents: 7879
diff changeset
  1777
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1778
                ui.status(_(b'copying %s to %s\n') % (relsrc, reltarget))
5608
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
  1779
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1780
        targets[abstarget] = abssrc
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1781
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1782
        # fix up dirstate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1783
        scmutil.dirstatecopy(
44395
27a78ea30b48 copy: rename `wctx` to `ctx` since it will not necessarily be working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  1784
            ui, repo, ctx, abssrc, abstarget, dryrun=dryrun, cwd=cwd
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1785
        )
5610
2493a478f395 copy: handle rename internally
Matt Mackall <mpm@selenic.com>
parents: 5609
diff changeset
  1786
        if rename and not dryrun:
16283
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
  1787
            if not after and srcexists and not samefile:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1788
                rmdir = repo.ui.configbool(b'experimental', b'removeemptydirs')
38497
da2a7d8354b2 unlinkpath: make empty directory removal optional (issue5901) (issue5826)
Kyle Lippincott <spectral@google.com>
parents: 38465
diff changeset
  1789
                repo.wvfs.unlinkpath(abssrc, rmdir=rmdir)
44395
27a78ea30b48 copy: rename `wctx` to `ctx` since it will not necessarily be working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  1790
            ctx.forget([abssrc])
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1791
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1792
    # pat: ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1793
    # dest ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1794
    # srcs: list of (hgsep, hgsep, ossep, bool)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1795
    # return: function that takes hgsep and returns ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1796
    def targetpathfn(pat, dest, srcs):
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1797
        if os.path.isdir(pat):
20033
f962870712da pathutil: tease out a new library to break an import cycle from canonpath use
Augie Fackler <raf@durin42.com>
parents: 19944
diff changeset
  1798
            abspfx = pathutil.canonpath(repo.root, cwd, pat)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1799
            abspfx = util.localpath(abspfx)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1800
            if destdirexists:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1801
                striplen = len(os.path.split(abspfx)[0])
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1802
            else:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1803
                striplen = len(abspfx)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1804
            if striplen:
30620
bb77654dc7ae py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30543
diff changeset
  1805
                striplen += len(pycompat.ossep)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1806
            res = lambda p: os.path.join(dest, util.localpath(p)[striplen:])
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1807
        elif destdirexists:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1808
            res = lambda p: os.path.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1809
                dest, os.path.basename(util.localpath(p))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1810
            )
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1811
        else:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1812
            res = lambda p: dest
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1813
        return res
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1814
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1815
    # pat: ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1816
    # dest ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1817
    # srcs: list of (hgsep, hgsep, ossep, bool)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1818
    # return: function that takes hgsep and returns ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1819
    def targetpathafterfn(pat, dest, srcs):
12085
6f833fc3ccab Consistently import foo as foomod when foo to avoid shadowing
Martin Geisler <mg@aragost.com>
parents: 12032
diff changeset
  1820
        if matchmod.patkind(pat):
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1821
            # a mercurial pattern
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1822
            res = lambda p: os.path.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1823
                dest, os.path.basename(util.localpath(p))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1824
            )
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1825
        else:
20033
f962870712da pathutil: tease out a new library to break an import cycle from canonpath use
Augie Fackler <raf@durin42.com>
parents: 19944
diff changeset
  1826
            abspfx = pathutil.canonpath(repo.root, cwd, pat)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1827
            if len(abspfx) < len(srcs[0][0]):
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1828
                # A directory. Either the target path contains the last
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1829
                # component of the source path or it does not.
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1830
                def evalpath(striplen):
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1831
                    score = 0
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1832
                    for s in srcs:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1833
                        t = os.path.join(dest, util.localpath(s[0])[striplen:])
12357
cb59654c2c7a Restore lexists() changes lost in e0ee3e822a9a merge
Patrick Mezard <pmezard@gmail.com>
parents: 12345
diff changeset
  1834
                        if os.path.lexists(t):
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1835
                            score += 1
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1836
                    return score
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1837
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1838
                abspfx = util.localpath(abspfx)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1839
                striplen = len(abspfx)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1840
                if striplen:
30620
bb77654dc7ae py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30543
diff changeset
  1841
                    striplen += len(pycompat.ossep)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1842
                if os.path.isdir(os.path.join(dest, os.path.split(abspfx)[1])):
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1843
                    score = evalpath(striplen)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1844
                    striplen1 = len(os.path.split(abspfx)[0])
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1845
                    if striplen1:
30620
bb77654dc7ae py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30543
diff changeset
  1846
                        striplen1 += len(pycompat.ossep)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1847
                    if evalpath(striplen1) > score:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1848
                        striplen = striplen1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1849
                res = lambda p: os.path.join(dest, util.localpath(p)[striplen:])
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1850
            else:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1851
                # a file
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1852
                if destdirexists:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1853
                    res = lambda p: os.path.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1854
                        dest, os.path.basename(util.localpath(p))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1855
                    )
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1856
                else:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1857
                    res = lambda p: dest
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1858
        return res
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1859
6258
c24f4b3f156b Fix issue995 (copy --after and symlinks pointing to a directory)
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
  1860
    destdirexists = os.path.isdir(dest) and not os.path.islink(dest)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1861
    if not destdirexists:
12085
6f833fc3ccab Consistently import foo as foomod when foo to avoid shadowing
Martin Geisler <mg@aragost.com>
parents: 12032
diff changeset
  1862
        if len(pats) > 1 or matchmod.patkind(pats[0]):
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1863
            raise error.InputError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1864
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1865
                    b'with multiple sources, destination must be an '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1866
                    b'existing directory'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1867
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1868
            )
5843
83c354c4d529 Add endswithsep() and use it instead of using os.sep and os.altsep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5836
diff changeset
  1869
        if util.endswithsep(dest):
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1870
            raise error.InputError(
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1871
                _(b'destination %s is not a directory') % dest
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1872
            )
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1873
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1874
    tfn = targetpathfn
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
  1875
    if after:
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1876
        tfn = targetpathafterfn
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1877
    copylist = []
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1878
    for pat in pats:
5605
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
  1879
        srcs = walkpat(pat)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1880
        if not srcs:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1881
            continue
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1882
        copylist.append((tfn(pat, dest, srcs), srcs))
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1883
    if not copylist:
47141
5ffc6c18fb96 rename: add hint about --at-rev if source file doesn't exist
Martin von Zweigbergk <martinvonz@google.com>
parents: 47089
diff changeset
  1884
        hint = None
5ffc6c18fb96 rename: add hint about --at-rev if source file doesn't exist
Martin von Zweigbergk <martinvonz@google.com>
parents: 47089
diff changeset
  1885
        if rename:
5ffc6c18fb96 rename: add hint about --at-rev if source file doesn't exist
Martin von Zweigbergk <martinvonz@google.com>
parents: 47089
diff changeset
  1886
            hint = _(b'maybe you meant to use --after --at-rev=.')
5ffc6c18fb96 rename: add hint about --at-rev if source file doesn't exist
Martin von Zweigbergk <martinvonz@google.com>
parents: 47089
diff changeset
  1887
        raise error.InputError(_(b'no files to copy'), hint=hint)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1888
5606
447ea621e50e copy: propagate errors properly
Matt Mackall <mpm@selenic.com>
parents: 5605
diff changeset
  1889
    errors = 0
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1890
    for targetpath, srcs in copylist:
5605
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
  1891
        for abssrc, relsrc, exact in srcs:
5606
447ea621e50e copy: propagate errors properly
Matt Mackall <mpm@selenic.com>
parents: 5605
diff changeset
  1892
            if copyfile(abssrc, relsrc, targetpath(abssrc), exact):
447ea621e50e copy: propagate errors properly
Matt Mackall <mpm@selenic.com>
parents: 5605
diff changeset
  1893
                errors += 1
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1894
11177
6a64813276ed commands: initial audit of exit codes
Matt Mackall <mpm@selenic.com>
parents: 11152
diff changeset
  1895
    return errors != 0
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
  1896
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1897
26561
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1898
## facility to let extension process additional data into an import patch
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1899
# list of identifier to be executed in order
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1900
extrapreimport = []  # run before commit
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1901
extrapostimport = []  # run after commit
26561
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1902
# mapping from identifier to actual import function
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1903
#
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1904
# 'preimport' are run before the commit is made and are provided the following
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1905
# arguments:
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1906
# - repo: the localrepository instance,
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1907
# - patchdata: data extracted from patch header (cf m.patch.patchheadermap),
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26750
diff changeset
  1908
# - extra: the future extra dictionary of the changeset, please mutate it,
26561
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1909
# - opts: the import options.
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1910
# XXX ideally, we would just pass an ctx ready to be computed, that would allow
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1911
# mutation of in memory commit and more. Feel free to rework the code to get
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1912
# there.
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1913
extrapreimportmap = {}
26562
dd2f5e014806 import: allow processing of extra part header after import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26561
diff changeset
  1914
# 'postimport' are run after the commit is made and are provided the following
dd2f5e014806 import: allow processing of extra part header after import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26561
diff changeset
  1915
# argument:
dd2f5e014806 import: allow processing of extra part header after import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26561
diff changeset
  1916
# - ctx: the changectx created by import.
dd2f5e014806 import: allow processing of extra part header after import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26561
diff changeset
  1917
extrapostimportmap = {}
26561
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
  1918
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1919
37620
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
  1920
def tryimportone(ui, repo, patchdata, parents, opts, msgs, updatefunc):
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1921
    """Utility function used by commands.import to import a single patch
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1922
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1923
    This function is explicitly defined here to help the evolve extension to
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1924
    wrap this part of the import logic.
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1925
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1926
    The API is currently a bit ugly because it a simple code translation from
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1927
    the import command. Feel free to make it better.
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1928
37620
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
  1929
    :patchdata: a dictionary containing parsed patch data (such as from
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
  1930
                ``patch.extract()``)
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1931
    :parents: nodes that will be parent of the created commit
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1932
    :opts: the full dict of option passed to the import command
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1933
    :msgs: list to save commit message to.
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1934
           (used in case we need to save it when failing)
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1935
    :updatefunc: a function that update a repo to a given node
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1936
                 updatefunc(<repo>, <node>)
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1937
    """
25930
221491bbaf7e cmdutil: break import cycle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25795
diff changeset
  1938
    # avoid cycle context -> subrepo -> cmdutil
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
  1939
    from . import context
37620
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
  1940
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1941
    tmpname = patchdata.get(b'filename')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1942
    message = patchdata.get(b'message')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1943
    user = opts.get(b'user') or patchdata.get(b'user')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1944
    date = opts.get(b'date') or patchdata.get(b'date')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1945
    branch = patchdata.get(b'branch')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1946
    nodeid = patchdata.get(b'nodeid')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1947
    p1 = patchdata.get(b'p1')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1948
    p2 = patchdata.get(b'p2')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1949
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1950
    nocommit = opts.get(b'no_commit')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1951
    importbranch = opts.get(b'import_branch')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1952
    update = not opts.get(b'bypass')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1953
    strip = opts[b"strip"]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1954
    prefix = opts[b"prefix"]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1955
    sim = float(opts.get(b'similarity') or 0)
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1956
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1957
    if not tmpname:
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1958
        return None, None, False
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1959
21553
bee0e1cffdd3 import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21419
diff changeset
  1960
    rejects = False
bee0e1cffdd3 import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21419
diff changeset
  1961
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1962
    cmdline_message = logmessage(ui, opts)
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1963
    if cmdline_message:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1964
        # pickup the cmdline msg
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1965
        message = cmdline_message
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1966
    elif message:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1967
        # pickup the patch msg
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1968
        message = message.strip()
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1969
    else:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1970
        # launch the editor
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1971
        message = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1972
    ui.debug(b'message:\n%s\n' % (message or b''))
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1973
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1974
    if len(parents) == 1:
46842
ad878e3f282b refactor: prefer lookup by revision, even for null
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
  1975
        parents.append(repo[nullrev])
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1976
    if opts.get(b'exact'):
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1977
        if not nodeid or not p1:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  1978
            raise error.InputError(_(b'not a Mercurial patch'))
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1979
        p1 = repo[p1]
46842
ad878e3f282b refactor: prefer lookup by revision, even for null
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
  1980
        p2 = repo[p2 or nullrev]
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1981
    elif p2:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1982
        try:
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  1983
            p1 = repo[p1]
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1984
            p2 = repo[p2]
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1985
            # Without any options, consider p2 only if the
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1986
            # patch is being applied on top of the recorded
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1987
            # first parent.
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1988
            if p1 != parents[0]:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1989
                p1 = parents[0]
46842
ad878e3f282b refactor: prefer lookup by revision, even for null
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
  1990
                p2 = repo[nullrev]
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1991
        except error.RepoError:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  1992
            p1, p2 = parents
46842
ad878e3f282b refactor: prefer lookup by revision, even for null
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
  1993
        if p2.rev() == nullrev:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1994
            ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1995
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1996
                    b"warning: import the patch as a normal revision\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1997
                    b"(use --exact to import the patch as a merge)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1998
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  1999
            )
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2000
    else:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2001
        p1, p2 = parents
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2002
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2003
    n = None
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2004
    if update:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2005
        if p1 != parents[0]:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2006
            updatefunc(repo, p1.node())
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2007
        if p2 != parents[1]:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2008
            repo.setparents(p1.node(), p2.node())
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2009
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2010
        if opts.get(b'exact') or importbranch:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2011
            repo.dirstate.setbranch(branch or b'default')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2012
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2013
        partial = opts.get(b'partial', False)
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2014
        files = set()
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2015
        try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2016
            patch.patch(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2017
                ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2018
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2019
                tmpname,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2020
                strip=strip,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2021
                prefix=prefix,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2022
                files=files,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2023
                eolmode=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2024
                similarity=sim / 100.0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2025
            )
48411
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  2026
        except error.PatchParseError as e:
48412
220506bb213e patch: add hint about mangled whitespace on bad patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48411
diff changeset
  2027
            raise error.InputError(
220506bb213e patch: add hint about mangled whitespace on bad patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48411
diff changeset
  2028
                pycompat.bytestr(e),
220506bb213e patch: add hint about mangled whitespace on bad patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48411
diff changeset
  2029
                hint=_(
220506bb213e patch: add hint about mangled whitespace on bad patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48411
diff changeset
  2030
                    b'check that whitespace in the patch has not been mangled'
220506bb213e patch: add hint about mangled whitespace on bad patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48411
diff changeset
  2031
                ),
220506bb213e patch: add hint about mangled whitespace on bad patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48411
diff changeset
  2032
            )
48411
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  2033
        except error.PatchApplicationError as e:
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2034
            if not partial:
48411
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  2035
                raise error.StateError(pycompat.bytestr(e))
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2036
            if partial:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2037
                rejects = True
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2038
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2039
        files = list(files)
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2040
        if nocommit:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2041
            if message:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2042
                msgs.append(message)
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  2043
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2044
            if opts.get(b'exact') or p2:
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2045
                # If you got here, you either use --force and know what
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2046
                # you are doing or used --exact or a merge patch while
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2047
                # being updated to its first parent.
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2048
                m = None
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2049
            else:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2050
                m = scmutil.matchfiles(repo, files or [])
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2051
            editform = mergeeditform(repo[None], b'import.normal')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2052
            if opts.get(b'exact'):
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2053
                editor = None
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2054
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2055
                editor = getcommiteditor(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2056
                    editform=editform, **pycompat.strkwargs(opts)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2057
                )
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2058
            extra = {}
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2059
            for idfunc in extrapreimport:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2060
                extrapreimportmap[idfunc](repo, patchdata, extra, opts)
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2061
            overrides = {}
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2062
            if partial:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2063
                overrides[(b'ui', b'allowemptycommit')] = True
43758
71dbd6f6fcb8 import: add a --secret option
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43751
diff changeset
  2064
            if opts.get(b'secret'):
71dbd6f6fcb8 import: add a --secret option
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43751
diff changeset
  2065
                overrides[(b'phases', b'new-commit')] = b'secret'
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2066
            with repo.ui.configoverride(overrides, b'import'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2067
                n = repo.commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2068
                    message, user, date, match=m, editor=editor, extra=extra
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2069
                )
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2070
                for idfunc in extrapostimport:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2071
                    extrapostimportmap[idfunc](repo[n])
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2072
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2073
        if opts.get(b'exact') or importbranch:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2074
            branch = branch or b'default'
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2075
        else:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2076
            branch = p1.branch()
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2077
        store = patch.filestore()
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2078
        try:
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  2079
            files = set()
21553
bee0e1cffdd3 import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21419
diff changeset
  2080
            try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2081
                patch.patchrepo(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2082
                    ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2083
                    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2084
                    p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2085
                    store,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2086
                    tmpname,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2087
                    strip,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2088
                    prefix,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2089
                    files,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2090
                    eolmode=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2091
                )
48411
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  2092
            except error.PatchParseError as e:
48412
220506bb213e patch: add hint about mangled whitespace on bad patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48411
diff changeset
  2093
                raise error.InputError(
220506bb213e patch: add hint about mangled whitespace on bad patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48411
diff changeset
  2094
                    stringutil.forcebytestr(e),
220506bb213e patch: add hint about mangled whitespace on bad patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48411
diff changeset
  2095
                    hint=_(
220506bb213e patch: add hint about mangled whitespace on bad patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48411
diff changeset
  2096
                        b'check that whitespace in the patch has not been mangled'
220506bb213e patch: add hint about mangled whitespace on bad patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48411
diff changeset
  2097
                    ),
220506bb213e patch: add hint about mangled whitespace on bad patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48411
diff changeset
  2098
                )
48411
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  2099
            except error.PatchApplicationError as e:
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  2100
                raise error.StateError(stringutil.forcebytestr(e))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2101
            if opts.get(b'exact'):
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2102
                editor = None
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  2103
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2104
                editor = getcommiteditor(editform=b'import.bypass')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2105
            memctx = context.memctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2106
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2107
                (p1.node(), p2.node()),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2108
                message,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2109
                files=files,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2110
                filectxfn=store,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2111
                user=user,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2112
                date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2113
                branch=branch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2114
                editor=editor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2115
            )
44184
b339faf3f843 import: don't ignore `--secret` when `--bypass` is specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 44098
diff changeset
  2116
b339faf3f843 import: don't ignore `--secret` when `--bypass` is specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 44098
diff changeset
  2117
            overrides = {}
b339faf3f843 import: don't ignore `--secret` when `--bypass` is specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 44098
diff changeset
  2118
            if opts.get(b'secret'):
b339faf3f843 import: don't ignore `--secret` when `--bypass` is specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 44098
diff changeset
  2119
                overrides[(b'phases', b'new-commit')] = b'secret'
b339faf3f843 import: don't ignore `--secret` when `--bypass` is specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 44098
diff changeset
  2120
            with repo.ui.configoverride(overrides, b'import'):
b339faf3f843 import: don't ignore `--secret` when `--bypass` is specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 44098
diff changeset
  2121
                n = memctx.commit()
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2122
        finally:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2123
            store.close()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2124
    if opts.get(b'exact') and nocommit:
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2125
        # --exact with --no-commit is still useful in that it does merge
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2126
        # and branch bits
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2127
        ui.warn(_(b"warning: can't check exact import with --no-commit\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2128
    elif opts.get(b'exact') and (not n or hex(n) != nodeid):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2129
        raise error.Abort(_(b'patch is damaged or loses information'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2130
    msg = _(b'applied to working directory')
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2131
    if n:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2132
        # i18n: refers to a short changeset id
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2133
        msg = _(b'created %s') % short(n)
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
  2134
    return msg, n, rejects
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
  2135
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2136
26545
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
  2137
# facility to let extensions include additional data in an exported patch
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
  2138
# list of identifiers to be executed in order
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
  2139
extraexport = []
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
  2140
# mapping from identifier to actual export function
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
  2141
# function as to return a string to be added to the header or None
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
  2142
# it is given two arguments (sequencenumber, changectx)
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
  2143
extraexportmap = {}
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
  2144
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2145
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2146
def _exportsingle(repo, ctx, fm, match, switch_parent, seqno, diffopts):
32682
9d201b39ccd9 export: map wctx.node() to 'ff...' node id (issue5438)
Yuya Nishihara <yuya@tcha.org>
parents: 32678
diff changeset
  2147
    node = scmutil.binnode(ctx)
32471
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2148
    parents = [p.node() for p in ctx.parents() if p]
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2149
    branch = ctx.branch()
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2150
    if switch_parent:
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2151
        parents.reverse()
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2152
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2153
    if parents:
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2154
        prev = parents[0]
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2155
    else:
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46969
diff changeset
  2156
        prev = repo.nullid
32471
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2157
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2158
    fm.context(ctx=ctx)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2159
    fm.plain(b'# HG changeset patch\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2160
    fm.write(b'user', b'# User %s\n', ctx.user())
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2161
    fm.plain(b'# Date %d %d\n' % ctx.date())
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2162
    fm.write(b'date', b'#      %s\n', fm.formatdate(ctx.date()))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2163
    fm.condwrite(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2164
        branch and branch != b'default', b'branch', b'# Branch %s\n', branch
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2165
    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2166
    fm.write(b'node', b'# Node ID %s\n', hex(node))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2167
    fm.plain(b'# Parent  %s\n' % hex(prev))
32471
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2168
    if len(parents) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2169
        fm.plain(b'# Parent  %s\n' % hex(parents[1]))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2170
    fm.data(parents=fm.formatlist(pycompat.maplist(hex, parents), name=b'node'))
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2171
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2172
    # TODO: redesign extraexportmap function to support formatter
32471
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2173
    for headerid in extraexport:
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2174
        header = extraexportmap[headerid](seqno, ctx)
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2175
        if header is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2176
            fm.plain(b'# %s\n' % header)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2177
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2178
    fm.write(b'desc', b'%s\n', ctx.description().rstrip())
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2179
    fm.plain(b'\n')
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2180
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2181
    if fm.isplain():
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2182
        chunkiter = patch.diffui(repo, prev, node, match, opts=diffopts)
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2183
        for chunk, label in chunkiter:
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2184
            fm.plain(chunk, label=label)
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2185
    else:
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2186
        chunkiter = patch.diff(repo, prev, node, match, opts=diffopts)
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2187
        # TODO: make it structured?
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2188
        fm.data(diff=b''.join(chunkiter))
32471
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
  2189
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2190
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
  2191
def _exportfile(repo, revs, fm, dest, switch_parent, diffopts, match):
37600
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
  2192
    """Export changesets to stdout or a single file"""
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
  2193
    for seqno, rev in enumerate(revs, 1):
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
  2194
        ctx = repo[rev]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2195
        if not dest.startswith(b'<'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2196
            repo.ui.note(b"%s\n" % dest)
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2197
        fm.startitem()
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2198
        _exportsingle(repo, ctx, fm, match, switch_parent, seqno, diffopts)
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
  2199
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2200
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2201
def _exportfntemplate(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2202
    repo, revs, basefm, fntemplate, switch_parent, diffopts, match
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2203
):
37600
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
  2204
    """Export changesets to possibly multiple files"""
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
  2205
    total = len(revs)
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
  2206
    revwidth = max(len(str(rev)) for rev in revs)
37601
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
  2207
    filemap = util.sortdict()  # filename: [(seqno, rev), ...]
37600
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
  2208
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
  2209
    for seqno, rev in enumerate(revs, 1):
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
  2210
        ctx = repo[rev]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2211
        dest = makefilename(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2212
            ctx, fntemplate, total=total, seqno=seqno, revwidth=revwidth
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2213
        )
37601
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
  2214
        filemap.setdefault(dest, []).append((seqno, rev))
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
  2215
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
  2216
    for dest in filemap:
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
  2217
        with formatter.maybereopen(basefm, dest) as fm:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2218
            repo.ui.note(b"%s\n" % dest)
37601
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
  2219
            for seqno, rev in filemap[dest]:
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
  2220
                fm.startitem()
37601
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
  2221
                ctx = repo[rev]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2222
                _exportsingle(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2223
                    repo, ctx, fm, match, switch_parent, seqno, diffopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2224
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2225
37600
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
  2226
42489
307f67d4aee3 export: don't prefetch *all* files in manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 42418
diff changeset
  2227
def _prefetchchangedfiles(repo, revs, match):
307f67d4aee3 export: don't prefetch *all* files in manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 42418
diff changeset
  2228
    allfiles = set()
307f67d4aee3 export: don't prefetch *all* files in manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 42418
diff changeset
  2229
    for rev in revs:
307f67d4aee3 export: don't prefetch *all* files in manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 42418
diff changeset
  2230
        for file in repo[rev].files():
307f67d4aee3 export: don't prefetch *all* files in manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 42418
diff changeset
  2231
            if not match or match(file):
307f67d4aee3 export: don't prefetch *all* files in manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 42418
diff changeset
  2232
                allfiles.add(file)
45073
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 45040
diff changeset
  2233
    match = scmutil.matchfiles(repo, allfiles)
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 45040
diff changeset
  2234
    revmatches = [(rev, match) for rev in revs]
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 45040
diff changeset
  2235
    scmutil.prefetchfiles(repo, revmatches)
42489
307f67d4aee3 export: don't prefetch *all* files in manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 42418
diff changeset
  2236
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2237
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2238
def export(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2239
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2240
    revs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2241
    basefm,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2242
    fntemplate=b'hg-%h.patch',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2243
    switch_parent=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2244
    opts=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2245
    match=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2246
):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  2247
    """export changesets as hg patches
32468
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2248
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2249
    Args:
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2250
      repo: The repository from which we're exporting revisions.
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2251
      revs: A list of revisions to export as revision numbers.
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
  2252
      basefm: A formatter to which patches should be written.
32469
9fd9f91b0c43 cmdutil: rename template param to export to fntemplate
Augie Fackler <augie@google.com>
parents: 32468
diff changeset
  2253
      fntemplate: An optional string to use for generating patch file names.
32468
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2254
      switch_parent: If True, show diffs against second parent when not nullid.
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2255
                     Default is false, which always shows diff against p1.
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2256
      opts: diff options to use for generating the patch.
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2257
      match: If specified, only export changes to files matching this matcher.
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2258
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2259
    Returns:
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2260
      Nothing.
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2261
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2262
    Side Effect:
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2263
      "HG Changeset Patch" data is emitted to one of the following
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2264
      destinations:
32469
9fd9f91b0c43 cmdutil: rename template param to export to fntemplate
Augie Fackler <augie@google.com>
parents: 32468
diff changeset
  2265
        fntemplate specified: Each rev is written to a unique file named using
32468
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
  2266
                            the given template.
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
  2267
        Otherwise: All revs will be written to basefm.
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  2268
    """
42489
307f67d4aee3 export: don't prefetch *all* files in manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 42418
diff changeset
  2269
    _prefetchchangedfiles(repo, revs, match)
37763
b54404d66f7e export: invoke the file prefetch hook
Matt Harbison <matt_harbison@yahoo.com>
parents: 37762
diff changeset
  2270
37603
678d760c71ff export: extract function to write patch to file object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37602
diff changeset
  2271
    if not fntemplate:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2272
        _exportfile(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2273
            repo, revs, basefm, b'<unnamed>', switch_parent, opts, match
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2274
        )
37600
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
  2275
    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2276
        _exportfntemplate(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2277
            repo, revs, basefm, fntemplate, switch_parent, opts, match
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2278
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2279
10611
e764f24a45ee patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10608
diff changeset
  2280
37603
678d760c71ff export: extract function to write patch to file object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37602
diff changeset
  2281
def exportfile(repo, revs, fp, switch_parent=False, opts=None, match=None):
678d760c71ff export: extract function to write patch to file object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37602
diff changeset
  2282
    """Export changesets to the given file stream"""
42489
307f67d4aee3 export: don't prefetch *all* files in manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 42418
diff changeset
  2283
    _prefetchchangedfiles(repo, revs, match)
37763
b54404d66f7e export: invoke the file prefetch hook
Matt Harbison <matt_harbison@yahoo.com>
parents: 37762
diff changeset
  2284
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2285
    dest = getattr(fp, 'name', b'<unnamed>')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2286
    with formatter.formatter(repo.ui, fp, b'export', {}) as fm:
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
  2287
        _exportfile(repo, revs, fm, dest, switch_parent, opts, match)
37603
678d760c71ff export: extract function to write patch to file object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37602
diff changeset
  2288
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2289
29806
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
  2290
def showmarker(fm, marker, index=None):
20470
78f4c2b7052f debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20392
diff changeset
  2291
    """utility function to display obsolescence marker in a readable way
78f4c2b7052f debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20392
diff changeset
  2292
78f4c2b7052f debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20392
diff changeset
  2293
    To be used by debug function."""
28613
6433da9c96a9 debugobsolete: add an option to show marker index
Kostia Balytskyi <ikostia@fb.com>
parents: 28608
diff changeset
  2294
    if index is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2295
        fm.write(b'index', b'%i ', index)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2296
    fm.write(b'prednode', b'%s ', hex(marker.prednode()))
29806
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
  2297
    succs = marker.succnodes()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2298
    fm.condwrite(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2299
        succs,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2300
        b'succnodes',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2301
        b'%s ',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2302
        fm.formatlist(map(hex, succs), name=b'node'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2303
    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2304
    fm.write(b'flag', b'%X ', marker.flags())
22260
2229d757802d debugobsolete: display parents information from markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22250
diff changeset
  2305
    parents = marker.parentnodes()
2229d757802d debugobsolete: display parents information from markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22250
diff changeset
  2306
    if parents is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2307
        fm.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2308
            b'parentnodes',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2309
            b'{%s} ',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2310
            fm.formatlist(map(hex, parents), name=b'node', sep=b', '),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2311
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2312
    fm.write(b'date', b'(%s) ', fm.formatdate(marker.date()))
29806
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
  2313
    meta = marker.metadata().copy()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2314
    meta.pop(b'date', None)
38576
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38543
diff changeset
  2315
    smeta = pycompat.rapply(pycompat.maybebytestr, meta)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2316
    fm.write(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2317
        b'metadata', b'{%s}', fm.formatdict(smeta, fmt=b'%r: %r', sep=b', ')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2318
    )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2319
    fm.plain(b'\n')
20470
78f4c2b7052f debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20392
diff changeset
  2320
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2321
3814
120be84f33de Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents: 3738
diff changeset
  2322
def finddate(ui, repo, date):
120be84f33de Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents: 3738
diff changeset
  2323
    """Find the tipmost changeset that matches the given date spec"""
45468
d2b5a7659fff cmdutil: reimplement finddate() without using walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 45408
diff changeset
  2324
    mrevs = repo.revs(b'date(%s)', date)
d2b5a7659fff cmdutil: reimplement finddate() without using walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 45408
diff changeset
  2325
    try:
d2b5a7659fff cmdutil: reimplement finddate() without using walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 45408
diff changeset
  2326
        rev = mrevs.max()
d2b5a7659fff cmdutil: reimplement finddate() without using walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 45408
diff changeset
  2327
    except ValueError:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  2328
        raise error.InputError(_(b"revision matching date not found"))
45468
d2b5a7659fff cmdutil: reimplement finddate() without using walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 45408
diff changeset
  2329
d2b5a7659fff cmdutil: reimplement finddate() without using walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 45408
diff changeset
  2330
    ui.status(
d2b5a7659fff cmdutil: reimplement finddate() without using walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 45408
diff changeset
  2331
        _(b"found revision %d from %s\n")
d2b5a7659fff cmdutil: reimplement finddate() without using walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 45408
diff changeset
  2332
        % (rev, dateutil.datestr(repo[rev].date()))
d2b5a7659fff cmdutil: reimplement finddate() without using walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 45408
diff changeset
  2333
    )
d2b5a7659fff cmdutil: reimplement finddate() without using walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 45408
diff changeset
  2334
    return b'%d' % rev
3814
120be84f33de Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents: 3738
diff changeset
  2335
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2336
41661
f8b18583049f add: pass around uipathfn and use instead of m.rel() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41660
diff changeset
  2337
def add(ui, repo, match, prefix, uipathfn, explicitonly, **opts):
12269
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
  2338
    bad = []
25436
9724cbe2d546 add: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25424
diff changeset
  2339
9724cbe2d546 add: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25424
diff changeset
  2340
    badfn = lambda x, y: bad.append(x) or match.bad(x, y)
12269
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
  2341
    names = []
12270
166b9866580a add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12269
diff changeset
  2342
    wctx = repo[None]
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14129
diff changeset
  2343
    cca = None
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14129
diff changeset
  2344
    abort, warn = scmutil.checkportabilityalert(ui)
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14129
diff changeset
  2345
    if abort or warn:
17201
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17182
diff changeset
  2346
        cca = scmutil.casecollisionauditor(ui, abort, repo.dirstate)
25436
9724cbe2d546 add: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25424
diff changeset
  2347
40088
1d09ba0d2ed3 narrow: move remaining narrow-limited dirstate walks to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 40030
diff changeset
  2348
    match = repo.narrowmatch(match, includeexact=True)
26206
ab1c6e4efda4 add: pass full=False to dirstate walk
Durham Goode <durham@fb.com>
parents: 26098
diff changeset
  2349
    badmatch = matchmod.badmatch(match, badfn)
ab1c6e4efda4 add: pass full=False to dirstate walk
Durham Goode <durham@fb.com>
parents: 26098
diff changeset
  2350
    dirstate = repo.dirstate
ab1c6e4efda4 add: pass full=False to dirstate walk
Durham Goode <durham@fb.com>
parents: 26098
diff changeset
  2351
    # We don't want to just call wctx.walk here, since it would return a lot of
ab1c6e4efda4 add: pass full=False to dirstate walk
Durham Goode <durham@fb.com>
parents: 26098
diff changeset
  2352
    # clean files, which we aren't interested in and takes time.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2353
    for f in sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2354
        dirstate.walk(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2355
            badmatch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2356
            subrepos=sorted(wctx.substate),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2357
            unknown=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2358
            ignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2359
            full=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2360
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2361
    ):
12269
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
  2362
        exact = match.exact(f)
23462
afa3fbbcabd3 add: use lexists so that broken symbolic links are added
John Coomes <john.coomes@oracle.com>
parents: 23453
diff changeset
  2363
        if exact or not explicitonly and f not in wctx and repo.wvfs.lexists(f):
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14129
diff changeset
  2364
            if cca:
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14129
diff changeset
  2365
                cca(f)
12269
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
  2366
            names.append(f)
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
  2367
            if ui.verbose or not exact:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2368
                ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2369
                    _(b'adding %s\n') % uipathfn(f), label=b'ui.addremove.added'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2370
                )
12270
166b9866580a add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12269
diff changeset
  2371
18364
6252b4f1c4b4 subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18340
diff changeset
  2372
    for subpath in sorted(wctx.substate):
15410
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15231
diff changeset
  2373
        sub = wctx.sub(subpath)
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15231
diff changeset
  2374
        try:
28017
d3f1b7ee5e70 match: rename "narrowmatcher" to "subdirmatcher" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27985
diff changeset
  2375
            submatch = matchmod.subdirmatcher(subpath, match)
41639
ed046348675c subrepo: adjust subrepo prefix before calling subrepo.add() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41638
diff changeset
  2376
            subprefix = repo.wvfs.reljoin(prefix, subpath)
41661
f8b18583049f add: pass around uipathfn and use instead of m.rel() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41660
diff changeset
  2377
            subuipathfn = scmutil.subdiruipathfn(subpath, uipathfn)
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43539
diff changeset
  2378
            if opts.get('subrepos'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2379
                bad.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2380
                    sub.add(ui, submatch, subprefix, subuipathfn, False, **opts)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2381
                )
15410
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15231
diff changeset
  2382
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2383
                bad.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2384
                    sub.add(ui, submatch, subprefix, subuipathfn, True, **opts)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2385
                )
15410
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15231
diff changeset
  2386
        except error.LookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2387
            ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2388
                _(b"skipping missing subrepository: %s\n") % uipathfn(subpath)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2389
            )
12270
166b9866580a add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12269
diff changeset
  2390
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43539
diff changeset
  2391
    if not opts.get('dry_run'):
12270
166b9866580a add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12269
diff changeset
  2392
        rejected = wctx.add(names, prefix)
12269
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
  2393
        bad.extend(f for f in rejected if f in match.files())
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
  2394
    return bad
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
  2395
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2396
32005
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
  2397
def addwebdirpath(repo, serverpath, webconf):
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
  2398
    webconf[serverpath] = repo.root
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2399
    repo.ui.debug(b'adding %s = %s\n' % (serverpath, repo.root))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2400
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2401
    for r in repo.revs(b'filelog("path:.hgsub")'):
32005
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
  2402
        ctx = repo[r]
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
  2403
        for subpath in ctx.substate:
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
  2404
            ctx.sub(subpath).addwebdirpath(serverpath, webconf)
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
  2405
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2406
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2407
def forget(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2408
    ui, repo, match, prefix, uipathfn, explicitonly, dryrun, interactive
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2409
):
37778
f10cb49951e1 forget: rename --confirm to --interactive
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37774
diff changeset
  2410
    if dryrun and interactive:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  2411
        raise error.InputError(
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  2412
            _(b"cannot specify both --dry-run and --interactive")
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  2413
        )
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2414
    bad = []
25437
9c1bcd95b3ff forget: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25436
diff changeset
  2415
    badfn = lambda x, y: bad.append(x) or match.bad(x, y)
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2416
    wctx = repo[None]
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2417
    forgot = []
25437
9c1bcd95b3ff forget: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25436
diff changeset
  2418
9c1bcd95b3ff forget: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25436
diff changeset
  2419
    s = repo.status(match=matchmod.badmatch(match, badfn), clean=True)
32223
e4a4ebfd9d8e forget: access status fields by name, not index
Martin von Zweigbergk <martinvonz@google.com>
parents: 32204
diff changeset
  2420
    forget = sorted(s.modified + s.added + s.deleted + s.clean)
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2421
    if explicitonly:
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2422
        forget = [f for f in forget if match.exact(f)]
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2423
18364
6252b4f1c4b4 subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18340
diff changeset
  2424
    for subpath in sorted(wctx.substate):
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2425
        sub = wctx.sub(subpath)
41638
f92844cb942c subrepo: adjust subrepo prefix before calling subrepo.forget() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41637
diff changeset
  2426
        submatch = matchmod.subdirmatcher(subpath, match)
f92844cb942c subrepo: adjust subrepo prefix before calling subrepo.forget() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41637
diff changeset
  2427
        subprefix = repo.wvfs.reljoin(prefix, subpath)
41664
16a49c778bde forget: pass around uipathfn and use instead of m.rel() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41663
diff changeset
  2428
        subuipathfn = scmutil.subdiruipathfn(subpath, uipathfn)
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2429
        try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2430
            subbad, subforgot = sub.forget(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2431
                submatch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2432
                subprefix,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2433
                subuipathfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2434
                dryrun=dryrun,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2435
                interactive=interactive,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2436
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2437
            bad.extend([subpath + b'/' + f for f in subbad])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2438
            forgot.extend([subpath + b'/' + f for f in subforgot])
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2439
        except error.LookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2440
            ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2441
                _(b"skipping missing subrepository: %s\n") % uipathfn(subpath)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2442
            )
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2443
16070
f11eee00c652 forget: show warning messages for forgetting in subrepo correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15912
diff changeset
  2444
    if not explicitonly:
f11eee00c652 forget: show warning messages for forgetting in subrepo correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15912
diff changeset
  2445
        for f in match.files():
23673
69cd91d04117 forget: use vfs instead of os.path + match.rel() for filesystem checks
Matt Harbison <matt_harbison@yahoo.com>
parents: 23579
diff changeset
  2446
            if f not in repo.dirstate and not repo.wvfs.isdir(f):
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2447
                if f not in forgot:
23673
69cd91d04117 forget: use vfs instead of os.path + match.rel() for filesystem checks
Matt Harbison <matt_harbison@yahoo.com>
parents: 23579
diff changeset
  2448
                    if repo.wvfs.exists(f):
24548
c780a63f61ca forget: cleanup the output for an inexact case match on icasefs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24169
diff changeset
  2449
                        # Don't complain if the exact case match wasn't given.
c780a63f61ca forget: cleanup the output for an inexact case match on icasefs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24169
diff changeset
  2450
                        # But don't do this until after checking 'forgot', so
c780a63f61ca forget: cleanup the output for an inexact case match on icasefs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24169
diff changeset
  2451
                        # that subrepo files aren't normalized, and this op is
c780a63f61ca forget: cleanup the output for an inexact case match on icasefs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24169
diff changeset
  2452
                        # purely from data cached by the status walk above.
c780a63f61ca forget: cleanup the output for an inexact case match on icasefs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24169
diff changeset
  2453
                        if repo.dirstate.normalize(f) in repo.dirstate:
c780a63f61ca forget: cleanup the output for an inexact case match on icasefs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24169
diff changeset
  2454
                            continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2455
                        ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2456
                            _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2457
                                b'not removing %s: '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2458
                                b'file is already untracked\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2459
                            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2460
                            % uipathfn(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2461
                        )
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2462
                    bad.append(f)
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2463
37778
f10cb49951e1 forget: rename --confirm to --interactive
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37774
diff changeset
  2464
    if interactive:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2465
        responses = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2466
            b'[Ynsa?]'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2467
            b'$$ &Yes, forget this file'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2468
            b'$$ &No, skip this file'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2469
            b'$$ &Skip remaining files'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2470
            b'$$ Include &all remaining files'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2471
            b'$$ &? (display help)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2472
        )
37756
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
  2473
        for filename in forget[:]:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2474
            r = ui.promptchoice(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2475
                _(b'forget %s %s') % (uipathfn(filename), responses)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2476
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2477
            if r == 4:  # ?
37756
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
  2478
                while r == 4:
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
  2479
                    for c, t in ui.extractchoices(responses)[1]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2480
                        ui.write(b'%s - %s\n' % (c, encoding.lower(t)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2481
                    r = ui.promptchoice(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2482
                        _(b'forget %s %s') % (uipathfn(filename), responses)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2483
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2484
            if r == 0:  # yes
37756
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
  2485
                continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2486
            elif r == 1:  # no
37756
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
  2487
                forget.remove(filename)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2488
            elif r == 2:  # Skip
37756
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
  2489
                fnindex = forget.index(filename)
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
  2490
                del forget[fnindex:]
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
  2491
                break
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2492
            elif r == 3:  # All
37756
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
  2493
                break
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
  2494
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2495
    for f in forget:
37778
f10cb49951e1 forget: rename --confirm to --interactive
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37774
diff changeset
  2496
        if ui.verbose or not match.exact(f) or interactive:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2497
            ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2498
                _(b'removing %s\n') % uipathfn(f), label=b'ui.addremove.removed'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2499
            )
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2500
36945
45bfcd16f27e forget: add --dry-run mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 36742
diff changeset
  2501
    if not dryrun:
45bfcd16f27e forget: add --dry-run mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 36742
diff changeset
  2502
        rejected = wctx.forget(forget, prefix)
45bfcd16f27e forget: add --dry-run mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 36742
diff changeset
  2503
        bad.extend(f for f in rejected if f in match.files())
45bfcd16f27e forget: add --dry-run mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 36742
diff changeset
  2504
        forgot.extend(f for f in forget if f not in rejected)
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2505
    return bad, forgot
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
  2506
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2507
41757
980e05204ed8 subrepo: use root-repo-relative path from `hg files` with ui.relative-paths=no
Martin von Zweigbergk <martinvonz@google.com>
parents: 41696
diff changeset
  2508
def files(ui, ctx, m, uipathfn, fm, fmt, subrepos):
24275
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
  2509
    ret = 1
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
  2510
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2511
    needsfctx = ui.verbose or {b'size', b'flags'} & fm.datahint()
44920
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2512
    if fm.isplain() and not needsfctx:
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2513
        # Fast path. The speed-up comes from skipping the formatter, and batching
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2514
        # calls to ui.write.
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2515
        buf = []
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2516
        for f in ctx.matches(m):
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2517
            buf.append(fmt % uipathfn(f))
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2518
            if len(buf) > 100:
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2519
                ui.write(b''.join(buf))
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2520
                del buf[:]
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2521
            ret = 0
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2522
        if buf:
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2523
            ui.write(b''.join(buf))
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2524
    else:
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2525
        for f in ctx.matches(m):
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2526
            fm.startitem()
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2527
            fm.context(ctx=ctx)
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2528
            if needsfctx:
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2529
                fc = ctx[f]
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2530
                fm.write(b'size flags', b'% 10d % 1s ', fc.size(), fc.flags())
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2531
            fm.data(path=f)
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2532
            fm.plain(fmt % uipathfn(f))
065421e12248 files: speed up `hg files` when no flags change display
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44915
diff changeset
  2533
            ret = 0
24275
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
  2534
25228
63a57a2727b6 files: recurse into subrepos automatically with an explicit path
Matt Harbison <matt_harbison@yahoo.com>
parents: 25169
diff changeset
  2535
    for subpath in sorted(ctx.substate):
29813
35560189677c subrepo: cleanup of subrepo filematcher logic
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29806
diff changeset
  2536
        submatch = matchmod.subdirmatcher(subpath, m)
41757
980e05204ed8 subrepo: use root-repo-relative path from `hg files` with ui.relative-paths=no
Martin von Zweigbergk <martinvonz@google.com>
parents: 41696
diff changeset
  2537
        subuipathfn = scmutil.subdiruipathfn(subpath, uipathfn)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2538
        if subrepos or m.exact(subpath) or any(submatch.files()):
24413
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
  2539
            sub = ctx.sub(subpath)
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
  2540
            try:
28387
97175d9bf7cf files: don't recurse into subrepos without a path or -S (issue5127)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28253
diff changeset
  2541
                recurse = m.exact(subpath) or subrepos
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2542
                if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2543
                    sub.printfiles(ui, submatch, subuipathfn, fm, fmt, recurse)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2544
                    == 0
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2545
                ):
24413
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
  2546
                    ret = 0
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
  2547
            except error.LookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2548
                ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2549
                    _(b"skipping missing subrepository: %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2550
                    % uipathfn(subpath)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2551
                )
24413
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
  2552
24275
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
  2553
    return ret
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
  2554
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2555
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2556
def remove(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2557
    ui, repo, m, prefix, uipathfn, after, force, subrepos, dryrun, warnings=None
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2558
):
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2559
    ret = 0
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2560
    s = repo.status(match=m, clean=True)
43688
e01e0641f18a cmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43571
diff changeset
  2561
    modified, added, deleted, clean = s.modified, s.added, s.deleted, s.clean
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2562
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2563
    wctx = repo[None]
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2564
28607
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
  2565
    if warnings is None:
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
  2566
        warnings = []
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
  2567
        warn = True
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
  2568
    else:
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
  2569
        warn = False
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
  2570
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
  2571
    subs = sorted(wctx.substate)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2572
    progress = ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2573
        _(b'searching'), total=len(subs), unit=_(b'subrepos')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2574
    )
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
  2575
    for subpath in subs:
29813
35560189677c subrepo: cleanup of subrepo filematcher logic
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29806
diff changeset
  2576
        submatch = matchmod.subdirmatcher(subpath, m)
41637
2c549abc6b85 subrepo: adjust subrepo prefix before calling subrepo.removefiles() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41636
diff changeset
  2577
        subprefix = repo.wvfs.reljoin(prefix, subpath)
41662
b2df5dc3ebfb remove: pass around uipathfn and use instead of m.rel() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41661
diff changeset
  2578
        subuipathfn = scmutil.subdiruipathfn(subpath, uipathfn)
29813
35560189677c subrepo: cleanup of subrepo filematcher logic
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29806
diff changeset
  2579
        if subrepos or m.exact(subpath) or any(submatch.files()):
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
  2580
            progress.increment()
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2581
            sub = wctx.sub(subpath)
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2582
            try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2583
                if sub.removefiles(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2584
                    submatch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2585
                    subprefix,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2586
                    subuipathfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2587
                    after,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2588
                    force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2589
                    subrepos,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2590
                    dryrun,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2591
                    warnings,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2592
                ):
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2593
                    ret = 1
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2594
            except error.LookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2595
                warnings.append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2596
                    _(b"skipping missing subrepository: %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2597
                    % uipathfn(subpath)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2598
                )
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38353
diff changeset
  2599
    progress.complete()
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2600
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2601
    # warn about failure to delete explicit files/dirs
43571
c21aca51b392 utils: move the `dirs` definition in pathutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43554
diff changeset
  2602
    deleteddirs = pathutil.dirs(deleted)
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
  2603
    files = m.files()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2604
    progress = ui.makeprogress(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2605
        _(b'deleting'), total=len(files), unit=_(b'files')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2606
    )
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
  2607
    for f in files:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2608
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2609
        def insubrepo():
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2610
            for subpath in wctx.substate:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2611
                if f.startswith(subpath + b'/'):
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2612
                    return True
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2613
            return False
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2614
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
  2615
        progress.increment()
24955
1df233bcb7f6 remove: use ctx.hasdir(f) instead of 'f in ctx.dirs()'
Martin von Zweigbergk <martinvonz@google.com>
parents: 24947
diff changeset
  2616
        isdir = f in deleteddirs or wctx.hasdir(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2617
        if f in repo.dirstate or isdir or f == b'.' or insubrepo() or f in subs:
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2618
            continue
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
  2619
23674
6e36b9fc7869 remove: use vfs instead of os.path + match.rel() for filesystem checks
Matt Harbison <matt_harbison@yahoo.com>
parents: 23673
diff changeset
  2620
        if repo.wvfs.exists(f):
6e36b9fc7869 remove: use vfs instead of os.path + match.rel() for filesystem checks
Matt Harbison <matt_harbison@yahoo.com>
parents: 23673
diff changeset
  2621
            if repo.wvfs.isdir(f):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2622
                warnings.append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2623
                    _(b'not removing %s: no tracked files\n') % uipathfn(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2624
                )
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2625
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2626
                warnings.append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2627
                    _(b'not removing %s: file is untracked\n') % uipathfn(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2628
                )
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2629
        # missing files will generate a warning elsewhere
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2630
        ret = 1
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38353
diff changeset
  2631
    progress.complete()
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2632
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2633
    if force:
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2634
        list = modified + deleted + clean + added
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2635
    elif after:
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2636
        list = deleted
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
  2637
        remaining = modified + added + clean
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2638
        progress = ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2639
            _(b'skipping'), total=len(remaining), unit=_(b'files')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2640
        )
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
  2641
        for f in remaining:
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
  2642
            progress.increment()
35144
7a58608281dd remove: print message for each file in verbose mode only while using `-A` (BC)
pavanpc@fb.com
parents: 35130
diff changeset
  2643
            if ui.verbose or (f in files):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2644
                warnings.append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2645
                    _(b'not removing %s: file still exists\n') % uipathfn(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2646
                )
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2647
            ret = 1
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38353
diff changeset
  2648
        progress.complete()
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2649
    else:
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2650
        list = deleted + clean
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2651
        progress = ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2652
            _(b'skipping'), total=(len(modified) + len(added)), unit=_(b'files')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2653
        )
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2654
        for f in modified:
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
  2655
            progress.increment()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2656
            warnings.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2657
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2658
                    b'not removing %s: file is modified (use -f'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2659
                    b' to force removal)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2660
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2661
                % uipathfn(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2662
            )
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2663
            ret = 1
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2664
        for f in added:
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
  2665
            progress.increment()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2666
            warnings.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2667
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2668
                    b"not removing %s: file has been marked for add"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2669
                    b" (use 'hg forget' to undo add)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2670
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2671
                % uipathfn(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2672
            )
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2673
            ret = 1
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38353
diff changeset
  2674
        progress.complete()
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
  2675
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
  2676
    list = sorted(list)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2677
    progress = ui.makeprogress(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2678
        _(b'deleting'), total=len(list), unit=_(b'files')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2679
    )
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
  2680
    for f in list:
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2681
        if ui.verbose or not m.exact(f):
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
  2682
            progress.increment()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2683
            ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2684
                _(b'removing %s\n') % uipathfn(f), label=b'ui.addremove.removed'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2685
            )
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38353
diff changeset
  2686
    progress.complete()
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2687
37153
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
  2688
    if not dryrun:
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
  2689
        with repo.wlock():
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
  2690
            if not after:
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
  2691
                for f in list:
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
  2692
                    if f in added:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2693
                        continue  # we never unlink added files on remove
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2694
                    rmdir = repo.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2695
                        b'experimental', b'removeemptydirs'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2696
                    )
38497
da2a7d8354b2 unlinkpath: make empty directory removal optional (issue5901) (issue5826)
Kyle Lippincott <spectral@google.com>
parents: 38465
diff changeset
  2697
                    repo.wvfs.unlinkpath(f, ignoremissing=True, rmdir=rmdir)
37153
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
  2698
            repo[None].forget(list)
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2699
28607
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
  2700
    if warn:
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
  2701
        for warning in warnings:
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
  2702
            ui.warn(warning)
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
  2703
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2704
    return ret
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
  2705
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2706
42494
561cd02c58ff cat: don't prefetch files unless the output requires it
Matt Harbison <matt_harbison@yahoo.com>
parents: 42489
diff changeset
  2707
def _catfmtneedsdata(fm):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2708
    return not fm.datahint() or b'data' in fm.datahint()
42494
561cd02c58ff cat: don't prefetch files unless the output requires it
Matt Harbison <matt_harbison@yahoo.com>
parents: 42489
diff changeset
  2709
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2710
35662
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
  2711
def _updatecatformatter(fm, ctx, matcher, path, decode):
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
  2712
    """Hook for adding data to the formatter used by ``hg cat``.
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
  2713
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
  2714
    Extensions (e.g., lfs) can wrap this to inject keywords/data, but must call
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
  2715
    this method first."""
42494
561cd02c58ff cat: don't prefetch files unless the output requires it
Matt Harbison <matt_harbison@yahoo.com>
parents: 42489
diff changeset
  2716
561cd02c58ff cat: don't prefetch files unless the output requires it
Matt Harbison <matt_harbison@yahoo.com>
parents: 42489
diff changeset
  2717
    # data() can be expensive to fetch (e.g. lfs), so don't fetch it if it
561cd02c58ff cat: don't prefetch files unless the output requires it
Matt Harbison <matt_harbison@yahoo.com>
parents: 42489
diff changeset
  2718
    # wasn't requested.
561cd02c58ff cat: don't prefetch files unless the output requires it
Matt Harbison <matt_harbison@yahoo.com>
parents: 42489
diff changeset
  2719
    data = b''
561cd02c58ff cat: don't prefetch files unless the output requires it
Matt Harbison <matt_harbison@yahoo.com>
parents: 42489
diff changeset
  2720
    if _catfmtneedsdata(fm):
561cd02c58ff cat: don't prefetch files unless the output requires it
Matt Harbison <matt_harbison@yahoo.com>
parents: 42489
diff changeset
  2721
        data = ctx[path].data()
561cd02c58ff cat: don't prefetch files unless the output requires it
Matt Harbison <matt_harbison@yahoo.com>
parents: 42489
diff changeset
  2722
        if decode:
561cd02c58ff cat: don't prefetch files unless the output requires it
Matt Harbison <matt_harbison@yahoo.com>
parents: 42489
diff changeset
  2723
            data = ctx.repo().wwritedata(path, data)
35662
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
  2724
    fm.startitem()
38540
b1bbff1dd99a cat: add support for log-like template keywords and functions
Yuya Nishihara <yuya@tcha.org>
parents: 38497
diff changeset
  2725
    fm.context(ctx=ctx)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2726
    fm.write(b'data', b'%s', data)
39396
34ba47117164 formatter: rename {abspath}/{file} to {path}, and drop relative {path} (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 39377
diff changeset
  2727
    fm.data(path=path)
35662
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
  2728
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2729
32610
746e12a767b3 cat: add formatter support
Yuya Nishihara <yuya@tcha.org>
parents: 32609
diff changeset
  2730
def cat(ui, repo, ctx, matcher, basefm, fntemplate, prefix, **opts):
21040
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2731
    err = 1
35359
82ee401135dd py3: handle keyword arguments correctly in cmdutil.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35286
diff changeset
  2732
    opts = pycompat.byteskwargs(opts)
21040
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2733
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2734
    def write(path):
32610
746e12a767b3 cat: add formatter support
Yuya Nishihara <yuya@tcha.org>
parents: 32609
diff changeset
  2735
        filename = None
32608
7f4435078a8f cat: stop using makefileobj()
Yuya Nishihara <yuya@tcha.org>
parents: 32573
diff changeset
  2736
        if fntemplate:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2737
            filename = makefilename(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2738
                ctx, fntemplate, pathname=os.path.join(prefix, path)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2739
            )
35048
407ec7f3ff02 cmdutil: create dirs for templated cat file output
Ryan McElroy <rmcelroy@fb.com>
parents: 35037
diff changeset
  2740
            # attempt to create the directory if it does not already exist
407ec7f3ff02 cmdutil: create dirs for templated cat file output
Ryan McElroy <rmcelroy@fb.com>
parents: 35037
diff changeset
  2741
            try:
407ec7f3ff02 cmdutil: create dirs for templated cat file output
Ryan McElroy <rmcelroy@fb.com>
parents: 35037
diff changeset
  2742
                os.makedirs(os.path.dirname(filename))
407ec7f3ff02 cmdutil: create dirs for templated cat file output
Ryan McElroy <rmcelroy@fb.com>
parents: 35037
diff changeset
  2743
            except OSError:
407ec7f3ff02 cmdutil: create dirs for templated cat file output
Ryan McElroy <rmcelroy@fb.com>
parents: 35037
diff changeset
  2744
                pass
37597
d110167610db formatter: carry opts to file-based formatters by basefm
Yuya Nishihara <yuya@tcha.org>
parents: 37470
diff changeset
  2745
        with formatter.maybereopen(basefm, filename) as fm:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2746
            _updatecatformatter(fm, ctx, matcher, path, opts.get(b'decode'))
21040
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2747
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2748
    # Automation often uses hg cat on single files, so special case it
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2749
    # for performance to avoid the cost of parsing the manifest.
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2750
    if len(matcher.files()) == 1 and not matcher.anypats():
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2751
        file = matcher.files()[0]
30350
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  2752
        mfl = repo.manifestlog
24718
a4191e0c728f cat: use ctx.manifestnode() in place of ctx._changeset[0]
Yuya Nishihara <yuya@tcha.org>
parents: 24711
diff changeset
  2753
        mfnode = ctx.manifestnode()
30350
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  2754
        try:
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  2755
            if mfnode and mfl[mfnode].find(file)[0]:
42494
561cd02c58ff cat: don't prefetch files unless the output requires it
Matt Harbison <matt_harbison@yahoo.com>
parents: 42489
diff changeset
  2756
                if _catfmtneedsdata(basefm):
45073
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 45040
diff changeset
  2757
                    scmutil.prefetchfiles(repo, [(ctx.rev(), matcher)])
30350
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  2758
                write(file)
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  2759
                return 0
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  2760
        except KeyError:
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  2761
            pass
21040
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2762
42494
561cd02c58ff cat: don't prefetch files unless the output requires it
Matt Harbison <matt_harbison@yahoo.com>
parents: 42489
diff changeset
  2763
    if _catfmtneedsdata(basefm):
45073
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 45040
diff changeset
  2764
        scmutil.prefetchfiles(repo, [(ctx.rev(), matcher)])
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37756
diff changeset
  2765
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37756
diff changeset
  2766
    for abs in ctx.walk(matcher):
21040
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2767
        write(abs)
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2768
        err = 0
21041
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
  2769
41674
28ce9184d495 cat: respect ui.relative-paths for "skipping missing subrepository"
Martin von Zweigbergk <martinvonz@google.com>
parents: 41672
diff changeset
  2770
    uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
21041
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
  2771
    for subpath in sorted(ctx.substate):
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
  2772
        sub = ctx.sub(subpath)
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
  2773
        try:
28017
d3f1b7ee5e70 match: rename "narrowmatcher" to "subdirmatcher" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27985
diff changeset
  2774
            submatch = matchmod.subdirmatcher(subpath, matcher)
41660
799e156785f7 subrepo: (mostly) use relative path in "skipping missing subrepository"
Martin von Zweigbergk <martinvonz@google.com>
parents: 41639
diff changeset
  2775
            subprefix = os.path.join(prefix, subpath)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2776
            if not sub.cat(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2777
                submatch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2778
                basefm,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2779
                fntemplate,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2780
                subprefix,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2781
                **pycompat.strkwargs(opts)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2782
            ):
21041
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
  2783
                err = 0
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
  2784
        except error.RepoLookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2785
            ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2786
                _(b"skipping missing subrepository: %s\n") % uipathfn(subpath)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2787
            )
21041
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
  2788
21040
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2789
    return err
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
  2790
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2791
5034
c0417a319e39 commands: move commit to cmdutil as wrapper for commit-like functions
Bryan O'Sullivan <bos@serpentine.com>
parents: 4965
diff changeset
  2792
def commit(ui, repo, commitfunc, pats, opts):
c0417a319e39 commands: move commit to cmdutil as wrapper for commit-like functions
Bryan O'Sullivan <bos@serpentine.com>
parents: 4965
diff changeset
  2793
    '''commit the specified files or all outstanding changes'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2794
    date = opts.get(b'date')
6139
989467e8e3a9 Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6112
diff changeset
  2795
    if date:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2796
        opts[b'date'] = dateutil.parsedate(date)
14635
217b7d83afc3 cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14518
diff changeset
  2797
    message = logmessage(ui, opts)
23533
891aaa7c0c70 scmutil: pass a matcher to scmutil.addremove() instead of a list of patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 23509
diff changeset
  2798
    matcher = scmutil.match(repo[None], pats, opts)
5034
c0417a319e39 commands: move commit to cmdutil as wrapper for commit-like functions
Bryan O'Sullivan <bos@serpentine.com>
parents: 4965
diff changeset
  2799
33616
5ac845ca059a commit: don't let failed commit with --addremove update dirstate (issue5645)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33548
diff changeset
  2800
    dsguard = None
5829
784073457a0f cmdutil.commit: extract 'addremove' from opts carefully
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5797
diff changeset
  2801
    # extract addremove carefully -- this function can be called from a command
784073457a0f cmdutil.commit: extract 'addremove' from opts carefully
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5797
diff changeset
  2802
    # that doesn't support addremove
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2803
    if opts.get(b'addremove'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2804
        dsguard = dirstateguard.dirstateguard(repo, b'commit')
33845
158dddc635ff commit: use context manager with dirstateguard
Martin von Zweigbergk <martinvonz@google.com>
parents: 33844
diff changeset
  2805
    with dsguard or util.nullcontextmanager():
33844
5d286eb7009f commit: move dirstateguard creation out of try-block
Martin von Zweigbergk <martinvonz@google.com>
parents: 33804
diff changeset
  2806
        if dsguard:
41663
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41662
diff changeset
  2807
            relative = scmutil.anypats(pats, opts)
41696
b81ecf3571d5 addremove: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41694
diff changeset
  2808
            uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=relative)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2809
            if scmutil.addremove(repo, matcher, b"", uipathfn, opts) != 0:
33616
5ac845ca059a commit: don't let failed commit with --addremove update dirstate (issue5645)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33548
diff changeset
  2810
                raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2811
                    _(b"failed to mark all new/missing files as added/removed")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2812
                )
33616
5ac845ca059a commit: don't let failed commit with --addremove update dirstate (issue5645)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33548
diff changeset
  2813
33845
158dddc635ff commit: use context manager with dirstateguard
Martin von Zweigbergk <martinvonz@google.com>
parents: 33844
diff changeset
  2814
        return commitfunc(ui, repo, message, matcher, opts)
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
  2815
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2816
29830
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
  2817
def samefile(f, ctx1, ctx2):
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
  2818
    if f in ctx1.manifest():
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
  2819
        a = ctx1.filectx(f)
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
  2820
        if f in ctx2.manifest():
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
  2821
            b = ctx2.filectx(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2822
            return not a.cmp(b) and a.flags() == b.flags()
29830
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
  2823
        else:
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
  2824
            return False
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
  2825
    else:
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
  2826
        return f not in ctx2.manifest()
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
  2827
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2828
34103
a39dce4a76b8 cmdutil: remove redundant commitfunc parameter in amend (API)
Saurabh Singh <singhsrb@fb.com>
parents: 34102
diff changeset
  2829
def amend(ui, repo, old, extra, pats, opts):
25930
221491bbaf7e cmdutil: break import cycle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25795
diff changeset
  2830
    # avoid cycle context -> subrepo -> cmdutil
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
  2831
    from . import context
25930
221491bbaf7e cmdutil: break import cycle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25795
diff changeset
  2832
23101
b564330d4b1f amend: abort early if no username is configured with evolve enabled (issue4211)
Matt Harbison <matt_harbison@yahoo.com>
parents: 22951
diff changeset
  2833
    # amend will reuse the existing user if not specified, but the obsolete
b564330d4b1f amend: abort early if no username is configured with evolve enabled (issue4211)
Matt Harbison <matt_harbison@yahoo.com>
parents: 22951
diff changeset
  2834
    # marker creation requires that the current user's name is specified.
24379
8c445d8a915b obsolete: remove last instance of _enabled
Durham Goode <durham@fb.com>
parents: 24364
diff changeset
  2835
    if obsolete.isenabled(repo, obsolete.createmarkersopt):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2836
        ui.username()  # raise exception if username not set
23101
b564330d4b1f amend: abort early if no username is configured with evolve enabled (issue4211)
Matt Harbison <matt_harbison@yahoo.com>
parents: 22951
diff changeset
  2837
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2838
    ui.note(_(b'amending changeset %s\n') % old)
16458
55982f62651f commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents: 16430
diff changeset
  2839
    base = old.p1()
55982f62651f commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents: 16430
diff changeset
  2840
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2841
    with repo.wlock(), repo.lock(), repo.transaction(b'amend'):
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2842
        # Participating changesets:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2843
        #
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2844
        # wctx     o - workingctx that contains changes from working copy
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2845
        #          |   to go into amending commit
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2846
        #          |
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2847
        # old      o - changeset to amend
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2848
        #          |
34073
7e9ccb1670e3 amend: rectify comment
Saurabh Singh <singhsrb@fb.com>
parents: 34072
diff changeset
  2849
        # base     o - first parent of the changeset to amend
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2850
        wctx = repo[None]
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2851
35207
5cc14407a739 amend: make a copy of "extra" to avoid mutating an input
Martin von Zweigbergk <martinvonz@google.com>
parents: 35184
diff changeset
  2852
        # Copy to avoid mutating input
5cc14407a739 amend: make a copy of "extra" to avoid mutating an input
Martin von Zweigbergk <martinvonz@google.com>
parents: 35184
diff changeset
  2853
        extra = extra.copy()
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2854
        # Update extra dict from amended commit (e.g. to preserve graft
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2855
        # source)
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2856
        extra.update(old.extra())
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2857
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2858
        # Also update it from the from the wctx
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2859
        extra.update(wctx.extra())
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2860
42936
e4803231f538 amend: add option to update to the current user
Matt Harbison <matt_harbison@yahoo.com>
parents: 42925
diff changeset
  2861
        # date-only change should be ignored?
47438
7f7457f84311 cmdutil: make resolvecommitoptions() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
  2862
        datemaydiffer = resolve_commit_options(ui, opts)
7f7457f84311 cmdutil: make resolvecommitoptions() work on str-keyed opts
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
  2863
        opts = pycompat.byteskwargs(opts)
42936
e4803231f538 amend: add option to update to the current user
Matt Harbison <matt_harbison@yahoo.com>
parents: 42925
diff changeset
  2864
e4803231f538 amend: add option to update to the current user
Matt Harbison <matt_harbison@yahoo.com>
parents: 42925
diff changeset
  2865
        date = old.date()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2866
        if opts.get(b'date'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2867
            date = dateutil.parsedate(opts.get(b'date'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2868
        user = opts.get(b'user') or old.user()
34136
ae95853c250a cmdutil: fix amend when passing a date
Boris Feld <boris.feld@octobus.net>
parents: 34103
diff changeset
  2869
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2870
        if len(old.parents()) > 1:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2871
            # ctx.files() isn't reliable for merges, so fall back to the
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2872
            # slower repo.status() method
43688
e01e0641f18a cmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43571
diff changeset
  2873
            st = base.status(old)
e01e0641f18a cmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43571
diff changeset
  2874
            files = set(st.modified) | set(st.added) | set(st.removed)
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2875
        else:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2876
            files = set(old.files())
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2877
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2878
        # add/remove the files to the working copy if the "addremove" option
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2879
        # was specified.
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2880
        matcher = scmutil.match(wctx, pats, opts)
41663
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41662
diff changeset
  2881
        relative = scmutil.anypats(pats, opts)
41696
b81ecf3571d5 addremove: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41694
diff changeset
  2882
        uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=relative)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2883
        if opts.get(b'addremove') and scmutil.addremove(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2884
            repo, matcher, b"", uipathfn, opts
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2885
        ):
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2886
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2887
                _(b"failed to mark all new/missing files as added/removed")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2888
            )
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2889
34978
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
  2890
        # Check subrepos. This depends on in-place wctx._status update in
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
  2891
        # subrepo.precommit(). To minimize the risk of this hack, we do
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
  2892
        # nothing if .hgsub does not exist.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2893
        if b'.hgsub' in wctx or b'.hgsub' in old:
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35993
diff changeset
  2894
            subs, commitsubs, newsubstate = subrepoutil.precommit(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2895
                ui, wctx, wctx._status, matcher
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2896
            )
34978
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
  2897
            # amend should abort if commitsubrepos is enabled
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
  2898
            assert not commitsubs
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
  2899
            if subs:
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35993
diff changeset
  2900
                subrepoutil.writestate(repo, newsubstate)
34978
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
  2901
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44772
diff changeset
  2902
        ms = mergestatemod.mergestate.read(repo)
35853
eeb87b24aea7 amend: abort if unresolved merge conflicts found (issue5805)
Yuya Nishihara <yuya@tcha.org>
parents: 35746
diff changeset
  2903
        mergeutil.checkunresolved(ms)
eeb87b24aea7 amend: abort if unresolved merge conflicts found (issue5805)
Yuya Nishihara <yuya@tcha.org>
parents: 35746
diff changeset
  2904
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44460
diff changeset
  2905
        filestoamend = {f for f in wctx.files() if matcher(f)}
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2906
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2907
        changes = len(filestoamend) > 0
48815
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2908
        changeset_copies = (
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2909
            repo.ui.config(b'experimental', b'copies.read-from')
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2910
            != b'filelog-only'
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2911
        )
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2912
        # If there are changes to amend or if copy information needs to be read
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2913
        # from the changeset extras, we cannot take the fast path of using
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2914
        # filectxs from the old commit.
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2915
        if changes or changeset_copies:
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2916
            # Recompute copies (avoid recording a -> b -> a)
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2917
            copied = copies.pathcopies(base, wctx, matcher)
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2918
            if old.p2:
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2919
                copied.update(copies.pathcopies(old.p2(), wctx, matcher))
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2920
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2921
            # Prune files which were reverted by the updates: if old
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2922
            # introduced file X and the file was renamed in the working
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2923
            # copy, then those two files are the same and
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2924
            # we can discard X from our list of files. Likewise if X
34975
5f40efa472db amend: do not drop missing files (issue5732)
Yuya Nishihara <yuya@tcha.org>
parents: 34974
diff changeset
  2925
            # was removed, it's no longer relevant. If X is missing (aka
5f40efa472db amend: do not drop missing files (issue5732)
Yuya Nishihara <yuya@tcha.org>
parents: 34974
diff changeset
  2926
            # deleted), old X must be preserved.
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2927
            files.update(filestoamend)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2928
            files = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2929
                f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2930
                for f in files
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2931
                if (f not in filestoamend or not samefile(f, wctx, base))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2932
            ]
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2933
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2934
            def filectxfn(repo, ctx_, path):
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2935
                try:
48815
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2936
                    # Return None for removed files.
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2937
                    if path in wctx.removed():
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2938
                        return None
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2939
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2940
                    # If the file being considered is not amongst the files
48815
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2941
                    # to be amended, we should use the file context from the
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2942
                    # old changeset. This avoids issues when only some files in
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2943
                    # the working copy are being amended but there are also
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2944
                    # changes to other files from the old changeset.
48815
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2945
                    if path in filestoamend:
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2946
                        fctx = wctx[path]
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2947
                    else:
877d7e1a4223 amend: fix amend with copies in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 48432
diff changeset
  2948
                        fctx = old.filectx(path)
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2949
                    flags = fctx.flags()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2950
                    mctx = context.memfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2951
                        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2952
                        ctx_,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2953
                        fctx.path(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2954
                        fctx.data(),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2955
                        islink=b'l' in flags,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2956
                        isexec=b'x' in flags,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2957
                        copysource=copied.get(path),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2958
                    )
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2959
                    return mctx
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2960
                except KeyError:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2961
                    return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2962
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2963
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2964
            ui.note(_(b'copying changeset %s to %s\n') % (old, base))
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2965
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2966
            # Use version of files as in the old cset
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2967
            def filectxfn(repo, ctx_, path):
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2968
                try:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2969
                    return old.filectx(path)
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2970
                except KeyError:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2971
                    return None
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2972
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2973
        # See if we got a message from -m or -l, if not, open the editor with
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2974
        # the message of the changeset to amend.
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2975
        message = logmessage(ui, opts)
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2976
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2977
        editform = mergeeditform(old, b'commit.amend')
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  2978
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2979
        if not message:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2980
            message = old.description()
42418
64ed405dd342 commit: respect --no-edit in combination with --amend
Kyle Lippincott <spectral@google.com>
parents: 42297
diff changeset
  2981
            # Default if message isn't provided and --edit is not passed is to
64ed405dd342 commit: respect --no-edit in combination with --amend
Kyle Lippincott <spectral@google.com>
parents: 42297
diff changeset
  2982
            # invoke editor, but allow --no-edit. If somehow we don't have any
64ed405dd342 commit: respect --no-edit in combination with --amend
Kyle Lippincott <spectral@google.com>
parents: 42297
diff changeset
  2983
            # description, let's always start the editor.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2984
            doedit = not message or opts.get(b'edit') in [True, None]
42418
64ed405dd342 commit: respect --no-edit in combination with --amend
Kyle Lippincott <spectral@google.com>
parents: 42297
diff changeset
  2985
        else:
64ed405dd342 commit: respect --no-edit in combination with --amend
Kyle Lippincott <spectral@google.com>
parents: 42297
diff changeset
  2986
            # Default if message is provided is to not invoke editor, but allow
64ed405dd342 commit: respect --no-edit in combination with --amend
Kyle Lippincott <spectral@google.com>
parents: 42297
diff changeset
  2987
            # --edit.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2988
            doedit = opts.get(b'edit') is True
42418
64ed405dd342 commit: respect --no-edit in combination with --amend
Kyle Lippincott <spectral@google.com>
parents: 42297
diff changeset
  2989
        editor = getcommiteditor(edit=doedit, editform=editform)
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2990
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2991
        pureextra = extra.copy()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2992
        extra[b'amend_source'] = old.hex()
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  2993
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2994
        new = context.memctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2995
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2996
            parents=[base.node(), old.p2().node()],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2997
            text=message,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2998
            files=files,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  2999
            filectxfn=filectxfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3000
            user=user,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3001
            date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3002
            extra=extra,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3003
            editor=editor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3004
        )
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  3005
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  3006
        newdesc = changelog.stripdesc(new.description())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3007
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3008
            (not changes)
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  3009
            and newdesc == old.description()
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  3010
            and user == old.user()
41127
cffa8e0ba77a amend: add boolean to ignore date-only change
Yuya Nishihara <yuya@tcha.org>
parents: 41126
diff changeset
  3011
            and (date == old.date() or datemaydiffer)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3012
            and pureextra == old.extra()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3013
        ):
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  3014
            # nothing changed. continuing here would create a new node
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  3015
            # anyway because of the amend_source noise.
17472
965fbe04fd96 amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17471
diff changeset
  3016
            #
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  3017
            # This not what we expect from amend.
41127
cffa8e0ba77a amend: add boolean to ignore date-only change
Yuya Nishihara <yuya@tcha.org>
parents: 41126
diff changeset
  3018
            return old.node()
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
  3019
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
  3020
        commitphase = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3021
        if opts.get(b'secret'):
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
  3022
            commitphase = phases.secret
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
  3023
        newid = repo.commitctx(new)
45408
6ba7190ff863 commit: clear mergestate also with --amend (issue6304)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45395
diff changeset
  3024
        ms.reset()
34072
ae92e5c0441c amend: removing redundant if condition
Saurabh Singh <singhsrb@fb.com>
parents: 34046
diff changeset
  3025
47608
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3026
        with repo.dirstate.parentchange():
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3027
            # Reroute the working copy parent to the new changeset
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3028
            repo.setparents(newid, repo.nullid)
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3029
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3030
            # Fixing the dirstate because localrepo.commitctx does not update
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3031
            # it. This is rather convenient because we did not need to update
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3032
            # the dirstate for all the files in the new commit which commitctx
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3033
            # could have done if it updated the dirstate. Now, we can
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3034
            # selectively update the dirstate only for the amended files.
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3035
            dirstate = repo.dirstate
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3036
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3037
            # Update the state of the files which were added and modified in the
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3038
            # amend to "normal" in the dirstate. We need to use "normallookup" since
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3039
            # the files may have changed since the command started; using "normal"
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3040
            # would mark them as clean but with uncommitted contents.
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3041
            normalfiles = set(wctx.modified() + wctx.added()) & filestoamend
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3042
            for f in normalfiles:
47728
4d1ae9cba551 amend: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47707
diff changeset
  3043
                dirstate.update_file(
4d1ae9cba551 amend: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47707
diff changeset
  3044
                    f, p1_tracked=True, wc_tracked=True, possibly_dirty=True
4d1ae9cba551 amend: use `update_file` instead of `normallookup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47707
diff changeset
  3045
                )
47608
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3046
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3047
            # Update the state of files which were removed in the amend
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3048
            # to "removed" in the dirstate.
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3049
            removedfiles = set(wctx.removed()) & filestoamend
3c0efa0eeea6 amend: adjust the dirstate within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47603
diff changeset
  3050
            for f in removedfiles:
47746
56297381af90 amend: use `update_file` instead of `drop`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47732
diff changeset
  3051
                dirstate.update_file(f, p1_tracked=False, wc_tracked=False)
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
  3052
46778
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3053
        mapping = {old.node(): (newid,)}
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3054
        obsmetadata = None
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3055
        if opts.get(b'note'):
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3056
            obsmetadata = {b'note': encoding.fromlocal(opts[b'note'])}
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3057
        backup = ui.configbool(b'rewrite', b'backup-bundle')
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3058
        scmutil.cleanupnodes(
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3059
            repo,
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3060
            mapping,
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3061
            b'amend',
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3062
            metadata=obsmetadata,
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3063
            fixphase=True,
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3064
            targetphase=commitphase,
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3065
            backup=backup,
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3066
        )
62c2857a174b amend: mark commit obsolete after moving working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 46364
diff changeset
  3067
16458
55982f62651f commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents: 16430
diff changeset
  3068
    return newid
55982f62651f commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents: 16430
diff changeset
  3069
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3070
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3071
def commiteditor(repo, ctx, subs, editform=b''):
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
  3072
    if ctx.description():
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
  3073
        return ctx.description()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3074
    return commitforceeditor(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3075
        repo, ctx, subs, editform=editform, unchangedmessagedetection=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3076
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3077
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3078
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3079
def commitforceeditor(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3080
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3081
    ctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3082
    subs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3083
    finishdesc=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3084
    extramsg=None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3085
    editform=b'',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3086
    unchangedmessagedetection=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3087
):
21923
e582e20cd3e6 commiteditor: refactor default extramsg
Matt Mackall <mpm@selenic.com>
parents: 21878
diff changeset
  3088
    if not extramsg:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3089
        extramsg = _(b"Leave message empty to abort commit.")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3090
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3091
    forms = [e for e in editform.split(b'.') if e]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3092
    forms.insert(0, b'changeset')
26742
bec1a579ebc4 commit: abort when a committemplate is not changed
Tony Tung <tonytung@fb.com>
parents: 26639
diff changeset
  3093
    templatetext = None
22012
9d92b9d1e282 cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22011
diff changeset
  3094
    while forms:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3095
        ref = b'.'.join(forms)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3096
        if repo.ui.config(b'committemplate', ref):
26742
bec1a579ebc4 commit: abort when a committemplate is not changed
Tony Tung <tonytung@fb.com>
parents: 26639
diff changeset
  3097
            templatetext = committext = buildcommittemplate(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3098
                repo, ctx, subs, extramsg, ref
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3099
            )
22012
9d92b9d1e282 cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22011
diff changeset
  3100
            break
9d92b9d1e282 cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22011
diff changeset
  3101
        forms.pop()
21924
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
  3102
    else:
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
  3103
        committext = buildcommittext(repo, ctx, subs, extramsg)
21869
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
  3104
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
  3105
    # run editor in the repository root
39823
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39753
diff changeset
  3106
    olddir = encoding.getcwd()
21869
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
  3107
    os.chdir(repo.root)
26750
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26746
diff changeset
  3108
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26746
diff changeset
  3109
    # make in-memory changes visible to external process
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26746
diff changeset
  3110
    tr = repo.currenttransaction()
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26746
diff changeset
  3111
    repo.dirstate.write(tr)
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26746
diff changeset
  3112
    pending = tr and tr.writepending() and repo.root
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26746
diff changeset
  3113
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3114
    editortext = repo.ui.edit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3115
        committext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3116
        ctx.user(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3117
        ctx.extra(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3118
        editform=editform,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3119
        pending=pending,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3120
        repopath=repo.path,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3121
        action=b'commit',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3122
    )
30724
ee47e951c6f9 commit: fix unmodified message detection for the "--- >8 ----" magic
Yuya Nishihara <yuya@tcha.org>
parents: 30720
diff changeset
  3123
    text = editortext
30703
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
  3124
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
  3125
    # strip away anything below this special string (used for editors that want
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
  3126
    # to display the diff)
30724
ee47e951c6f9 commit: fix unmodified message detection for the "--- >8 ----" magic
Yuya Nishihara <yuya@tcha.org>
parents: 30720
diff changeset
  3127
    stripbelow = re.search(_linebelow, text, flags=re.MULTILINE)
30703
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
  3128
    if stripbelow:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3129
        text = text[: stripbelow.start()]
30724
ee47e951c6f9 commit: fix unmodified message detection for the "--- >8 ----" magic
Yuya Nishihara <yuya@tcha.org>
parents: 30720
diff changeset
  3130
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3131
    text = re.sub(b"(?m)^HG:.*(\n|$)", b"", text)
21869
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
  3132
    os.chdir(olddir)
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
  3133
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
  3134
    if finishdesc:
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
  3135
        text = finishdesc(text)
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
  3136
    if not text.strip():
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  3137
        raise error.InputError(_(b"empty commit message"))
26742
bec1a579ebc4 commit: abort when a committemplate is not changed
Tony Tung <tonytung@fb.com>
parents: 26639
diff changeset
  3138
    if unchangedmessagedetection and editortext == templatetext:
45846
8d72e29ad1e0 errors: introduce InputError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45831
diff changeset
  3139
        raise error.InputError(_(b"commit message unchanged"))
21869
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
  3140
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
  3141
    return text
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
  3142
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3143
32896
a3a36bcf122e commit: select template by spec.ref name
Yuya Nishihara <yuya@tcha.org>
parents: 32895
diff changeset
  3144
def buildcommittemplate(repo, ctx, subs, extramsg, ref):
21924
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
  3145
    ui = repo.ui
45288
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45073
diff changeset
  3146
    spec = formatter.reference_templatespec(ref)
35993
386c1e45e671 logcmdutil: drop default arguments from changesetdisplayer/templater() calls
Yuya Nishihara <yuya@tcha.org>
parents: 35966
diff changeset
  3147
    t = logcmdutil.changesettemplater(ui, repo, spec)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3148
    t.t.cache.update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3149
        (k, templater.unquotestring(v))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3150
        for k, v in repo.ui.configitems(b'committemplate')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3151
    )
22013
de5cee8ba088 cmdutil: use '[committemplate]' section like as map file for style definition
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22012
diff changeset
  3152
21924
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
  3153
    if not extramsg:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3154
        extramsg = b''  # ensure that extramsg is string
21924
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
  3155
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
  3156
    ui.pushbuffer()
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
  3157
    t.show(ctx, extramsg=extramsg)
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
  3158
    return ui.popbuffer()
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
  3159
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3160
26426
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
  3161
def hgprefix(msg):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3162
    return b"\n".join([b"HG: %s" % a for a in msg.split(b"\n") if a])
26426
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
  3163
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3164
21869
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
  3165
def buildcommittext(repo, ctx, subs, extramsg):
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
  3166
    edittext = []
8707
0550dfe4fca1 commit: editor reads file lists from provided context
Matt Mackall <mpm@selenic.com>
parents: 8680
diff changeset
  3167
    modified, added, removed = ctx.modified(), ctx.added(), ctx.removed()
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
  3168
    if ctx.description():
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
  3169
        edittext.append(ctx.description())
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3170
    edittext.append(b"")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3171
    edittext.append(b"")  # Empty line between message and comments.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3172
    edittext.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3173
        hgprefix(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3174
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3175
                b"Enter commit message."
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3176
                b"  Lines beginning with 'HG:' are removed."
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3177
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3178
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3179
    )
26426
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
  3180
    edittext.append(hgprefix(extramsg))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3181
    edittext.append(b"HG: --")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3182
    edittext.append(hgprefix(_(b"user: %s") % ctx.user()))
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
  3183
    if ctx.p2():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3184
        edittext.append(hgprefix(_(b"branch merge")))
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
  3185
    if ctx.branch():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3186
        edittext.append(hgprefix(_(b"branch '%s'") % ctx.branch()))
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24955
diff changeset
  3187
    if bookmarks.isactivewdirparent(repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3188
        edittext.append(hgprefix(_(b"bookmark '%s'") % repo._activebookmark))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3189
    edittext.extend([hgprefix(_(b"subrepo %s") % s) for s in subs])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3190
    edittext.extend([hgprefix(_(b"added %s") % f) for f in added])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3191
    edittext.extend([hgprefix(_(b"changed %s") % f) for f in modified])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3192
    edittext.extend([hgprefix(_(b"removed %s") % f) for f in removed])
8707
0550dfe4fca1 commit: editor reads file lists from provided context
Matt Mackall <mpm@selenic.com>
parents: 8680
diff changeset
  3193
    if not added and not modified and not removed:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3194
        edittext.append(hgprefix(_(b"no files changed")))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3195
    edittext.append(b"")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3196
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3197
    return b"\n".join(edittext)
14297
2daa5179e73f commands: use a decorator to build table incrementally
Adrian Buehlmann <adrian@cadifra.com>
parents: 14291
diff changeset
  3198
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3199
45831
976b26bdd0d8 commit: warn the user when a commit already exists
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45819
diff changeset
  3200
def commitstatus(repo, node, branch, bheads=None, tip=None, opts=None):
26324
4a8e21578e14 addremove: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26229
diff changeset
  3201
    if opts is None:
4a8e21578e14 addremove: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26229
diff changeset
  3202
        opts = {}
18688
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3203
    ctx = repo[node]
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3204
    parents = ctx.parents()
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3205
45831
976b26bdd0d8 commit: warn the user when a commit already exists
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45819
diff changeset
  3206
    if tip is not None and repo.changelog.tip() == tip:
976b26bdd0d8 commit: warn the user when a commit already exists
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45819
diff changeset
  3207
        # avoid reporting something like "committed new head" when
976b26bdd0d8 commit: warn the user when a commit already exists
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45819
diff changeset
  3208
        # recommitting old changesets, and issue a helpful warning
976b26bdd0d8 commit: warn the user when a commit already exists
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45819
diff changeset
  3209
        # for most instances
46364
f0982c76ef1b cmdutil: add a missing byte prefix to string introduce in 976b26bdd0d8
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46241
diff changeset
  3210
        repo.ui.warn(_(b"warning: commit already existed in the repository!\n"))
45831
976b26bdd0d8 commit: warn the user when a commit already exists
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45819
diff changeset
  3211
    elif (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3212
        not opts.get(b'amend')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3213
        and bheads
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3214
        and node not in bheads
45039
c05ac059749f cleanup: use any() instead of checking truthiness of temporary list
Manuel Jacob <me@manueljacob.de>
parents: 44920
diff changeset
  3215
        and not any(
45040
0c40d2d151cb cleanup: use slightly more meaningful name for temporary variable
Manuel Jacob <me@manueljacob.de>
parents: 45039
diff changeset
  3216
            p.node() in bheads and p.branch() == branch for p in parents
45039
c05ac059749f cleanup: use any() instead of checking truthiness of temporary list
Manuel Jacob <me@manueljacob.de>
parents: 44920
diff changeset
  3217
        )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3218
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3219
        repo.ui.status(_(b'created new head\n'))
18688
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3220
        # The message is not printed for initial roots. For the other
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3221
        # changesets, it is printed in the following situations:
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3222
        #
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3223
        # Par column: for the 2 parents with ...
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3224
        #   N: null or no parent
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3225
        #   B: parent is on another named branch
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3226
        #   C: parent is a regular non head changeset
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3227
        #   H: parent was a branch head of the current branch
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3228
        # Msg column: whether we print "created new head" message
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3229
        # In the following, it is assumed that there already exists some
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3230
        # initial branch heads of the current branch, otherwise nothing is
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3231
        # printed anyway.
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3232
        #
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3233
        # Par Msg Comment
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3234
        # N N  y  additional topo root
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3235
        #
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3236
        # B N  y  additional branch root
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3237
        # C N  y  additional topo head
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3238
        # H N  n  usual case
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3239
        #
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3240
        # B B  y  weird additional branch root
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3241
        # C B  y  branch merge
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3242
        # H B  n  merge with named branch
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3243
        #
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3244
        # C C  y  additional head from merge
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3245
        # C H  n  merge with a head
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3246
        #
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3247
        # H H  n  head merge: head count decreases
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3248
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3249
    if not opts.get(b'close_branch'):
18688
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3250
        for r in parents:
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3251
            if r.closesbranch() and r.branch() == branch:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3252
                repo.ui.status(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3253
                    _(b'reopening closed branch head %d\n') % r.rev()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3254
                )
18688
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3255
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3256
    if repo.ui.debugflag:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3257
        repo.ui.write(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3258
            _(b'committed changeset %d:%s\n') % (ctx.rev(), ctx.hex())
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3259
        )
18688
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3260
    elif repo.ui.verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3261
        repo.ui.write(_(b'committed changeset %d:%s\n') % (ctx.rev(), ctx))
18688
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
  3262
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3263
27943
02c5f8ad00ac commit: factor the post commit status check into a cmdutil method
Matt Harbison <matt_harbison@yahoo.com>
parents: 27868
diff changeset
  3264
def postcommitstatus(repo, pats, opts):
02c5f8ad00ac commit: factor the post commit status check into a cmdutil method
Matt Harbison <matt_harbison@yahoo.com>
parents: 27868
diff changeset
  3265
    return repo.status(match=scmutil.match(repo[None], pats, opts))
02c5f8ad00ac commit: factor the post commit status check into a cmdutil method
Matt Harbison <matt_harbison@yahoo.com>
parents: 27868
diff changeset
  3266
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3267
45395
8c466bcb0879 revert: remove dangerous `parents` argument from `cmdutil.revert()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 45392
diff changeset
  3268
def revert(ui, repo, ctx, *pats, **opts):
35168
3da4bd50103d py3: fix handling of keyword arguments in revert
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35144
diff changeset
  3269
    opts = pycompat.byteskwargs(opts)
45395
8c466bcb0879 revert: remove dangerous `parents` argument from `cmdutil.revert()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 45392
diff changeset
  3270
    parent, p2 = repo.dirstate.parents()
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3271
    node = ctx.node()
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3272
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3273
    mf = ctx.manifest()
21579
87a972b5c039 revert: use p2 as parent when reverting against it
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21578
diff changeset
  3274
    if node == p2:
87a972b5c039 revert: use p2 as parent when reverting against it
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21578
diff changeset
  3275
        parent = p2
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3276
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3277
    # need all matching names in dirstate and manifest of target rev,
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3278
    # so have to walk both. do not print errors if files exist in one
24451
c3bbafef25d6 revert: comment that filesets are always evaluated against workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 24450
diff changeset
  3279
    # but not other. in both cases, filesets should be evaluated against
c3bbafef25d6 revert: comment that filesets are always evaluated against workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 24450
diff changeset
  3280
    # workingctx to get consistent result (issue4497). this means 'set:**'
c3bbafef25d6 revert: comment that filesets are always evaluated against workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 24450
diff changeset
  3281
    # cannot be used to select missing files from target rev.
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3282
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
  3283
    # `names` is a mapping for all elements in working copy and target revision
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
  3284
    # The mapping is in the form:
39314
6b81d2ff118f cmdutil: fix typo in revert()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39305
diff changeset
  3285
    #   <abs path in repo> -> (<path from CWD>, <exactly specified by matcher?>)
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3286
    names = {}
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3287
    uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3288
27803
a8e8950ebd4d with: use context manager for wlock in revert
Bryan O'Sullivan <bryano@fb.com>
parents: 27802
diff changeset
  3289
    with repo.wlock():
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
  3290
        ## filling of the `names` mapping
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
  3291
        # walk dirstate to fill `names`
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3292
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3293
        interactive = opts.get(b'interactive', False)
24449
bab983bb6fd1 revert: define 'wctx' a little earlier and use it more
Martin von Zweigbergk <martinvonz@google.com>
parents: 24438
diff changeset
  3294
        wctx = repo[None]
bab983bb6fd1 revert: define 'wctx' a little earlier and use it more
Martin von Zweigbergk <martinvonz@google.com>
parents: 24438
diff changeset
  3295
        m = scmutil.match(wctx, pats, opts)
24479
871485bd03fd revert: move calculation of targetsubs earlier
Matt Mackall <mpm@selenic.com>
parents: 24476
diff changeset
  3296
871485bd03fd revert: move calculation of targetsubs earlier
Matt Mackall <mpm@selenic.com>
parents: 24476
diff changeset
  3297
        # we'll need this later
871485bd03fd revert: move calculation of targetsubs earlier
Matt Mackall <mpm@selenic.com>
parents: 24476
diff changeset
  3298
        targetsubs = sorted(s for s in wctx.substate if m(s))
871485bd03fd revert: move calculation of targetsubs earlier
Matt Mackall <mpm@selenic.com>
parents: 24476
diff changeset
  3299
24450
961790c35b4f revert: take fast path also when not reverting to '.'
Martin von Zweigbergk <martinvonz@google.com>
parents: 24449
diff changeset
  3300
        if not m.always():
32401
7b3c27af90c2 cmdutil: use repo[None].walk instead of repo.walk
Augie Fackler <augie@google.com>
parents: 32382
diff changeset
  3301
            matcher = matchmod.badmatch(m, lambda x, y: False)
32421
c87db79b9507 cleanup: reuse existing wctx variables instead of calling repo[None]
Martin von Zweigbergk <martinvonz@google.com>
parents: 32414
diff changeset
  3302
            for abs in wctx.walk(matcher):
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3303
                names[abs] = m.exact(abs)
22573
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3304
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3305
            # walk target manifest to fill `names`
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3306
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3307
            def badfn(path, msg):
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3308
                if path in names:
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3309
                    return
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3310
                if path in ctx.substate:
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3311
                    return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3312
                path_ = path + b'/'
22573
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3313
                for f in names:
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3314
                    if f.startswith(path_):
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3315
                        return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3316
                ui.warn(b"%s: %s\n" % (uipathfn(path), msg))
22573
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3317
25439
aaede04c0ba6 revert: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25438
diff changeset
  3318
            for abs in ctx.walk(matchmod.badmatch(m, badfn)):
22573
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3319
                if abs not in names:
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3320
                    names[abs] = m.exact(abs)
22573
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3321
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3322
            # Find status of all file in `names`.
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3323
            m = scmutil.matchfiles(repo, names)
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3324
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3325
            changes = repo.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3326
                node1=node, match=m, unknown=True, ignored=True, clean=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3327
            )
22573
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3328
        else:
24450
961790c35b4f revert: take fast path also when not reverting to '.'
Martin von Zweigbergk <martinvonz@google.com>
parents: 24449
diff changeset
  3329
            changes = repo.status(node1=node, match=m)
22573
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3330
            for kind in changes:
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3331
                for abs in kind:
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3332
                    names[abs] = m.exact(abs)
22573
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3333
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3334
            m = scmutil.matchfiles(repo, names)
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
  3335
23374
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
  3336
        modified = set(changes.modified)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3337
        added = set(changes.added)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3338
        removed = set(changes.removed)
23374
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
  3339
        _deleted = set(changes.deleted)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3340
        unknown = set(changes.unknown)
23374
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
  3341
        unknown.update(changes.ignored)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3342
        clean = set(changes.clean)
22610
0f323ed8effd revert: track added files with local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22609
diff changeset
  3343
        modadded = set()
22185
afead12e724b revert: triage "deleted" files into more appropriate categories
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22173
diff changeset
  3344
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
  3345
        # We need to account for the state of the file in the dirstate,
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
  3346
        # even when we revert against something else than parent. This will
22155
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
  3347
        # slightly alter the behavior of revert (doing back up or not, delete
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23101
diff changeset
  3348
        # or just forget etc).
22155
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
  3349
        if parent == node:
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
  3350
            dsmodified = modified
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
  3351
            dsadded = added
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
  3352
            dsremoved = removed
23403
edf29f9c15f0 revert: look for copy information for all local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23101
diff changeset
  3353
            # store all local modifications, useful later for rename detection
edf29f9c15f0 revert: look for copy information for all local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23101
diff changeset
  3354
            localchanges = dsmodified | dsadded
22155
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
  3355
            modified, added, removed = set(), set(), set()
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
  3356
        else:
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
  3357
            changes = repo.status(node1=parent, match=m)
23374
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
  3358
            dsmodified = set(changes.modified)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3359
            dsadded = set(changes.added)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3360
            dsremoved = set(changes.removed)
23403
edf29f9c15f0 revert: look for copy information for all local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23101
diff changeset
  3361
            # store all local modifications, useful later for rename detection
edf29f9c15f0 revert: look for copy information for all local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23101
diff changeset
  3362
            localchanges = dsmodified | dsadded
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3363
22188
0ad619c5e1a4 revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22187
diff changeset
  3364
            # only take into account for removes between wc and target
0ad619c5e1a4 revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22187
diff changeset
  3365
            clean |= dsremoved - removed
0ad619c5e1a4 revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22187
diff changeset
  3366
            dsremoved &= removed
0ad619c5e1a4 revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22187
diff changeset
  3367
            # distinct between dirstate remove and other
0ad619c5e1a4 revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22187
diff changeset
  3368
            removed -= dsremoved
0ad619c5e1a4 revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22187
diff changeset
  3369
22610
0f323ed8effd revert: track added files with local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22609
diff changeset
  3370
            modadded = added & dsmodified
0f323ed8effd revert: track added files with local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22609
diff changeset
  3371
            added -= modadded
0f323ed8effd revert: track added files with local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22609
diff changeset
  3372
22190
55308ab8117c revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22189
diff changeset
  3373
            # tell newly modified apart.
55308ab8117c revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22189
diff changeset
  3374
            dsmodified &= modified
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3375
            dsmodified |= modified & dsadded  # dirstate added may need backup
22190
55308ab8117c revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22189
diff changeset
  3376
            modified -= dsmodified
55308ab8117c revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22189
diff changeset
  3377
22488
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
  3378
            # We need to wait for some post-processing to update this set
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
  3379
            # before making the distinction. The dirstate will be used for
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
  3380
            # that purpose.
22208
d3659b3795e9 revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22205
diff changeset
  3381
            dsadded = added
d3659b3795e9 revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22205
diff changeset
  3382
22209
06fbd9518bc5 revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22208
diff changeset
  3383
        # in case of merge, files that are actually added can be reported as
06fbd9518bc5 revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22208
diff changeset
  3384
        # modified, we need to post process the result
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46969
diff changeset
  3385
        if p2 != repo.nullid:
31149
c22253c4c1b8 revert: remove set(mf) because it's O(manifest)
Durham Goode <durham@fb.com>
parents: 31095
diff changeset
  3386
            mergeadd = set(dsmodified)
c22253c4c1b8 revert: remove set(mf) because it's O(manifest)
Durham Goode <durham@fb.com>
parents: 31095
diff changeset
  3387
            for path in dsmodified:
c22253c4c1b8 revert: remove set(mf) because it's O(manifest)
Durham Goode <durham@fb.com>
parents: 31095
diff changeset
  3388
                if path in mf:
c22253c4c1b8 revert: remove set(mf) because it's O(manifest)
Durham Goode <durham@fb.com>
parents: 31095
diff changeset
  3389
                    mergeadd.remove(path)
22209
06fbd9518bc5 revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22208
diff changeset
  3390
            dsadded |= mergeadd
06fbd9518bc5 revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22208
diff changeset
  3391
            dsmodified -= mergeadd
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3392
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
  3393
        # if f is a rename, update `names` to also revert the source
23403
edf29f9c15f0 revert: look for copy information for all local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23101
diff changeset
  3394
        for f in localchanges:
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3395
            src = repo.dirstate.copied(f)
22213
f1debbcd71cd revert: add an XXX about rename tracking
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22212
diff changeset
  3396
            # XXX should we check for rename down to target node?
48116
e8d6261513b9 dirstate-item: use item's property instead of `state` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48114
diff changeset
  3397
            if (
e8d6261513b9 dirstate-item: use item's property instead of `state` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48114
diff changeset
  3398
                src
e8d6261513b9 dirstate-item: use item's property instead of `state` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48114
diff changeset
  3399
                and src not in names
e8d6261513b9 dirstate-item: use item's property instead of `state` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48114
diff changeset
  3400
                and repo.dirstate.get_entry(src).removed
e8d6261513b9 dirstate-item: use item's property instead of `state` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48114
diff changeset
  3401
            ):
22154
fc422de25773 revert: prefix variable names for dirstate status with "ds"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22153
diff changeset
  3402
                dsremoved.add(src)
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3403
                names[src] = True
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3404
31167
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
  3405
        # determine the exact nature of the deleted changesets
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
  3406
        deladded = set(_deleted)
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
  3407
        for path in _deleted:
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
  3408
            if path in mf:
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
  3409
                deladded.remove(path)
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
  3410
        deleted = _deleted - deladded
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
  3411
22488
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
  3412
        # distinguish between file to forget and the other
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
  3413
        added = set()
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
  3414
        for abs in dsadded:
48116
e8d6261513b9 dirstate-item: use item's property instead of `state` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48114
diff changeset
  3415
            if not repo.dirstate.get_entry(abs).added:
22488
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
  3416
                added.add(abs)
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
  3417
        dsadded -= added
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
  3418
22490
bcab7bc7280e revert: explicitly track added but deleted file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22489
diff changeset
  3419
        for abs in deladded:
48116
e8d6261513b9 dirstate-item: use item's property instead of `state` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48114
diff changeset
  3420
            if repo.dirstate.get_entry(abs).added:
22490
bcab7bc7280e revert: explicitly track added but deleted file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22489
diff changeset
  3421
                dsadded.add(abs)
bcab7bc7280e revert: explicitly track added but deleted file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22489
diff changeset
  3422
        deladded -= dsadded
bcab7bc7280e revert: explicitly track added but deleted file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22489
diff changeset
  3423
22396
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3424
        # For files marked as removed, we check if an unknown file is present at
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3425
        # the same path. If a such file exists it may need to be backed up.
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3426
        # Making the distinction at this stage helps have simpler backup
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3427
        # logic.
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3428
        removunk = set()
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3429
        for abs in removed:
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3430
            target = repo.wjoin(abs)
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3431
            if os.path.lexists(target):
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3432
                removunk.add(abs)
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3433
        removed -= removunk
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3434
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3435
        dsremovunk = set()
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3436
        for abs in dsremoved:
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3437
            target = repo.wjoin(abs)
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3438
            if os.path.lexists(target):
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3439
                dsremovunk.add(abs)
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3440
        dsremoved -= dsremovunk
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3441
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
  3442
        # action to be actually performed by revert
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
  3443
        # (<list of file>, message>) tuple
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3444
        actions = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3445
            b'revert': ([], _(b'reverting %s\n')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3446
            b'add': ([], _(b'adding %s\n')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3447
            b'remove': ([], _(b'removing %s\n')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3448
            b'drop': ([], _(b'removing %s\n')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3449
            b'forget': ([], _(b'forgetting %s\n')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3450
            b'undelete': ([], _(b'undeleting %s\n')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3451
            b'noop': (None, _(b'no changes needed to %s\n')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3452
            b'unknown': (None, _(b'file not managed: %s\n')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3453
        }
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3454
22608
bf0ecb224316 revert: small refactoring in the way backup value are handled
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22588
diff changeset
  3455
        # "constant" that convey the backup strategy.
bf0ecb224316 revert: small refactoring in the way backup value are handled
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22588
diff changeset
  3456
        # All set to `discard` if `no-backup` is set do avoid checking
bf0ecb224316 revert: small refactoring in the way backup value are handled
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22588
diff changeset
  3457
        # no_backup lower in the code.
22609
3760ebf786b8 revert: distinguish between "check" and "backup" strategy
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22608
diff changeset
  3458
        # These values are ordered for comparison purposes
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3459
        backupinteractive = 3  # do backup if interactively modified
22608
bf0ecb224316 revert: small refactoring in the way backup value are handled
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22588
diff changeset
  3460
        backup = 2  # unconditionally do backup
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3461
        check = 1  # check if the existing file differs from target
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3462
        discard = 0  # never do backup
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3463
        if opts.get(b'no_backup'):
29498
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3464
            backupinteractive = backup = check = discard
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3465
        if interactive:
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3466
            dsmodifiedbackup = backupinteractive
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3467
        else:
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3468
            dsmodifiedbackup = backup
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3469
        tobackup = set()
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3470
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3471
        backupanddel = actions[b'remove']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3472
        if not opts.get(b'no_backup'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3473
            backupanddel = actions[b'drop']
22611
2ff28e07d7d6 revert: properly back up added files with local modification
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22610
diff changeset
  3474
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3475
        disptable = (
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3476
            # dispatch table:
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3477
            #   file state
22153
fc8bc2787528 revert: move manifest membership condition outside of the loop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22013
diff changeset
  3478
            #   action
fc8bc2787528 revert: move manifest membership condition outside of the loop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22013
diff changeset
  3479
            #   make backup
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
  3480
            ## Sets that results that will change file on disk
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
  3481
            # Modified compared to target, no local change
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3482
            (modified, actions[b'revert'], discard),
22397
1db04829bdc1 revert: distinguish between deleted file and locally modified
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22396
diff changeset
  3483
            # Modified compared to target, but local file is deleted
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3484
            (deleted, actions[b'revert'], discard),
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
  3485
            # Modified compared to target, local change
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3486
            (dsmodified, actions[b'revert'], dsmodifiedbackup),
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
  3487
            # Added since target
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3488
            (added, actions[b'remove'], discard),
22488
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
  3489
            # Added in working directory
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3490
            (dsadded, actions[b'forget'], discard),
22610
0f323ed8effd revert: track added files with local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22609
diff changeset
  3491
            # Added since target, have local modification
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3492
            (modadded, backupanddel, backup),
22490
bcab7bc7280e revert: explicitly track added but deleted file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22489
diff changeset
  3493
            # Added since target but file is missing in working directory
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3494
            (deladded, actions[b'drop'], discard),
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
  3495
            # Removed since  target, before working copy parent
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3496
            (removed, actions[b'add'], discard),
22396
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3497
            # Same as `removed` but an unknown file exists at the same path
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3498
            (removunk, actions[b'add'], check),
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
  3499
            # Removed since targe, marked as such in working copy parent
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3500
            (dsremoved, actions[b'undelete'], discard),
22396
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
  3501
            # Same as `dsremoved` but an unknown file exists at the same path
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3502
            (dsremovunk, actions[b'undelete'], check),
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
  3503
            ## the following sets does not result in any file changes
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
  3504
            # File with no modification
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3505
            (clean, actions[b'noop'], discard),
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
  3506
            # Existing file, not tracked anywhere
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3507
            (unknown, actions[b'unknown'], discard),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3508
        )
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3509
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3510
        for abs, exact in sorted(names.items()):
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
  3511
            # target file to be touch on disk (relative to cwd)
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3512
            target = repo.wjoin(abs)
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
  3513
            # search the entry in the dispatch table.
22212
f18aca03ddd9 revert: inline a now useless closure
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22211
diff changeset
  3514
            # if the file is in any of these sets, it was touched in the working
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
  3515
            # directory parent and we are sure it needs to be reverted.
22232
91df98701e9e revert: explode the action tuple in the for loop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22231
diff changeset
  3516
            for table, (xlist, msg), dobackup in disptable:
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3517
                if abs not in table:
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3518
                    continue
22233
4ab61b24e20c revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22232
diff changeset
  3519
                if xlist is not None:
4ab61b24e20c revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22232
diff changeset
  3520
                    xlist.append(abs)
29498
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3521
                    if dobackup:
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3522
                        # If in interactive mode, don't automatically create
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3523
                        # .orig files (issue4793)
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3524
                        if dobackup == backupinteractive:
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3525
                            tobackup.add(abs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3526
                        elif backup <= dobackup or wctx[abs].cmp(ctx[abs]):
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3527
                            absbakname = scmutil.backuppath(ui, repo, abs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3528
                            bakname = os.path.relpath(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3529
                                absbakname, start=repo.root
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3530
                            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3531
                            ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3532
                                _(b'saving current version of %s as %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3533
                                % (uipathfn(abs), uipathfn(bakname))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3534
                            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3535
                            if not opts.get(b'dry_run'):
24475
06cbff4674a3 revert: fix --interactive on local modification (issue4576)
Laurent Charignon <lcharignon@fb.com>
parents: 24472
diff changeset
  3536
                                if interactive:
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3537
                                    util.copyfile(target, absbakname)
24475
06cbff4674a3 revert: fix --interactive on local modification (issue4576)
Laurent Charignon <lcharignon@fb.com>
parents: 24472
diff changeset
  3538
                                else:
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3539
                                    util.rename(target, absbakname)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3540
                    if opts.get(b'dry_run'):
39432
cb70501d8b71 revert: fix the inconsistency of status msgs in --interactive mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39431
diff changeset
  3541
                        if ui.verbose or not exact:
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3542
                            ui.status(msg % uipathfn(abs))
22233
4ab61b24e20c revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22232
diff changeset
  3543
                elif exact:
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3544
                    ui.warn(msg % uipathfn(abs))
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
  3545
                break
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
  3546
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3547
        if not opts.get(b'dry_run'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3548
            needdata = (b'revert', b'add', b'undelete')
35963
efbd04238029 cmdutil: convert _revertprefetch() to a generic stored file hook (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35950
diff changeset
  3549
            oplist = [actions[name][0] for name in needdata]
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37756
diff changeset
  3550
            prefetch = scmutil.prefetchfiles
45073
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 45040
diff changeset
  3551
            matchfiles = scmutil.matchfiles(
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 45040
diff changeset
  3552
                repo, [f for sublist in oplist for f in sublist]
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 45040
diff changeset
  3553
            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3554
            prefetch(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3555
                repo,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3556
                [(ctx.rev(), matchfiles)],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3557
            )
42071
db72f9f6580e interactive: do not prompt about files given in command line
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 42057
diff changeset
  3558
            match = scmutil.match(repo[None], pats)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3559
            _performrevert(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3560
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3561
                ctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3562
                names,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3563
                uipathfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3564
                actions,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3565
                match,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3566
                interactive,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3567
                tobackup,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3568
            )
19129
bd19587a3347 revert: ensure that copies and renames are honored (issue3920)
Bryan O'Sullivan <bryano@fb.com>
parents: 19024
diff changeset
  3569
24134
afed5d2e7985 revert: display full subrepo output with --dry-run
Matt Harbison <matt_harbison@yahoo.com>
parents: 24064
diff changeset
  3570
        if targetsubs:
afed5d2e7985 revert: display full subrepo output with --dry-run
Matt Harbison <matt_harbison@yahoo.com>
parents: 24064
diff changeset
  3571
            # Revert the subrepos on the revert list
afed5d2e7985 revert: display full subrepo output with --dry-run
Matt Harbison <matt_harbison@yahoo.com>
parents: 24064
diff changeset
  3572
            for sub in targetsubs:
24463
06d199e66bbc revert: handle subrepos missing in the given --rev
Matt Harbison <matt_harbison@yahoo.com>
parents: 24455
diff changeset
  3573
                try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3574
                    wctx.sub(sub).revert(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3575
                        ctx.substate[sub], *pats, **pycompat.strkwargs(opts)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3576
                    )
24463
06d199e66bbc revert: handle subrepos missing in the given --rev
Matt Harbison <matt_harbison@yahoo.com>
parents: 24455
diff changeset
  3577
                except KeyError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3578
                    raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3579
                        b"subrepository '%s' does not exist in %s!"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3580
                        % (sub, short(ctx.node()))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3581
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3582
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3583
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3584
def _performrevert(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3585
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3586
    ctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3587
    names,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3588
    uipathfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3589
    actions,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3590
    match,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3591
    interactive=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3592
    tobackup=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3593
):
21576
33395a7e5527 revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21575
diff changeset
  3594
    """function that actually perform all the actions computed for revert
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3595
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3596
    This is an independent function to let extension to plug in and react to
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3597
    the imminent revert.
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3598
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
  3599
    Make sure you have the working directory locked when calling this function.
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3600
    """
45395
8c466bcb0879 revert: remove dangerous `parents` argument from `cmdutil.revert()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 45392
diff changeset
  3601
    parent, p2 = repo.dirstate.parents()
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3602
    node = ctx.node()
27985
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
  3603
    excluded_files = []
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
  3604
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3605
    def checkout(f):
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3606
        fc = ctx[f]
25755
72d395e399c1 cmdutil: remove useless dirstate.normallookup() invocation in revert()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25739
diff changeset
  3607
        repo.wwrite(f, fc.data(), fc.flags())
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3608
30541
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
  3609
    def doremove(f):
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
  3610
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3611
            rmdir = repo.ui.configbool(b'experimental', b'removeemptydirs')
38497
da2a7d8354b2 unlinkpath: make empty directory removal optional (issue5901) (issue5826)
Kyle Lippincott <spectral@google.com>
parents: 38465
diff changeset
  3612
            repo.wvfs.unlinkpath(f, rmdir=rmdir)
30541
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
  3613
        except OSError:
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
  3614
            pass
47602
8f0c3533e28c revert: use `set_untracked` when performing a revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47596
diff changeset
  3615
        repo.dirstate.set_untracked(f)
30541
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
  3616
39432
cb70501d8b71 revert: fix the inconsistency of status msgs in --interactive mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39431
diff changeset
  3617
    def prntstatusmsg(action, f):
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3618
        exact = names[f]
39432
cb70501d8b71 revert: fix the inconsistency of status msgs in --interactive mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39431
diff changeset
  3619
        if repo.ui.verbose or not exact:
41618
7068c6b0114b revert: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
  3620
            repo.ui.status(actions[action][1] % uipathfn(f))
39432
cb70501d8b71 revert: fix the inconsistency of status msgs in --interactive mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39431
diff changeset
  3621
33647
377e8ddaebef pathauditor: disable cache of audited paths by default (issue5628)
Yuya Nishihara <yuya@tcha.org>
parents: 33616
diff changeset
  3622
    audit_path = pathutil.pathauditor(repo.root, cached=True)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3623
    for f in actions[b'forget'][0]:
27985
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
  3624
        if interactive:
30539
74013a831872 style: avoid an unnecessary line split
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30528
diff changeset
  3625
            choice = repo.ui.promptchoice(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3626
                _(b"forget added file %s (Yn)?$$ &Yes $$ &No") % uipathfn(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3627
            )
27985
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
  3628
            if choice == 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3629
                prntstatusmsg(b'forget', f)
47603
7c64688e554d revert: use `set_untracked` instead of `drop` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47602
diff changeset
  3630
                repo.dirstate.set_untracked(f)
27985
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
  3631
            else:
36232
39b3aab6231e revert: use an exact matcher in interactive diff selection (issue5789)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 36179
diff changeset
  3632
                excluded_files.append(f)
27985
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
  3633
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3634
            prntstatusmsg(b'forget', f)
47603
7c64688e554d revert: use `set_untracked` instead of `drop` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47602
diff changeset
  3635
            repo.dirstate.set_untracked(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3636
    for f in actions[b'remove'][0]:
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3637
        audit_path(f)
30541
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
  3638
        if interactive:
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
  3639
            choice = repo.ui.promptchoice(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3640
                _(b"remove added file %s (Yn)?$$ &Yes $$ &No") % uipathfn(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3641
            )
30541
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
  3642
            if choice == 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3643
                prntstatusmsg(b'remove', f)
30541
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
  3644
                doremove(f)
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
  3645
            else:
36232
39b3aab6231e revert: use an exact matcher in interactive diff selection (issue5789)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 36179
diff changeset
  3646
                excluded_files.append(f)
30541
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
  3647
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3648
            prntstatusmsg(b'remove', f)
30541
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
  3649
            doremove(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3650
    for f in actions[b'drop'][0]:
22491
5e16fe6fdd32 revert: add a `drop` action
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22490
diff changeset
  3651
        audit_path(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3652
        prntstatusmsg(b'drop', f)
47602
8f0c3533e28c revert: use `set_untracked` when performing a revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47596
diff changeset
  3653
        repo.dirstate.set_untracked(f)
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3654
48432
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48412
diff changeset
  3655
    # We are reverting to our parent. If possible, we had like `hg status`
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48412
diff changeset
  3656
    # to report the file as clean. We have to be less agressive for
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48412
diff changeset
  3657
    # merges to avoid losing information about copy introduced by the merge.
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48412
diff changeset
  3658
    # This might comes with bugs ?
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48412
diff changeset
  3659
    reset_copy = p2 == repo.nullid
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48412
diff changeset
  3660
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48412
diff changeset
  3661
    def normal(filename):
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48412
diff changeset
  3662
        return repo.dirstate.set_tracked(filename, reset_copy=reset_copy)
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3663
25259
5b05f10c5024 revert: fix edition of newly added file during --interactive
Laurent Charignon <lcharignon@fb.com>
parents: 25258
diff changeset
  3664
    newlyaddedandmodifiedfiles = set()
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3665
    if interactive:
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3666
        # Prompt the user for changes to revert
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3667
        torevert = [f for f in actions[b'revert'][0] if f not in excluded_files]
36232
39b3aab6231e revert: use an exact matcher in interactive diff selection (issue5789)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 36179
diff changeset
  3668
        m = scmutil.matchfiles(repo, torevert)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3669
        diffopts = patch.difffeatureopts(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3670
            repo.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3671
            whitespace=True,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3672
            section=b'commands',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3673
            configprefix=b'revert.interactive.',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3674
        )
25258
f37a69ec3f47 revert: make revert --interactive use git style diff
Laurent Charignon <lcharignon@fb.com>
parents: 25257
diff changeset
  3675
        diffopts.nodates = True
f37a69ec3f47 revert: make revert --interactive use git style diff
Laurent Charignon <lcharignon@fb.com>
parents: 25257
diff changeset
  3676
        diffopts.git = True
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3677
        operation = b'apply'
41987
c1d83d916e85 revert: option to choose what to keep, not what to discard
Martin von Zweigbergk <martinvonz@google.com>
parents: 41985
diff changeset
  3678
        if node == parent:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3679
            if repo.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3680
                b'experimental', b'revert.interactive.select-to-keep'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3681
            ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3682
                operation = b'keep'
41987
c1d83d916e85 revert: option to choose what to keep, not what to discard
Martin von Zweigbergk <martinvonz@google.com>
parents: 41985
diff changeset
  3683
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3684
                operation = b'discard'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3685
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3686
        if operation == b'apply':
41987
c1d83d916e85 revert: option to choose what to keep, not what to discard
Martin von Zweigbergk <martinvonz@google.com>
parents: 41985
diff changeset
  3687
            diff = patch.diff(repo, None, ctx.node(), m, opts=diffopts)
c1d83d916e85 revert: option to choose what to keep, not what to discard
Martin von Zweigbergk <martinvonz@google.com>
parents: 41985
diff changeset
  3688
        else:
25424
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
  3689
            diff = patch.diff(repo, ctx.node(), None, m, opts=diffopts)
47565
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
  3690
        original_headers = patch.parsepatch(diff)
25424
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
  3691
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3692
        try:
25424
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
  3693
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3694
            chunks, opts = recordfilter(
47565
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
  3695
                repo.ui, original_headers, match, operation=operation
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3696
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3697
            if operation == b'discard':
25424
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
  3698
                chunks = patch.reversehunks(chunks)
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
  3699
48411
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  3700
        except error.PatchParseError as err:
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  3701
            raise error.InputError(_(b'error parsing patch: %s') % err)
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  3702
        except error.PatchApplicationError as err:
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  3703
            raise error.StateError(_(b'error applying patch: %s') % err)
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3704
42862
3cf091843b4f split: handle partial commit of renames when doing split or record (issue5723)
Kyle Lippincott <spectral@google.com>
parents: 42643
diff changeset
  3705
        # FIXME: when doing an interactive revert of a copy, there's no way of
3cf091843b4f split: handle partial commit of renames when doing split or record (issue5723)
Kyle Lippincott <spectral@google.com>
parents: 42643
diff changeset
  3706
        # performing a partial revert of the added file, the only option is
3cf091843b4f split: handle partial commit of renames when doing split or record (issue5723)
Kyle Lippincott <spectral@google.com>
parents: 42643
diff changeset
  3707
        # "remove added file <name> (Yn)?", so we don't need to worry about the
3cf091843b4f split: handle partial commit of renames when doing split or record (issue5723)
Kyle Lippincott <spectral@google.com>
parents: 42643
diff changeset
  3708
        # alsorestore value. Ideally we'd be able to partially revert
3cf091843b4f split: handle partial commit of renames when doing split or record (issue5723)
Kyle Lippincott <spectral@google.com>
parents: 42643
diff changeset
  3709
        # copied/renamed files.
47565
00ae1fb6c459 cmdutil: fix newandmodified file accounting for --interactive commits
Daniel Ploch <dploch@google.com>
parents: 47438
diff changeset
  3710
        newlyaddedandmodifiedfiles, unusedalsorestore = newandmodified(chunks)
29498
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3711
        if tobackup is None:
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3712
            tobackup = set()
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3713
        # Apply changes
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28837
diff changeset
  3714
        fp = stringio()
39441
1cbe19eb496d revert: stabilize status message of chunks selected interactively
Yuya Nishihara <yuya@tcha.org>
parents: 39432
diff changeset
  3715
        # chunks are serialized per file, but files aren't sorted
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44460
diff changeset
  3716
        for f in sorted({c.header.filename() for c in chunks if ishunk(c)}):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3717
            prntstatusmsg(b'revert', f)
41987
c1d83d916e85 revert: option to choose what to keep, not what to discard
Martin von Zweigbergk <martinvonz@google.com>
parents: 41985
diff changeset
  3718
        files = set()
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3719
        for c in chunks:
39432
cb70501d8b71 revert: fix the inconsistency of status msgs in --interactive mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39431
diff changeset
  3720
            if ishunk(c):
29498
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
  3721
                abs = c.header.filename()
39432
cb70501d8b71 revert: fix the inconsistency of status msgs in --interactive mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39431
diff changeset
  3722
                # Create a backup file only if this hunk should be backed up
cb70501d8b71 revert: fix the inconsistency of status msgs in --interactive mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39431
diff changeset
  3723
                if c.header.filename() in tobackup:
cb70501d8b71 revert: fix the inconsistency of status msgs in --interactive mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39431
diff changeset
  3724
                    target = repo.wjoin(abs)
41610
9e545c9a4dfe revert: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41604
diff changeset
  3725
                    bakname = scmutil.backuppath(repo.ui, repo, abs)
39432
cb70501d8b71 revert: fix the inconsistency of status msgs in --interactive mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39431
diff changeset
  3726
                    util.copyfile(target, bakname)
cb70501d8b71 revert: fix the inconsistency of status msgs in --interactive mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39431
diff changeset
  3727
                    tobackup.remove(abs)
41987
c1d83d916e85 revert: option to choose what to keep, not what to discard
Martin von Zweigbergk <martinvonz@google.com>
parents: 41985
diff changeset
  3728
                if abs not in files:
c1d83d916e85 revert: option to choose what to keep, not what to discard
Martin von Zweigbergk <martinvonz@google.com>
parents: 41985
diff changeset
  3729
                    files.add(abs)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3730
                    if operation == b'keep':
41987
c1d83d916e85 revert: option to choose what to keep, not what to discard
Martin von Zweigbergk <martinvonz@google.com>
parents: 41985
diff changeset
  3731
                        checkout(abs)
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3732
            c.write(fp)
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3733
        dopatch = fp.tell()
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3734
        fp.seek(0)
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3735
        if dopatch:
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3736
            try:
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3737
                patch.internalpatch(repo.ui, repo, fp, 1, eolmode=None)
48411
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  3738
            except error.PatchParseError as err:
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  3739
                raise error.InputError(pycompat.bytestr(err))
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  3740
            except error.PatchApplicationError as err:
6a454e7053a1 errors: return more detailed errors when failing to parse or apply patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 48258
diff changeset
  3741
                raise error.StateError(pycompat.bytestr(err))
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3742
        del fp
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3743
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3744
        for f in actions[b'revert'][0]:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3745
            prntstatusmsg(b'revert', f)
25755
72d395e399c1 cmdutil: remove useless dirstate.normallookup() invocation in revert()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25739
diff changeset
  3746
            checkout(f)
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3747
            if normal:
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
  3748
                normal(f)
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3749
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3750
    for f in actions[b'add'][0]:
25259
5b05f10c5024 revert: fix edition of newly added file during --interactive
Laurent Charignon <lcharignon@fb.com>
parents: 25258
diff changeset
  3751
        # Don't checkout modified files, they are already created by the diff
49096
9be7da341885 revert: use a `continue` to reduce indentation
Martin von Zweigbergk <martinvonz@google.com>
parents: 49059
diff changeset
  3752
        if f in newlyaddedandmodifiedfiles:
9be7da341885 revert: use a `continue` to reduce indentation
Martin von Zweigbergk <martinvonz@google.com>
parents: 49059
diff changeset
  3753
            continue
9be7da341885 revert: use a `continue` to reduce indentation
Martin von Zweigbergk <martinvonz@google.com>
parents: 49059
diff changeset
  3754
49097
3f6ef67e7a60 revert: ask user to confirm before tracking new file when interactive
Martin von Zweigbergk <martinvonz@google.com>
parents: 49096
diff changeset
  3755
        if interactive:
3f6ef67e7a60 revert: ask user to confirm before tracking new file when interactive
Martin von Zweigbergk <martinvonz@google.com>
parents: 49096
diff changeset
  3756
            choice = repo.ui.promptchoice(
3f6ef67e7a60 revert: ask user to confirm before tracking new file when interactive
Martin von Zweigbergk <martinvonz@google.com>
parents: 49096
diff changeset
  3757
                _(b"add new file %s (Yn)?$$ &Yes $$ &No") % uipathfn(f)
3f6ef67e7a60 revert: ask user to confirm before tracking new file when interactive
Martin von Zweigbergk <martinvonz@google.com>
parents: 49096
diff changeset
  3758
            )
3f6ef67e7a60 revert: ask user to confirm before tracking new file when interactive
Martin von Zweigbergk <martinvonz@google.com>
parents: 49096
diff changeset
  3759
            if choice != 0:
3f6ef67e7a60 revert: ask user to confirm before tracking new file when interactive
Martin von Zweigbergk <martinvonz@google.com>
parents: 49096
diff changeset
  3760
                continue
49096
9be7da341885 revert: use a `continue` to reduce indentation
Martin von Zweigbergk <martinvonz@google.com>
parents: 49059
diff changeset
  3761
        prntstatusmsg(b'add', f)
9be7da341885 revert: use a `continue` to reduce indentation
Martin von Zweigbergk <martinvonz@google.com>
parents: 49059
diff changeset
  3762
        checkout(f)
9be7da341885 revert: use a `continue` to reduce indentation
Martin von Zweigbergk <martinvonz@google.com>
parents: 49059
diff changeset
  3763
        repo.dirstate.set_tracked(f)
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3764
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3765
    for f in actions[b'undelete'][0]:
41536
d783c937aa53 revert: add prompt before undeleting a file in -i (issue6008)
Taapas Agrawal <taapas2897@gmail.com>
parents: 41396
diff changeset
  3766
        if interactive:
d783c937aa53 revert: add prompt before undeleting a file in -i (issue6008)
Taapas Agrawal <taapas2897@gmail.com>
parents: 41396
diff changeset
  3767
            choice = repo.ui.promptchoice(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3768
                _(b"add back removed file %s (Yn)?$$ &Yes $$ &No") % f
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3769
            )
41536
d783c937aa53 revert: add prompt before undeleting a file in -i (issue6008)
Taapas Agrawal <taapas2897@gmail.com>
parents: 41396
diff changeset
  3770
            if choice == 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3771
                prntstatusmsg(b'undelete', f)
41536
d783c937aa53 revert: add prompt before undeleting a file in -i (issue6008)
Taapas Agrawal <taapas2897@gmail.com>
parents: 41396
diff changeset
  3772
                checkout(f)
d783c937aa53 revert: add prompt before undeleting a file in -i (issue6008)
Taapas Agrawal <taapas2897@gmail.com>
parents: 41396
diff changeset
  3773
                normal(f)
d783c937aa53 revert: add prompt before undeleting a file in -i (issue6008)
Taapas Agrawal <taapas2897@gmail.com>
parents: 41396
diff changeset
  3774
            else:
d783c937aa53 revert: add prompt before undeleting a file in -i (issue6008)
Taapas Agrawal <taapas2897@gmail.com>
parents: 41396
diff changeset
  3775
                excluded_files.append(f)
d783c937aa53 revert: add prompt before undeleting a file in -i (issue6008)
Taapas Agrawal <taapas2897@gmail.com>
parents: 41396
diff changeset
  3776
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3777
            prntstatusmsg(b'undelete', f)
41536
d783c937aa53 revert: add prompt before undeleting a file in -i (issue6008)
Taapas Agrawal <taapas2897@gmail.com>
parents: 41396
diff changeset
  3778
            checkout(f)
d783c937aa53 revert: add prompt before undeleting a file in -i (issue6008)
Taapas Agrawal <taapas2897@gmail.com>
parents: 41396
diff changeset
  3779
            normal(f)
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3780
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3781
    copied = copies.pathcopies(repo[parent], ctx)
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3782
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3783
    for f in (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3784
        actions[b'add'][0] + actions[b'undelete'][0] + actions[b'revert'][0]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3785
    ):
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3786
        if f in copied:
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3787
            repo.dirstate.copy(copied[f], f)
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
  3788
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3789
21051
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21047
diff changeset
  3790
# a list of (ui, repo, otherpeer, opts, missing) functions called by
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21047
diff changeset
  3791
# commands.outgoing.  "missing" is "missing" of the result of
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21047
diff changeset
  3792
# "findcommonoutgoing()"
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21047
diff changeset
  3793
outgoinghooks = util.hooks()
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21047
diff changeset
  3794
19211
3bfd7f1e7485 summary: augment output with info from extensions
Bryan O'Sullivan <bryano@fb.com>
parents: 19129
diff changeset
  3795
# a list of (ui, repo) functions called by commands.summary
3bfd7f1e7485 summary: augment output with info from extensions
Bryan O'Sullivan <bryano@fb.com>
parents: 19129
diff changeset
  3796
summaryhooks = util.hooks()
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
  3797
21047
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
  3798
# a list of (ui, repo, opts, changes) functions called by commands.summary.
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
  3799
#
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
  3800
# functions should return tuple of booleans below, if 'changes' is None:
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
  3801
#  (whether-incomings-are-needed, whether-outgoings-are-needed)
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
  3802
#
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
  3803
# otherwise, 'changes' is a tuple of tuples below:
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
  3804
#  - (sourceurl, sourcebranch, sourcepeer, incoming)
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
  3805
#  - (desturl,   destbranch,   destpeer,   outgoing)
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
  3806
summaryremotehooks = util.hooks()
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
  3807
42537
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42536
diff changeset
  3808
42539
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42538
diff changeset
  3809
def checkunfinished(repo, commit=False, skipmerge=False):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3810
    """Look for an unfinished multistep operation, like graft, and abort
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
  3811
    if found. It's probably good to check this right before
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
  3812
    bailifchanged().
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3813
    """
37855
79c54e7c0c52 rebase: prioritize indicating an interrupted rebase over update (issue5838)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37815
diff changeset
  3814
    # Check for non-clearable states first, so things like rebase will take
79c54e7c0c52 rebase: prioritize indicating an interrupted rebase over update (issue5838)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37815
diff changeset
  3815
    # precedence over update.
42537
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42536
diff changeset
  3816
    for state in statemod._unfinishedstates:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3817
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3818
            state._clearable
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3819
            or (commit and state._allowcommit)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3820
            or state._reportonly
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3821
        ):
37855
79c54e7c0c52 rebase: prioritize indicating an interrupted rebase over update (issue5838)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37815
diff changeset
  3822
            continue
42537
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42536
diff changeset
  3823
        if state.isunfinished(repo):
45859
527ce85c2e60 errors: introduce StateError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45846
diff changeset
  3824
            raise error.StateError(state.msg(), hint=state.hint())
42537
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42536
diff changeset
  3825
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42536
diff changeset
  3826
    for s in statemod._unfinishedstates:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3827
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3828
            not s._clearable
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3829
            or (commit and s._allowcommit)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3830
            or (s._opname == b'merge' and skipmerge)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3831
            or s._reportonly
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3832
        ):
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19482
diff changeset
  3833
            continue
42537
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42536
diff changeset
  3834
        if s.isunfinished(repo):
45859
527ce85c2e60 errors: introduce StateError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45846
diff changeset
  3835
            raise error.StateError(s.msg(), hint=s.hint())
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
  3836
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3837
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
  3838
def clearunfinished(repo):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3839
    """Check for unfinished operations (as above), and clear the ones
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
  3840
    that are clearable.
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3841
    """
42537
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42536
diff changeset
  3842
    for state in statemod._unfinishedstates:
42539
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42538
diff changeset
  3843
        if state._reportonly:
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42538
diff changeset
  3844
            continue
42537
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42536
diff changeset
  3845
        if not state._clearable and state.isunfinished(repo):
45859
527ce85c2e60 errors: introduce StateError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45846
diff changeset
  3846
            raise error.StateError(state.msg(), hint=state.hint())
42537
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42536
diff changeset
  3847
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42536
diff changeset
  3848
    for s in statemod._unfinishedstates:
46969
d9531094cf8e cmdutil: fix an uninitialize variable usage in clearunfinished()
Matt Harbison <matt_harbison@yahoo.com>
parents: 46842
diff changeset
  3849
        if s._opname == b'merge' or s._reportonly:
42539
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42538
diff changeset
  3850
            continue
42537
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42536
diff changeset
  3851
        if s._clearable and s.isunfinished(repo):
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42536
diff changeset
  3852
            util.unlink(repo.vfs.join(s._fname))
24991
4169a4f83548 cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24988
diff changeset
  3853
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3854
42579
b8d54f4625cb merge: disallow merge abort in case of an unfinished operation (issue6160)
Taapas Agrawal <taapas2897@gmail.com>
parents: 42577
diff changeset
  3855
def getunfinishedstate(repo):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3856
    """Checks for unfinished operations and returns statecheck object
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3857
    for it"""
42579
b8d54f4625cb merge: disallow merge abort in case of an unfinished operation (issue6160)
Taapas Agrawal <taapas2897@gmail.com>
parents: 42577
diff changeset
  3858
    for state in statemod._unfinishedstates:
b8d54f4625cb merge: disallow merge abort in case of an unfinished operation (issue6160)
Taapas Agrawal <taapas2897@gmail.com>
parents: 42577
diff changeset
  3859
        if state.isunfinished(repo):
b8d54f4625cb merge: disallow merge abort in case of an unfinished operation (issue6160)
Taapas Agrawal <taapas2897@gmail.com>
parents: 42577
diff changeset
  3860
            return state
b8d54f4625cb merge: disallow merge abort in case of an unfinished operation (issue6160)
Taapas Agrawal <taapas2897@gmail.com>
parents: 42577
diff changeset
  3861
    return None
b8d54f4625cb merge: disallow merge abort in case of an unfinished operation (issue6160)
Taapas Agrawal <taapas2897@gmail.com>
parents: 42577
diff changeset
  3862
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3863
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3864
def howtocontinue(repo):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3865
    """Check for an unfinished operation and return the command to finish
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3866
    it.
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3867
42577
ceb31d96d3ae statecheck: updated docstrings related to afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42568
diff changeset
  3868
    statemod._unfinishedstates list is checked for an unfinished operation
ceb31d96d3ae statecheck: updated docstrings related to afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42568
diff changeset
  3869
    and the corresponding message to finish it is generated if a method to
ceb31d96d3ae statecheck: updated docstrings related to afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42568
diff changeset
  3870
    continue is supported by the operation.
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3871
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3872
    Returns a (msg, warning) tuple. 'msg' is a string and 'warning' is
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3873
    a boolean.
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3874
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3875
    contmsg = _(b"continue: %s")
42540
0231032729c4 statecheck: added support for cmdutil.afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42539
diff changeset
  3876
    for state in statemod._unfinishedstates:
0231032729c4 statecheck: added support for cmdutil.afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42539
diff changeset
  3877
        if not state._continueflag:
0231032729c4 statecheck: added support for cmdutil.afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42539
diff changeset
  3878
            continue
0231032729c4 statecheck: added support for cmdutil.afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42539
diff changeset
  3879
        if state.isunfinished(repo):
0231032729c4 statecheck: added support for cmdutil.afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42539
diff changeset
  3880
            return contmsg % state.continuemsg(), True
33362
e48fb90f80c8 cmdutil: simplify the dirty check in howtocontinue()
Matt Harbison <matt_harbison@yahoo.com>
parents: 33334
diff changeset
  3881
    if repo[None].dirty(missing=True, merge=False, branch=False):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3882
        return contmsg % _(b"hg commit"), False
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3883
    return None, None
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3884
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3885
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3886
def checkafterresolved(repo):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3887
    """Inform the user about the next action after completing hg resolve
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3888
42577
ceb31d96d3ae statecheck: updated docstrings related to afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42568
diff changeset
  3889
    If there's a an unfinished operation that supports continue flag,
ceb31d96d3ae statecheck: updated docstrings related to afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42568
diff changeset
  3890
    howtocontinue will yield repo.ui.warn as the reporter.
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3891
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3892
    Otherwise, it will yield repo.ui.note.
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3893
    """
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3894
    msg, warning = howtocontinue(repo)
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3895
    if msg is not None:
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3896
        if warning:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3897
            repo.ui.warn(b"%s\n" % msg)
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3898
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3899
            repo.ui.note(b"%s\n" % msg)
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3900
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3901
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3902
def wrongtooltocontinue(repo, task):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3903
    """Raise an abort suggesting how to properly continue if there is an
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3904
    active task.
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3905
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3906
    Uses howtocontinue() to find the active task.
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3907
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3908
    If there's no task (repo.ui.note for 'hg commit'), it does not offer
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3909
    a hint.
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45865
diff changeset
  3910
    """
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3911
    after = howtocontinue(repo)
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3912
    hint = None
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3913
    if after[1]:
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
  3914
        hint = after[0]
45859
527ce85c2e60 errors: introduce StateError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45846
diff changeset
  3915
    raise error.StateError(_(b'no %s in progress') % task, hint=hint)
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3916
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3917
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3918
def abortgraft(ui, repo, graftstate):
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3919
    """abort the interrupted graft and rollbacks to the state before interrupted
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3920
    graft"""
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3921
    if not graftstate.exists():
45859
527ce85c2e60 errors: introduce StateError and use it from commands and cmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45846
diff changeset
  3922
        raise error.StateError(_(b"no interrupted graft to abort"))
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3923
    statedata = readgraftstate(repo, graftstate)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3924
    newnodes = statedata.get(b'newnodes')
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3925
    if newnodes is None:
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3926
        # and old graft state which does not have all the data required to abort
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3927
        # the graft
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3928
        raise error.Abort(_(b"cannot abort using an old graftstate"))
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3929
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3930
    # changeset from which graft operation was started
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3931
    if len(newnodes) > 0:
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3932
        startctx = repo[newnodes[0]].p1()
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3933
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3934
        startctx = repo[b'.']
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3935
    # whether to strip or not
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3936
    cleanup = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3937
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3938
    if newnodes:
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3939
        newnodes = [repo[r].rev() for r in newnodes]
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3940
        cleanup = True
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3941
        # checking that none of the newnodes turned public or is public
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3942
        immutable = [c for c in newnodes if not repo[c].mutable()]
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3943
        if immutable:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3944
            repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3945
                _(b"cannot clean up public changesets %s\n")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3946
                % b', '.join(bytes(repo[r]) for r in immutable),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3947
                hint=_(b"see 'hg help phases' for details"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3948
            )
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3949
            cleanup = False
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3950
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3951
        # checking that no new nodes are created on top of grafted revs
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3952
        desc = set(repo.changelog.descendants(newnodes))
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3953
        if desc - set(newnodes):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3954
            repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3955
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3956
                    b"new changesets detected on destination "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3957
                    b"branch, can't strip\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3958
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3959
            )
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3960
            cleanup = False
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3961
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3962
        if cleanup:
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3963
            with repo.wlock(), repo.lock():
45562
03726f5b6092 merge: use merge.clean_update() when applicable
Martin von Zweigbergk <martinvonz@google.com>
parents: 45558
diff changeset
  3964
                mergemod.clean_update(startctx)
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3965
                # stripping the new nodes created
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3966
                strippoints = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3967
                    c.node() for c in repo.set(b"roots(%ld)", newnodes)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3968
                ]
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3969
                repair.strip(repo.ui, repo, strippoints, backup=False)
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3970
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3971
    if not cleanup:
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3972
        # we don't update to the startnode if we can't strip
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3973
        startctx = repo[b'.']
45562
03726f5b6092 merge: use merge.clean_update() when applicable
Martin von Zweigbergk <martinvonz@google.com>
parents: 45558
diff changeset
  3974
        mergemod.clean_update(startctx)
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3975
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3976
    ui.status(_(b"graft aborted\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3977
    ui.status(_(b"working directory is now at %s\n") % startctx.hex()[:12])
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3978
    graftstate.delete()
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3979
    return 0
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3980
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3981
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3982
def readgraftstate(repo, graftstate):
43740
a58d2361b231 cmdutil: add a pytype annotation to help out some callsites
Augie Fackler <augie@google.com>
parents: 43738
diff changeset
  3983
    # type: (Any, statemod.cmdstate) -> Dict[bytes, Any]
42568
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3984
    """read the graft state file and return a dict of the data stored in it"""
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3985
    try:
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3986
        return graftstate.read()
f9da9d5f3f5a graft: moved abortgraft and readgraft to cmdutil
Taapas Agrawal <taapas2897@gmail.com>
parents: 42540
diff changeset
  3987
    except error.CorruptedState:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3988
        nodes = repo.vfs.read(b'graftstate').splitlines()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3989
        return {b'nodes': nodes}
42582
5171937ad0f9 abort: added support for graft
Taapas Agrawal <taapas2897@gmail.com>
parents: 42579
diff changeset
  3990
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42937
diff changeset
  3991
42582
5171937ad0f9 abort: added support for graft
Taapas Agrawal <taapas2897@gmail.com>
parents: 42579
diff changeset
  3992
def hgabortgraft(ui, repo):
47031
f38bf44e077f black: make codebase compatible with black v21.4b2 and v20.8b1
Kyle Lippincott <spectral@google.com>
parents: 46969
diff changeset
  3993
    """abort logic for aborting graft using 'hg abort'"""
42582
5171937ad0f9 abort: added support for graft
Taapas Agrawal <taapas2897@gmail.com>
parents: 42579
diff changeset
  3994
    with repo.wlock():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3995
        graftstate = statemod.cmdstate(repo, b'graftstate')
42582
5171937ad0f9 abort: added support for graft
Taapas Agrawal <taapas2897@gmail.com>
parents: 42579
diff changeset
  3996
        return abortgraft(ui, repo, graftstate)