mercurial/merge.py
author Matt Harbison <matt_harbison@yahoo.com>
Sun, 05 Jan 2025 22:26:16 -0500
changeset 52644 e627cc25b6f3
parent 52186 e6a44bc91bc2
child 52692 45dc0f874b8c
permissions -rw-r--r--
pyupgrade: rewrite `yield` statements in a loop to `yield from` This is the `legacy` fixer in `pyupgrade`, with the `yield` statement yielding loop commented back in. This seems to help pytype in some cases, and hurt it in others. But that can be manually fixed later. Note that it's possibly buggy in that it aggressively changed `import-checker.py` to `yield from 'fcntl', 'grp', 'pwd', 'select', 'termios': # Unix only`, which is invalid syntax. Possibly it needed help from the token fixer that I've disabled locally (because that wants to make a bunch of unrelated changes). Just change those few places to yield from a list, to avoid having to constantly revert that.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     1
# merge.py - directory-level update/merge handling for Mercurial
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     2
#
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46811
diff changeset
     3
# Copyright 2006, 2007 Olivia Mackall <olivia@selenic.com>
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8152
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: 9783
diff changeset
     6
# GNU General Public License version 2 or any later version.
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     7
51859
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51830
diff changeset
     8
from __future__ import annotations
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
     9
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
    10
import collections
52056
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
    11
import os
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    12
import struct
51725
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    13
import typing
52054
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
    14
from typing import Dict, Optional, Tuple
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    15
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    16
from .i18n import _
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
    17
from .node import nullrev
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    18
from .thirdparty import attr
51725
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    19
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    20
# Force pytype to use the non-vendored package
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    21
if typing.TYPE_CHECKING:
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    22
    # noinspection PyPackageRequirements
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    23
    import attr
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    24
46692
39f23d20ea47 merge: force an exception message to bytes before printing as a warning
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
    25
from .utils import stringutil
48260
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 47609
diff changeset
    26
from .dirstateutils import timestamp
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    27
from . import (
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    28
    copies,
39818
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39464
diff changeset
    29
    encoding,
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26570
diff changeset
    30
    error,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    31
    filemerge,
31257
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31175
diff changeset
    32
    match as matchmod,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
    33
    mergestate as mergestatemod,
33146
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33095
diff changeset
    34
    obsutil,
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
    35
    pathutil,
48805
d4486810a179 merge: remove direct rustmod reference
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48757
diff changeset
    36
    policy,
30519
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30486
diff changeset
    37
    pycompat,
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
    38
    scmutil,
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
    39
    subrepoutil,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    40
    util,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    41
    worker,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    42
)
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
    43
52056
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
    44
rust_update_mod = policy.importrust("update")
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
    45
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    46
_pack = struct.pack
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    47
_unpack = struct.unpack
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    48
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    49
27740
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
    50
def _getcheckunknownconfig(repo, section, name):
34522
bed1d2eaa108 configitems: register 'merge.checkunknown' and 'merge.checkignored'
Boris Feld <boris.feld@octobus.net>
parents: 34486
diff changeset
    51
    config = repo.ui.config(section, name)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    52
    valid = [b'abort', b'ignore', b'warn']
27740
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
    53
    if config not in valid:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    54
        validstr = b', '.join([b"'" + v + b"'" for v in valid])
48698
937998e43e93 merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48590
diff changeset
    55
        msg = _(b"%s.%s not valid ('%s' is none of %s)")
937998e43e93 merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48590
diff changeset
    56
        msg %= (section, name, config, validstr)
937998e43e93 merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48590
diff changeset
    57
        raise error.ConfigError(msg)
27740
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
    58
    return config
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
    59
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    60
49910
7b474609f199 merge: avoid dereferencing repo fields repeatedly
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49909
diff changeset
    61
def _checkunknownfile(dirstate, wvfs, dircache, wctx, mctx, f, f2=None):
35288
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    62
    if wctx.isinmemory():
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    63
        # Nothing to do in IMM because nothing in the "working copy" can be an
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    64
        # unknown file.
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    65
        #
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    66
        # Note that we should bail out here, not in ``_checkunknownfiles()``,
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    67
        # because that function does other useful work.
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    68
        return False
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    69
23653
0297d8469350 merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents: 23652
diff changeset
    70
    if f2 is None:
0297d8469350 merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents: 23652
diff changeset
    71
        f2 = f
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    72
    return (
49910
7b474609f199 merge: avoid dereferencing repo fields repeatedly
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49909
diff changeset
    73
        wvfs.isfileorlink_checkdir(dircache, f)
7b474609f199 merge: avoid dereferencing repo fields repeatedly
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49909
diff changeset
    74
        and dirstate.normalize(f) not in dirstate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    75
        and mctx[f2].cmp(wctx[f])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    76
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    77
16093
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16092
diff changeset
    78
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48927
diff changeset
    79
class _unknowndirschecker:
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    80
    """
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    81
    Look for any unknown files or directories that may have a path conflict
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    82
    with a file.  If any path prefix of the file exists as a file or link,
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    83
    then it conflicts.  If the file itself is a directory that contains any
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    84
    file that is not tracked, then it conflicts.
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    85
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    86
    Returns the shortest path at which a conflict occurs, or None if there is
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    87
    no conflict.
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    88
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    89
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    90
    def __init__(self):
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    91
        # A set of paths known to be good.  This prevents repeated checking of
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    92
        # dirs.  It will be updated with any new dirs that are checked and found
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    93
        # to be safe.
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    94
        self._unknowndircache = set()
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    95
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    96
        # A set of paths that are known to be absent.  This prevents repeated
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    97
        # checking of subdirectories that are known not to exist. It will be
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    98
        # updated with any new dirs that are checked and found to be absent.
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    99
        self._missingdircache = set()
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
   100
35288
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
   101
    def __call__(self, repo, wctx, f):
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
   102
        if wctx.isinmemory():
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
   103
            # Nothing to do in IMM for the same reason as ``_checkunknownfile``.
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
   104
            return False
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
   105
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   106
        # Check for path prefixes that exist as unknown files.
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
   107
        for p in reversed(list(pathutil.finddirs(f))):
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   108
            if p in self._missingdircache:
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   109
                return
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   110
            if p in self._unknowndircache:
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   111
                continue
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   112
            if repo.wvfs.audit.check(p):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   113
                if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   114
                    repo.wvfs.isfileorlink(p)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   115
                    and repo.dirstate.normalize(p) not in repo.dirstate
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   116
                ):
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   117
                    return p
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   118
                if not repo.wvfs.lexists(p):
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   119
                    self._missingdircache.add(p)
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   120
                    return
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   121
                self._unknowndircache.add(p)
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   122
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   123
        # Check if the file conflicts with a directory containing unknown files.
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   124
        if repo.wvfs.audit.check(f) and repo.wvfs.isdir(f):
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   125
            # Does the directory contain any files that are not in the dirstate?
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   126
            for p, dirs, files in repo.wvfs.walk(f):
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   127
                for fn in files:
37086
658b1d28813c merge: pconvert paths in _unknowndirschecker before dirstate-normalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 36537
diff changeset
   128
                    relf = util.pconvert(repo.wvfs.reljoin(p, fn))
37087
e4640ec346ac merge: add 'isknown=True' to a dirstate.normalize() in _unknowndirschecker
Matt Harbison <matt_harbison@yahoo.com>
parents: 37086
diff changeset
   129
                    relf = repo.dirstate.normalize(relf, isknown=True)
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   130
                    if relf not in repo.dirstate:
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   131
                        return f
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   132
        return None
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
   133
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   134
45287
4ad6c4e9e35f merge: pass mergeresult instead of actions in _checkunknownfiles() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45286
diff changeset
   135
def _checkunknownfiles(repo, wctx, mctx, force, mresult, mergeforce):
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   136
    """
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   137
    Considers any actions that care about the presence of conflicting unknown
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   138
    files. For some actions, the result is to abort; for others, it is to
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   139
    choose a different action.
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   140
    """
34551
1609a5afc4f5 merge: rename conflicts to fileconflicts in _checkunknownfiles
Mark Thomas <mbthomas@fb.com>
parents: 34550
diff changeset
   141
    fileconflicts = set()
34552
33c8a6837181 merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34551
diff changeset
   142
    pathconflicts = set()
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   143
    warnconflicts = set()
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   144
    abortconflicts = set()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   145
    unknownconfig = _getcheckunknownconfig(repo, b'merge', b'checkunknown')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   146
    ignoredconfig = _getcheckunknownconfig(repo, b'merge', b'checkignored')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   147
    pathconfig = repo.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   148
        b'experimental', b'merge.checkpathconflicts'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   149
    )
49909
b7cf91ef03ba merge: skip syntactic path checks in [_checkunknownfile]
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49892
diff changeset
   150
    dircache = dict()
49910
7b474609f199 merge: avoid dereferencing repo fields repeatedly
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49909
diff changeset
   151
    dirstate = repo.dirstate
7b474609f199 merge: avoid dereferencing repo fields repeatedly
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49909
diff changeset
   152
    wvfs = repo.wvfs
52056
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
   153
    # wouldn't it be easier to loop over unknown files (and dirs)?
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
   154
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   155
    if not force:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   156
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   157
        def collectconflicts(conflicts, config):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   158
            if config == b'abort':
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   159
                abortconflicts.update(conflicts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   160
            elif config == b'warn':
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   161
                warnconflicts.update(conflicts)
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   162
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   163
        checkunknowndirs = _unknowndirschecker()
49909
b7cf91ef03ba merge: skip syntactic path checks in [_checkunknownfile]
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49892
diff changeset
   164
        for f in mresult.files(
b7cf91ef03ba merge: skip syntactic path checks in [_checkunknownfile]
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49892
diff changeset
   165
            (
b7cf91ef03ba merge: skip syntactic path checks in [_checkunknownfile]
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49892
diff changeset
   166
                mergestatemod.ACTION_CREATED,
b7cf91ef03ba merge: skip syntactic path checks in [_checkunknownfile]
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49892
diff changeset
   167
                mergestatemod.ACTION_DELETED_CHANGED,
b7cf91ef03ba merge: skip syntactic path checks in [_checkunknownfile]
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49892
diff changeset
   168
            )
b7cf91ef03ba merge: skip syntactic path checks in [_checkunknownfile]
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49892
diff changeset
   169
        ):
49910
7b474609f199 merge: avoid dereferencing repo fields repeatedly
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49909
diff changeset
   170
            if _checkunknownfile(dirstate, wvfs, dircache, wctx, mctx, f):
49909
b7cf91ef03ba merge: skip syntactic path checks in [_checkunknownfile]
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49892
diff changeset
   171
                fileconflicts.add(f)
b7cf91ef03ba merge: skip syntactic path checks in [_checkunknownfile]
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49892
diff changeset
   172
            elif pathconfig and f not in wctx:
b7cf91ef03ba merge: skip syntactic path checks in [_checkunknownfile]
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49892
diff changeset
   173
                path = checkunknowndirs(repo, wctx, f)
b7cf91ef03ba merge: skip syntactic path checks in [_checkunknownfile]
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49892
diff changeset
   174
                if path is not None:
b7cf91ef03ba merge: skip syntactic path checks in [_checkunknownfile]
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49892
diff changeset
   175
                    pathconflicts.add(path)
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   176
        for f, args, msg in mresult.getactions(
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   177
            [mergestatemod.ACTION_LOCAL_DIR_RENAME_GET]
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   178
        ):
49910
7b474609f199 merge: avoid dereferencing repo fields repeatedly
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49909
diff changeset
   179
            if _checkunknownfile(
7b474609f199 merge: avoid dereferencing repo fields repeatedly
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49909
diff changeset
   180
                dirstate, wvfs, dircache, wctx, mctx, f, args[0]
7b474609f199 merge: avoid dereferencing repo fields repeatedly
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49909
diff changeset
   181
            ):
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   182
                fileconflicts.add(f)
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   183
34552
33c8a6837181 merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34551
diff changeset
   184
        allconflicts = fileconflicts | pathconflicts
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   185
        ignoredconflicts = {c for c in allconflicts if repo.dirstate._ignore(c)}
34551
1609a5afc4f5 merge: rename conflicts to fileconflicts in _checkunknownfiles
Mark Thomas <mbthomas@fb.com>
parents: 34550
diff changeset
   186
        unknownconflicts = allconflicts - ignoredconflicts
27742
6b639caa1652 merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents: 27741
diff changeset
   187
        collectconflicts(ignoredconflicts, ignoredconfig)
6b639caa1652 merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents: 27741
diff changeset
   188
        collectconflicts(unknownconflicts, unknownconfig)
28022
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   189
    else:
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
   190
        for f, args, msg in list(
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
   191
            mresult.getactions([mergestatemod.ACTION_CREATED_MERGE])
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   192
        ):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   193
            fl2, anc = args
49910
7b474609f199 merge: avoid dereferencing repo fields repeatedly
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49909
diff changeset
   194
            different = _checkunknownfile(
7b474609f199 merge: avoid dereferencing repo fields repeatedly
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49909
diff changeset
   195
                dirstate, wvfs, dircache, wctx, mctx, f
7b474609f199 merge: avoid dereferencing repo fields repeatedly
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49909
diff changeset
   196
            )
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   197
            if repo.dirstate._ignore(f):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   198
                config = ignoredconfig
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   199
            else:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   200
                config = unknownconfig
28022
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   201
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   202
            # The behavior when force is True is described by this table:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   203
            #  config  different  mergeforce  |    action    backup
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   204
            #    *         n          *       |      get        n
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   205
            #    *         y          y       |     merge       -
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   206
            #   abort      y          n       |     merge       -   (1)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   207
            #   warn       y          n       |  warn + get     y
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   208
            #  ignore      y          n       |      get        y
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   209
            #
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   210
            # (1) this is probably the wrong behavior here -- we should
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   211
            #     probably abort, but some actions like rebases currently
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   212
            #     don't like an abort happening in the middle of
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   213
            #     merge.update.
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   214
            if not different:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   215
                mresult.addfile(
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   216
                    f,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   217
                    mergestatemod.ACTION_GET,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   218
                    (fl2, False),
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   219
                    b'remote created',
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   220
                )
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   221
            elif mergeforce or config == b'abort':
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   222
                mresult.addfile(
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   223
                    f,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   224
                    mergestatemod.ACTION_MERGE,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   225
                    (f, f, None, False, anc),
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   226
                    b'remote differs from untracked local',
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   227
                )
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   228
            elif config == b'abort':
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   229
                abortconflicts.add(f)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   230
            else:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   231
                if config == b'warn':
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   232
                    warnconflicts.add(f)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   233
                mresult.addfile(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   234
                    f,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   235
                    mergestatemod.ACTION_GET,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   236
                    (fl2, True),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   237
                    b'remote created',
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   238
                )
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   239
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   240
    for f in sorted(abortconflicts):
34553
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
   241
        warn = repo.ui.warn
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
   242
        if f in pathconflicts:
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
   243
            if repo.wvfs.isfileorlink(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   244
                warn(_(b"%s: untracked file conflicts with directory\n") % f)
34553
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
   245
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   246
                warn(_(b"%s: untracked directory conflicts with file\n") % f)
34553
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
   247
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   248
            warn(_(b"%s: untracked file differs\n") % f)
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   249
    if abortconflicts:
46418
dc00324e80f4 errors: use StateError more in merge module
Martin von Zweigbergk <martinvonz@google.com>
parents: 46367
diff changeset
   250
        raise error.StateError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   251
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   252
                b"untracked files in working directory "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   253
                b"differ from files in requested revision"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   254
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   255
        )
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   256
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   257
    for f in sorted(warnconflicts):
34553
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
   258
        if repo.wvfs.isfileorlink(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   259
            repo.ui.warn(_(b"%s: replacing untracked file\n") % f)
34553
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
   260
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   261
            repo.ui.warn(_(b"%s: replacing untracked files in directory\n") % f)
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   262
49911
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   263
    def transformargs(f, args):
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   264
        backup = (
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   265
            f in fileconflicts
49889
3aa8e569478a merge: don't pay for pathconflicts if there are none
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49886
diff changeset
   266
            or pathconflicts
3aa8e569478a merge: don't pay for pathconflicts if there are none
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49886
diff changeset
   267
            and (
3aa8e569478a merge: don't pay for pathconflicts if there are none
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49886
diff changeset
   268
                f in pathconflicts
3aa8e569478a merge: don't pay for pathconflicts if there are none
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49886
diff changeset
   269
                or any(p in pathconflicts for p in pathutil.finddirs(f))
3aa8e569478a merge: don't pay for pathconflicts if there are none
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49886
diff changeset
   270
            )
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   271
        )
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   272
        (flags,) = args
49911
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   273
        return (flags, backup)
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   274
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   275
    mresult.mapaction(
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   276
        mergestatemod.ACTION_CREATED, mergestatemod.ACTION_GET, transformargs
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   277
    )
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   278
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   279
45347
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45346
diff changeset
   280
def _forgetremoved(wctx, mctx, branchmerge, mresult):
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   281
    """
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   282
    Forget removed files
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   283
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   284
    If we're jumping between revisions (as opposed to merging), and if
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   285
    neither the working directory nor the target rev has the file,
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   286
    then we need to remove it from the dirstate, to prevent the
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   287
    dirstate from listing the file when it is no longer in the
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   288
    manifest.
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   289
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   290
    If we're merging, and the other revision has removed a file
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   291
    that is not present in the working directory, we need to mark it
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   292
    as removed.
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   293
    """
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   294
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   295
    m = mergestatemod.ACTION_FORGET
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   296
    if branchmerge:
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   297
        m = mergestatemod.ACTION_REMOVE
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   298
    for f in wctx.deleted():
6272
dd9bd227ae9a merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents: 6271
diff changeset
   299
        if f not in mctx:
45347
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45346
diff changeset
   300
            mresult.addfile(f, m, None, b"forget deleted")
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   301
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   302
    if not branchmerge:
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   303
        for f in wctx.removed():
6272
dd9bd227ae9a merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents: 6271
diff changeset
   304
            if f not in mctx:
45347
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45346
diff changeset
   305
                mresult.addfile(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   306
                    f,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   307
                    mergestatemod.ACTION_FORGET,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   308
                    None,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   309
                    b"forget removed",
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   310
                )
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   311
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   312
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   313
def _checkcollision(repo, wmf, mresult):
38045
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38044
diff changeset
   314
    """
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38044
diff changeset
   315
    Check for case-folding collisions.
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38044
diff changeset
   316
    """
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38044
diff changeset
   317
    # If the repo is narrowed, filter out files outside the narrowspec.
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38044
diff changeset
   318
    narrowmatch = repo.narrowmatch()
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38044
diff changeset
   319
    if not narrowmatch.always():
44287
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44271
diff changeset
   320
        pmmf = set(wmf.walk(narrowmatch))
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   321
        if mresult:
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   322
            for f in list(mresult.files()):
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   323
                if not narrowmatch(f):
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   324
                    mresult.removefile(f)
44287
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44271
diff changeset
   325
    else:
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44271
diff changeset
   326
        # build provisional merged manifest up
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44271
diff changeset
   327
        pmmf = set(wmf)
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   328
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   329
    if mresult:
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
   330
        # KEEP and EXEC are no-op
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   331
        for f in mresult.files(
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   332
            (
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   333
                mergestatemod.ACTION_ADD,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   334
                mergestatemod.ACTION_ADD_MODIFIED,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   335
                mergestatemod.ACTION_FORGET,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   336
                mergestatemod.ACTION_GET,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   337
                mergestatemod.ACTION_CHANGED_DELETED,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   338
                mergestatemod.ACTION_DELETED_CHANGED,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   339
            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   340
        ):
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   341
            pmmf.add(f)
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   342
        for f in mresult.files((mergestatemod.ACTION_REMOVE,)):
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   343
            pmmf.discard(f)
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   344
        for f, args, msg in mresult.getactions(
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   345
            [mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL]
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   346
        ):
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   347
            f2, flags = args
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   348
            pmmf.discard(f2)
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   349
            pmmf.add(f)
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   350
        for f in mresult.files((mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,)):
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   351
            pmmf.add(f)
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   352
        for f, args, msg in mresult.getactions([mergestatemod.ACTION_MERGE]):
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   353
            f1, f2, fa, move, anc = args
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   354
            if move:
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   355
                pmmf.discard(f1)
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   356
            pmmf.add(f)
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   357
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   358
    # check case-folding collision in provisional merged manifest
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   359
    foldmap = {}
33808
055fee3547df merge: removed sorting in casefolding detection, for a slight performance win
Alex Gaynor <agaynor@mozilla.com>
parents: 33499
diff changeset
   360
    for f in pmmf:
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   361
        fold = util.normcase(f)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   362
        if fold in foldmap:
48699
10407e8e3807 merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48698
diff changeset
   363
            msg = _(b"case-folding collision between %s and %s")
10407e8e3807 merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48698
diff changeset
   364
            msg %= (f, foldmap[fold])
10407e8e3807 merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48698
diff changeset
   365
            raise error.StateError(msg)
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   366
        foldmap[fold] = f
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   367
26661
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   368
    # check case-folding of directories
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   369
    foldprefix = unfoldprefix = lastfull = b''
26661
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   370
    for fold, f in sorted(foldmap.items()):
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   371
        if fold.startswith(foldprefix) and not f.startswith(unfoldprefix):
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   372
            # the folded prefix matches but actual casing is different
48700
d8577d00c023 merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48699
diff changeset
   373
            msg = _(b"case-folding collision between %s and directory of %s")
d8577d00c023 merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48699
diff changeset
   374
            msg %= (lastfull, f)
d8577d00c023 merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48699
diff changeset
   375
            raise error.StateError(msg)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   376
        foldprefix = fold + b'/'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   377
        unfoldprefix = f + b'/'
26661
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   378
        lastfull = f
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   379
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   380
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   381
def _filesindirs(repo, manifest, dirs):
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   382
    """
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   383
    Generator that yields pairs of all the files in the manifest that are found
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   384
    inside the directories listed in dirs, and which directory they are found
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   385
    in.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   386
    """
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   387
    for f in manifest:
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
   388
        for p in pathutil.finddirs(f):
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   389
            if p in dirs:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   390
                yield f, p
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   391
                break
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   392
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   393
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   394
def checkpathconflicts(repo, wctx, mctx, mresult):
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   395
    """
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   396
    Check if any actions introduce path conflicts in the repository, updating
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   397
    actions to record or handle the path conflict accordingly.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   398
    """
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   399
    mf = wctx.manifest()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   400
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   401
    # The set of local files that conflict with a remote directory.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   402
    localconflicts = set()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   403
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   404
    # The set of directories that conflict with a remote file, and so may cause
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   405
    # conflicts if they still contain any files after the merge.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   406
    remoteconflicts = set()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   407
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   408
    # The set of directories that appear as both a file and a directory in the
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   409
    # remote manifest.  These indicate an invalid remote manifest, which
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   410
    # can't be updated to cleanly.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   411
    invalidconflicts = set()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   412
35172
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   413
    # The set of directories that contain files that are being created.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   414
    createdfiledirs = set()
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   415
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   416
    # The set of files deleted by all the actions.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   417
    deletedfiles = set()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   418
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   419
    for f in mresult.files(
45342
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   420
        (
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   421
            mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   422
            mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   423
            mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   424
            mergestatemod.ACTION_CREATED_MERGE,
45342
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   425
        )
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   426
    ):
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   427
        # This action may create a new local file.
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   428
        createdfiledirs.update(pathutil.finddirs(f))
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   429
        if mf.hasdir(f):
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   430
            # The file aliases a local directory.  This might be ok if all
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   431
            # the files in the local directory are being deleted.  This
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   432
            # will be checked once we know what all the deleted files are.
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   433
            remoteconflicts.add(f)
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   434
    # Track the names of all deleted files.
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   435
    for f in mresult.files((mergestatemod.ACTION_REMOVE,)):
45342
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   436
        deletedfiles.add(f)
51699
ca7bde5dbafb black: format the codebase with 23.3.0
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51696
diff changeset
   437
    for f, args, msg in mresult.getactions((mergestatemod.ACTION_MERGE,)):
45342
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   438
        f1, f2, fa, move, anc = args
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   439
        if move:
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   440
            deletedfiles.add(f1)
51699
ca7bde5dbafb black: format the codebase with 23.3.0
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51696
diff changeset
   441
    for f, args, msg in mresult.getactions(
45342
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   442
        (mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,)
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   443
    ):
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   444
        f2, flags = args
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   445
        deletedfiles.add(f2)
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   446
35172
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   447
    # Check all directories that contain created files for path conflicts.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   448
    for p in createdfiledirs:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   449
        if p in mf:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   450
            if p in mctx:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   451
                # A file is in a directory which aliases both a local
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   452
                # and a remote file.  This is an internal inconsistency
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   453
                # within the remote manifest.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   454
                invalidconflicts.add(p)
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   455
            else:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   456
                # A file is in a directory which aliases a local file.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   457
                # We will need to rename the local file.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   458
                localconflicts.add(p)
45344
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   459
        pd = mresult.getfile(p)
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   460
        if pd and pd[0] in (
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   461
            mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   462
            mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   463
            mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   464
            mergestatemod.ACTION_CREATED_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   465
        ):
35172
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   466
            # The file is in a directory which aliases a remote file.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   467
            # This is an internal inconsistency within the remote
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   468
            # manifest.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   469
            invalidconflicts.add(p)
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   470
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   471
    # Rename all local conflicting files that have not been deleted.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   472
    for p in localconflicts:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   473
        if p not in deletedfiles:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   474
            ctxname = bytes(wctx).rstrip(b'+')
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   475
            pnew = util.safename(p, ctxname, wctx, set(mresult.files()))
44939
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44856
diff changeset
   476
            porig = wctx[p].copysource() or p
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   477
            mresult.addfile(
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   478
                pnew,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   479
                mergestatemod.ACTION_PATH_CONFLICT_RESOLVE,
44939
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44856
diff changeset
   480
                (p, porig),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   481
                b'local path conflict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   482
            )
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   483
            mresult.addfile(
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   484
                p,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   485
                mergestatemod.ACTION_PATH_CONFLICT,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   486
                (pnew, b'l'),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   487
                b'path conflict',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   488
            )
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   489
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   490
    if remoteconflicts:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   491
        # Check if all files in the conflicting directories have been removed.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   492
        ctxname = bytes(mctx).rstrip(b'+')
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   493
        for f, p in _filesindirs(repo, mf, remoteconflicts):
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   494
            if f not in deletedfiles:
45344
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   495
                m, args, msg = mresult.getfile(p)
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   496
                pnew = util.safename(p, ctxname, wctx, set(mresult.files()))
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   497
                if m in (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   498
                    mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   499
                    mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   500
                ):
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   501
                    # Action was merge, just update target.
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   502
                    mresult.addfile(pnew, m, args, msg)
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   503
                else:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   504
                    # Action was create, change to renamed get action.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   505
                    fl = args[0]
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   506
                    mresult.addfile(
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   507
                        pnew,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   508
                        mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   509
                        (p, fl),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   510
                        b'remote path conflict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   511
                    )
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   512
                mresult.addfile(
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   513
                    p,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   514
                    mergestatemod.ACTION_PATH_CONFLICT,
48708
25d5dffbb211 merge: stop using merge action for pathconflict option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48707
diff changeset
   515
                    (pnew, b'r'),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   516
                    b'path conflict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   517
                )
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   518
                remoteconflicts.remove(p)
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   519
                break
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   520
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   521
    if invalidconflicts:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   522
        for p in invalidconflicts:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   523
            repo.ui.warn(_(b"%s: is both a file and a directory\n") % p)
46418
dc00324e80f4 errors: use StateError more in merge module
Martin von Zweigbergk <martinvonz@google.com>
parents: 46367
diff changeset
   524
        raise error.StateError(
dc00324e80f4 errors: use StateError more in merge module
Martin von Zweigbergk <martinvonz@google.com>
parents: 46367
diff changeset
   525
            _(b"destination manifest contains path conflicts")
dc00324e80f4 errors: use StateError more in merge module
Martin von Zweigbergk <martinvonz@google.com>
parents: 46367
diff changeset
   526
        )
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   527
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   528
45285
e7196f1da2b1 merge: pass mergeresult obj instead of actions in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45284
diff changeset
   529
def _filternarrowactions(narrowmatch, branchmerge, mresult):
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   530
    """
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   531
    Filters out actions that can ignored because the repo is narrowed.
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   532
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   533
    Raise an exception if the merge cannot be completed because the repo is
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   534
    narrowed.
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   535
    """
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   536
    # We mutate the items in the dict during iteration, so iterate
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   537
    # over a copy.
51814
23116aefe786 merge: sort filemap only if requested by the caller
Manuel Jacob <me@manueljacob.de>
parents: 50260
diff changeset
   538
    for f, action in list(mresult.filemap()):
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   539
        if narrowmatch(f):
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   540
            pass
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   541
        elif not branchmerge:
45285
e7196f1da2b1 merge: pass mergeresult obj instead of actions in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45284
diff changeset
   542
            mresult.removefile(f)  # just updating, ignore changes outside clone
48713
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48711
diff changeset
   543
        elif action[0].no_op:
45285
e7196f1da2b1 merge: pass mergeresult obj instead of actions in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45284
diff changeset
   544
            mresult.removefile(f)  # merge does not affect file
48716
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   545
        elif action[0].narrow_safe:
48746
18e69f224e4b narrow: add support for merging add and remove outside of the tracked set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48716
diff changeset
   546
            if not f.endswith(b'/'):
48716
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   547
                mresult.removefile(f)  # merge won't affect on-disk files
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   548
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   549
                mresult.addcommitinfo(
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   550
                    f, b'outside-narrow-merge-action', action[0].changes
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   551
                )
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   552
            else:  # TODO: handle the tree case
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   553
                msg = _(
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   554
                    b'merge affects file \'%s\' outside narrow, '
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   555
                    b'which is not yet supported'
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   556
                )
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   557
                hint = _(b'merging in the other direction may work')
f1eb77dceb36 narrow: allow merging non-conflicting change outside of the narrow spec
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
   558
                raise error.Abort(msg % f, hint=hint)
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   559
        else:
48702
ec23b0ba85c2 merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48701
diff changeset
   560
            msg = _(b'conflict in file \'%s\' is outside narrow clone')
ec23b0ba85c2 merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48701
diff changeset
   561
            raise error.StateError(msg % f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   562
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   563
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48927
diff changeset
   564
class mergeresult:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   565
    """An object representing result of merging manifests.
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   566
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   567
    It has information about what actions need to be performed on dirstate
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   568
    mapping of divergent renames and other such cases."""
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   569
45281
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45280
diff changeset
   570
    def __init__(self):
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   571
        """
45291
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45290
diff changeset
   572
        filemapping: dict of filename as keys and action related info as values
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   573
        diverge: mapping of source name -> list of dest name for
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   574
                 divergent renames
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   575
        renamedelete: mapping of source name -> list of destinations for files
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   576
                      deleted on one side and renamed on other.
45275
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   577
        commitinfo: dict containing data which should be used on commit
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   578
                    contains a filename -> info mapping
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   579
        actionmapping: dict of action names as keys and values are dict of
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   580
                       filename as key and related data as values
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   581
        """
45291
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45290
diff changeset
   582
        self._filemapping = {}
45281
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45280
diff changeset
   583
        self._diverge = {}
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45280
diff changeset
   584
        self._renamedelete = {}
45383
f970cca30989 merge: use collections.defaultdict() for mergeresult.commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45349
diff changeset
   585
        self._commitinfo = collections.defaultdict(dict)
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   586
        self._actionmapping = collections.defaultdict(dict)
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   587
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   588
    def updatevalues(self, diverge, renamedelete):
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   589
        self._diverge = diverge
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   590
        self._renamedelete = renamedelete
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   591
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   592
    def addfile(self, filename, action, data, message):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   593
        """adds a new file to the mergeresult object
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   594
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   595
        filename: file which we are adding
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   596
        action: one of mergestatemod.ACTION_*
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   597
        data: a tuple of information like fctx and ctx related to this merge
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   598
        message: a message about the merge
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   599
        """
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   600
        # if the file already existed, we need to delete it's old
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   601
        # entry form _actionmapping too
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   602
        if filename in self._filemapping:
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   603
            a, d, m = self._filemapping[filename]
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   604
            del self._actionmapping[a][filename]
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   605
45291
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45290
diff changeset
   606
        self._filemapping[filename] = (action, data, message)
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   607
        self._actionmapping[action][filename] = (data, message)
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   608
49911
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   609
    def mapaction(self, actionfrom, actionto, transform):
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   610
        """changes all occurrences of action `actionfrom` into `actionto`,
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   611
        transforming its args with the function `transform`.
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   612
        """
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   613
        orig = self._actionmapping[actionfrom]
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   614
        del self._actionmapping[actionfrom]
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   615
        dest = self._actionmapping[actionto]
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   616
        for f, (data, msg) in orig.items():
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   617
            data = transform(f, data)
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   618
            self._filemapping[f] = (actionto, data, msg)
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   619
            dest[f] = (data, msg)
c7a04bfabd4d merge: add mergeresult.mapaction to improve speed
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49910
diff changeset
   620
45344
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   621
    def getfile(self, filename, default_return=None):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   622
        """returns (action, args, msg) about this file
45344
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   623
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   624
        returns default_return if the file is not present"""
45344
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   625
        if filename in self._filemapping:
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   626
            return self._filemapping[filename]
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   627
        return default_return
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   628
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   629
    def files(self, actions=None):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   630
        """returns files on which provided action needs to perfromed
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   631
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   632
        If actions is None, all files are returned
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   633
        """
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   634
        # TODO: think whether we should return renamedelete and
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   635
        # diverge filenames also
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   636
        if actions is None:
52644
e627cc25b6f3 pyupgrade: rewrite `yield` statements in a loop to `yield from`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52186
diff changeset
   637
            yield from self._filemapping
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   638
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   639
        else:
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   640
            for a in actions:
52644
e627cc25b6f3 pyupgrade: rewrite `yield` statements in a loop to `yield from`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52186
diff changeset
   641
                yield from self._actionmapping[a]
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   642
45283
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45282
diff changeset
   643
    def removefile(self, filename):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   644
        """removes a file from the mergeresult object as the file might
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   645
        not merging anymore"""
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   646
        action, data, message = self._filemapping[filename]
45291
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45290
diff changeset
   647
        del self._filemapping[filename]
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   648
        del self._actionmapping[action][filename]
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   649
45336
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   650
    def getactions(self, actions, sort=False):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   651
        """get list of files which are marked with these actions
45336
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   652
        if sort is true, files for each action is sorted and then added
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   653
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   654
        Returns a list of tuple of form (filename, data, message)
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   655
        """
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   656
        for a in actions:
45336
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   657
            if sort:
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   658
                for f in sorted(self._actionmapping[a]):
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   659
                    args, msg = self._actionmapping[a][f]
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
   660
                    yield f, args, msg
45336
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   661
            else:
48927
c17aee610bab merge: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
   662
                for f, (args, msg) in self._actionmapping[a].items():
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
   663
                    yield f, args, msg
45283
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45282
diff changeset
   664
45338
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   665
    def len(self, actions=None):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   666
        """returns number of files which needs actions
45338
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   667
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   668
        if actions is passed, total of number of files in that action
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   669
        only is returned"""
45338
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   670
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   671
        if actions is None:
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   672
            return len(self._filemapping)
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   673
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   674
        return sum(len(self._actionmapping[a]) for a in actions)
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   675
45346
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45345
diff changeset
   676
    def filemap(self, sort=False):
51814
23116aefe786 merge: sort filemap only if requested by the caller
Manuel Jacob <me@manueljacob.de>
parents: 50260
diff changeset
   677
        if sort:
52644
e627cc25b6f3 pyupgrade: rewrite `yield` statements in a loop to `yield from`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52186
diff changeset
   678
            yield from sorted(self._filemapping.items())
45346
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45345
diff changeset
   679
        else:
52644
e627cc25b6f3 pyupgrade: rewrite `yield` statements in a loop to `yield from`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52186
diff changeset
   680
            yield from self._filemapping.items()
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   681
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   682
    def addcommitinfo(self, filename, key, value):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   683
        """adds key-value information about filename which will be required
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   684
        while committing this merge"""
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   685
        self._commitinfo[filename][key] = value
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   686
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   687
    @property
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   688
    def diverge(self):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   689
        return self._diverge
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   690
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   691
    @property
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   692
    def renamedelete(self):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   693
        return self._renamedelete
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   694
45275
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   695
    @property
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   696
    def commitinfo(self):
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   697
        return self._commitinfo
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   698
45279
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45278
diff changeset
   699
    @property
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45278
diff changeset
   700
    def actionsdict(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   701
        """returns a dictionary of actions to be perfomed with action as key
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   702
        and a list of files and related arguments as values"""
45348
490607efc992 merge: remove emptyactions() and use collections.defaultdict(list) instead
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45347
diff changeset
   703
        res = collections.defaultdict(list)
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   704
        for a, d in self._actionmapping.items():
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   705
            for f, (args, msg) in d.items():
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   706
                res[a].append((f, args, msg))
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   707
        return res
45279
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45278
diff changeset
   708
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   709
    def setactions(self, actions):
45291
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45290
diff changeset
   710
        self._filemapping = actions
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   711
        self._actionmapping = collections.defaultdict(dict)
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   712
        for f, (act, data, msg) in self._filemapping.items():
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   713
            self._actionmapping[act][f] = data, msg
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   714
45278
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   715
    def hasconflicts(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   716
        """tells whether this merge resulted in some actions which can
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   717
        result in conflicts or not"""
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   718
        for a in self._actionmapping.keys():
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   719
            if (
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   720
                a
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   721
                not in (
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   722
                    mergestatemod.ACTION_GET,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   723
                    mergestatemod.ACTION_EXEC,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   724
                    mergestatemod.ACTION_REMOVE,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   725
                    mergestatemod.ACTION_PATH_CONFLICT_RESOLVE,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   726
                )
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   727
                and self._actionmapping[a]
48713
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48711
diff changeset
   728
                and not a.no_op
45278
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   729
            ):
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   730
                return True
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   731
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   732
        return False
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   733
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   734
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   735
def manifestmerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   736
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   737
    wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   738
    p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   739
    pa,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   740
    branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   741
    force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   742
    matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   743
    acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   744
    followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   745
    forcefulldiff=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   746
):
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   747
    """
30096
98d3d8108db0 merge: update doc of manifestmerge() per 18c2184c27dc
Yuya Nishihara <yuya@tcha.org>
parents: 30060
diff changeset
   748
    Merge wctx and p2 with ancestor pa and generate merge action list
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
   749
18605
bcf29565d89f manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents: 18544
diff changeset
   750
    branchmerge and force are as passed in to update
27346
ba0da4b7397d merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents: 27345
diff changeset
   751
    matcher = matcher to filter file lists
18778
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
   752
    acceptremote = accept the incoming changes without prompting
45168
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
   753
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   754
    Returns an object of mergeresult class
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   755
    """
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   756
    mresult = mergeresult()
27346
ba0da4b7397d merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents: 27345
diff changeset
   757
    if matcher is not None and matcher.always():
ba0da4b7397d merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents: 27345
diff changeset
   758
        matcher = None
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   759
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   760
    # manifests fetched in order are going to be faster, so prime the caches
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   761
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   762
        x.manifest()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   763
        for x in sorted(wctx.parents() + [p2, pa], key=scmutil.intrev)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   764
    ]
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   765
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   766
    branch_copies1 = copies.branch_copies()
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   767
    branch_copies2 = copies.branch_copies()
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   768
    diverge = {}
45275
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   769
    # information from merge which is needed at commit time
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   770
    # for example choosing filelog of which parent to commit
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   771
    # TODO: use specific constants in future for this mapping
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   772
    if followcopies:
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   773
        branch_copies1, branch_copies2, diverge = copies.mergecopies(
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   774
            repo, wctx, p2, pa
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   775
        )
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
   776
32641
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32612
diff changeset
   777
    boolbm = pycompat.bytestr(bool(branchmerge))
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32612
diff changeset
   778
    boolf = pycompat.bytestr(bool(force))
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32612
diff changeset
   779
    boolm = pycompat.bytestr(bool(matcher))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   780
    repo.ui.note(_(b"resolving manifests\n"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   781
    repo.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   782
        b" branchmerge: %s, force: %s, partial: %s\n" % (boolbm, boolf, boolm)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   783
    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   784
    repo.ui.debug(b" ancestor: %s, local: %s, remote: %s\n" % (pa, wctx, p2))
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
   785
18611
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
   786
    m1, m2, ma = wctx.manifest(), p2.manifest(), pa.manifest()
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   787
    copied1 = set(branch_copies1.copy.values())
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   788
    copied1.update(branch_copies1.movewithdir.values())
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   789
    copied2 = set(branch_copies2.copy.values())
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   790
    copied2.update(branch_copies2.movewithdir.values())
3295
72d1e521da77 merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents: 3292
diff changeset
   791
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   792
    if b'.hgsubstate' in m1 and wctx.rev() is None:
38425
1322ae04d3d7 merge: do not fill manifest of committed revision with pseudo node (issue5526)
Yuya Nishihara <yuya@tcha.org>
parents: 37762
diff changeset
   793
        # Check whether sub state is modified, and overwrite the manifest
1322ae04d3d7 merge: do not fill manifest of committed revision with pseudo node (issue5526)
Yuya Nishihara <yuya@tcha.org>
parents: 37762
diff changeset
   794
        # to flag the change. If wctx is a committed revision, we shouldn't
1322ae04d3d7 merge: do not fill manifest of committed revision with pseudo node (issue5526)
Yuya Nishihara <yuya@tcha.org>
parents: 37762
diff changeset
   795
        # care for the dirty state of the working directory.
28226
377f0d8ff874 merge: use any() instead of for loop when checking for dirty subrepos
Martin von Zweigbergk <martinvonz@google.com>
parents: 28200
diff changeset
   796
        if any(wctx.sub(s).dirty() for s in wctx.substate):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
   797
            m1[b'.hgsubstate'] = repo.nodeconstants.modifiednodeid
9783
ee00ef6f9be7 submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
   798
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   799
    # Don't use m2-vs-ma optimization if:
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   800
    # - ma is the same as m1 or m2, which we're just going to diff again later
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   801
    # - The caller specifically asks for a full diff, which is useful during bid
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   802
    #   merge.
45580
76d79b80d953 merge: disable `m2-vs-ma` optimization if new filenode config is true
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45576
diff changeset
   803
    # - we are tracking salvaged files specifically hence should process all
76d79b80d953 merge: disable `m2-vs-ma` optimization if new filenode config is true
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45576
diff changeset
   804
    #   files
76d79b80d953 merge: disable `m2-vs-ma` optimization if new filenode config is true
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45576
diff changeset
   805
    if (
76d79b80d953 merge: disable `m2-vs-ma` optimization if new filenode config is true
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45576
diff changeset
   806
        pa not in ([wctx, p2] + wctx.parents())
76d79b80d953 merge: disable `m2-vs-ma` optimization if new filenode config is true
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45576
diff changeset
   807
        and not forcefulldiff
45661
ebc14a2ad23d salvaged: track removal-candidates in more cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45630
diff changeset
   808
        and not (
ebc14a2ad23d salvaged: track removal-candidates in more cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45630
diff changeset
   809
            repo.ui.configbool(b'experimental', b'merge-track-salvaged')
ebc14a2ad23d salvaged: track removal-candidates in more cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45630
diff changeset
   810
            or repo.filecopiesmode == b'changeset-sidedata'
ebc14a2ad23d salvaged: track removal-candidates in more cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45630
diff changeset
   811
        )
45580
76d79b80d953 merge: disable `m2-vs-ma` optimization if new filenode config is true
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45576
diff changeset
   812
    ):
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   813
        # Identify which files are relevant to the merge, so we can limit the
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   814
        # total m1-vs-m2 diff to just those files. This has significant
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   815
        # performance benefits in large repositories.
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   816
        relevantfiles = set(ma.diff(m2).keys())
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   817
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   818
        # For copied and moved files, we need to add the source file too.
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   819
        for copykey, copyvalue in branch_copies1.copy.items():
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   820
            if copyvalue in relevantfiles:
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   821
                relevantfiles.add(copykey)
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   822
        for movedirkey in branch_copies1.movewithdir:
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   823
            relevantfiles.add(movedirkey)
32498
bd56bea5ecf8 merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32351
diff changeset
   824
        filesmatcher = scmutil.matchfiles(repo, relevantfiles)
bd56bea5ecf8 merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32351
diff changeset
   825
        matcher = matchmod.intersectmatchers(matcher, filesmatcher)
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   826
31257
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31175
diff changeset
   827
    diff = m1.diff(m2, match=matcher)
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31175
diff changeset
   828
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   829
    for f, ((n1, fl1), (n2, fl2)) in diff.items():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   830
        if n1 and n2:  # file exists on both local and remote side
23396
6a254a2dd37c merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23395
diff changeset
   831
            if f not in ma:
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   832
                # TODO: what if they're renamed from different sources?
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   833
                fa = branch_copies1.copy.get(
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   834
                    f, None
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   835
                ) or branch_copies2.copy.get(f, None)
45296
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   836
                args, msg = None, None
23397
c7c95838be9a merge: break out "both renamed a -> b" case
Martin von Zweigbergk <martinvonz@google.com>
parents: 23396
diff changeset
   837
                if fa is not None:
45296
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   838
                    args = (f, f, fa, False, pa.node())
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   839
                    msg = b'both renamed from %s' % fa
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
   840
                else:
45296
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   841
                    args = (f, f, None, False, pa.node())
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   842
                    msg = b'both created'
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   843
                mresult.addfile(f, mergestatemod.ACTION_MERGE, args, msg)
45817
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   844
            elif f in branch_copies1.copy:
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   845
                fa = branch_copies1.copy[f]
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   846
                mresult.addfile(
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   847
                    f,
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   848
                    mergestatemod.ACTION_MERGE,
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   849
                    (f, fa, fa, False, pa.node()),
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   850
                    b'local replaced from %s' % fa,
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   851
                )
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   852
            elif f in branch_copies2.copy:
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   853
                fa = branch_copies2.copy[f]
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   854
                mresult.addfile(
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   855
                    f,
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   856
                    mergestatemod.ACTION_MERGE,
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   857
                    (fa, f, fa, False, pa.node()),
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   858
                    b'other replaced from %s' % fa,
58e7ee23ddbd copies: handle more cases where a file got replaced by a copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45688
diff changeset
   859
                )
16094
0776a6cababe merge: don't use unknown()
Matt Mackall <mpm@selenic.com>
parents: 16093
diff changeset
   860
            else:
23396
6a254a2dd37c merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23395
diff changeset
   861
                a = ma[f]
6a254a2dd37c merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23395
diff changeset
   862
                fla = ma.flags(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   863
                nol = b'l' not in fl1 + fl2 + fla
23395
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
   864
                if n2 == a and fl2 == fla:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   865
                    mresult.addfile(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   866
                        f,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   867
                        mergestatemod.ACTION_KEEP,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   868
                        (),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   869
                        b'remote unchanged',
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   870
                    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   871
                elif n1 == a and fl1 == fla:  # local unchanged - use remote
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   872
                    if n1 == n2:  # optimization: keep local content
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   873
                        mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   874
                            f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   875
                            mergestatemod.ACTION_EXEC,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   876
                            (fl2,),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   877
                            b'update permissions',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   878
                        )
23395
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
   879
                    else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   880
                        mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   881
                            f,
45277
c515c54f6530 merge: remove no longer required ACTION_GET_OTHER_AND_STORE
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45276
diff changeset
   882
                            mergestatemod.ACTION_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   883
                            (fl2, False),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   884
                            b'remote is newer',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   885
                        )
45275
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   886
                        if branchmerge:
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   887
                            mresult.addcommitinfo(
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   888
                                f, b'filenode-source', b'other'
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   889
                            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   890
                elif nol and n2 == a:  # remote only changed 'x'
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   891
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   892
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   893
                        mergestatemod.ACTION_EXEC,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   894
                        (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   895
                        b'update permissions',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   896
                    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   897
                elif nol and n1 == a:  # local only changed 'x'
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   898
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   899
                        f,
45277
c515c54f6530 merge: remove no longer required ACTION_GET_OTHER_AND_STORE
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45276
diff changeset
   900
                        mergestatemod.ACTION_GET,
44687
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
   901
                        (fl1, False),
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
   902
                        b'remote is newer',
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
   903
                    )
45275
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   904
                    if branchmerge:
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   905
                        mresult.addcommitinfo(f, b'filenode-source', b'other')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   906
                else:  # both changed something
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   907
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   908
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   909
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   910
                        (f, f, f, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   911
                        b'versions differ',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   912
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   913
        elif n1:  # file exists only on local side
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   914
            if f in copied2:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   915
                pass  # we'll deal with it on m2 side
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   916
            elif (
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   917
                f in branch_copies1.movewithdir
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   918
            ):  # directory rename, move local
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   919
                f2 = branch_copies1.movewithdir[f]
31515
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31475
diff changeset
   920
                if f2 in m2:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   921
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   922
                        f2,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   923
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   924
                        (f, f2, None, True, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   925
                        b'remote directory rename, both created',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   926
                    )
23475
67f1d68861fb merge: don't ignore conflicting file in remote renamed directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 23474
diff changeset
   927
                else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   928
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   929
                        f2,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   930
                        mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   931
                        (f, fl1),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   932
                        b'remote directory rename - move from %s' % f,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   933
                    )
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   934
            elif f in branch_copies1.copy:
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   935
                f2 = branch_copies1.copy[f]
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   936
                mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   937
                    f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   938
                    mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   939
                    (f, f2, f2, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   940
                    b'local copied/moved from %s' % f2,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   941
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   942
            elif f in ma:  # clean, a different, no remote
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   943
                if n1 != ma[f]:
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   944
                    if acceptremote:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   945
                        mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   946
                            f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   947
                            mergestatemod.ACTION_REMOVE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   948
                            None,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   949
                            b'remote delete',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   950
                        )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   951
                    else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   952
                        mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   953
                            f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   954
                            mergestatemod.ACTION_CHANGED_DELETED,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   955
                            (f, None, f, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   956
                            b'prompt changed/deleted',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   957
                        )
45584
4c8a93ec6908 merge: store commitinfo if these is a dc or cd conflict
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45580
diff changeset
   958
                        if branchmerge:
4c8a93ec6908 merge: store commitinfo if these is a dc or cd conflict
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45580
diff changeset
   959
                            mresult.addcommitinfo(
4c8a93ec6908 merge: store commitinfo if these is a dc or cd conflict
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45580
diff changeset
   960
                                f, b'merge-removal-candidate', b'yes'
4c8a93ec6908 merge: store commitinfo if these is a dc or cd conflict
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45580
diff changeset
   961
                            )
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
   962
                elif n1 == repo.nodeconstants.addednodeid:
45118
d0ef8c1dddd4 manifest: tigher manifest parsing and flag use
Joerg Sonnenberger <joerg@bec.de>
parents: 45072
diff changeset
   963
                    # This file was locally added. We should forget it instead of
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   964
                    # deleting it.
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   965
                    mresult.addfile(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   966
                        f,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   967
                        mergestatemod.ACTION_FORGET,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   968
                        None,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   969
                        b'remote deleted',
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   970
                    )
20639
1df033640a8e merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents: 20620
diff changeset
   971
                else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   972
                    mresult.addfile(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   973
                        f,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   974
                        mergestatemod.ACTION_REMOVE,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   975
                        None,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
   976
                        b'other deleted',
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   977
                    )
45587
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
   978
                    if branchmerge:
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
   979
                        # the file must be absent after merging,
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
   980
                        # howeber the user might make
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
   981
                        # the file reappear using revert and if they does,
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
   982
                        # we force create a new node
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
   983
                        mresult.addcommitinfo(
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
   984
                            f, b'merge-removal-candidate', b'yes'
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
   985
                        )
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
   986
45469
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45468
diff changeset
   987
            else:  # file not in ancestor, not in remote
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45468
diff changeset
   988
                mresult.addfile(
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45468
diff changeset
   989
                    f,
45524
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
   990
                    mergestatemod.ACTION_KEEP_NEW,
45469
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45468
diff changeset
   991
                    None,
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45468
diff changeset
   992
                    b'ancestor missing, remote missing',
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45468
diff changeset
   993
                )
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45468
diff changeset
   994
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   995
        elif n2:  # file exists only on remote side
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   996
            if f in copied1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   997
                pass  # we'll deal with it on m1 side
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   998
            elif f in branch_copies2.movewithdir:
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   999
                f2 = branch_copies2.movewithdir[f]
31515
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31475
diff changeset
  1000
                if f2 in m1:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1001
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1002
                        f2,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1003
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1004
                        (f2, f, None, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1005
                        b'local directory rename, both created',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1006
                    )
23476
39a12719ec65 merge: don't overwrite conflicting file in locally renamed directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 23475
diff changeset
  1007
                else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1008
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1009
                        f2,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1010
                        mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1011
                        (f, fl2),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1012
                        b'local directory rename - get from %s' % f,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1013
                    )
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
  1014
            elif f in branch_copies2.copy:
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
  1015
                f2 = branch_copies2.copy[f]
45296
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
  1016
                msg, args = None, None
31515
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31475
diff changeset
  1017
                if f2 in m2:
45296
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
  1018
                    args = (f2, f, f2, False, pa.node())
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
  1019
                    msg = b'remote copied from %s' % f2
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
  1020
                else:
45296
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
  1021
                    args = (f2, f, f2, True, pa.node())
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
  1022
                    msg = b'remote moved from %s' % f2
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
  1023
                mresult.addfile(f, mergestatemod.ACTION_MERGE, args, msg)
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
  1024
            elif f not in ma:
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
  1025
                # local unknown, remote created: the logic is described by the
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
  1026
                # following table:
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
  1027
                #
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
  1028
                # force  branchmerge  different  |  action
23651
72da02d7f126 merge: collect checking for unknown files at end of manifestmerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23650
diff changeset
  1029
                #   n         *           *      |   create
23650
b85c548ab14d merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents: 23649
diff changeset
  1030
                #   y         n           *      |   create
b85c548ab14d merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents: 23649
diff changeset
  1031
                #   y         y           n      |   create
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
  1032
                #   y         y           y      |   merge
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
  1033
                #
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
  1034
                # Checking whether the files are different is expensive, so we
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
  1035
                # don't do that when we can avoid it.
23649
18ab5e5955df merge: structure 'remote created' code to match table
Martin von Zweigbergk <martinvonz@google.com>
parents: 23641
diff changeset
  1036
                if not force:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1037
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1038
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1039
                        mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1040
                        (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1041
                        b'remote created',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1042
                    )
23649
18ab5e5955df merge: structure 'remote created' code to match table
Martin von Zweigbergk <martinvonz@google.com>
parents: 23641
diff changeset
  1043
                elif not branchmerge:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1044
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1045
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1046
                        mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1047
                        (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1048
                        b'remote created',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1049
                    )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
  1050
                else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1051
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1052
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1053
                        mergestatemod.ACTION_CREATED_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1054
                        (fl2, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1055
                        b'remote created, get or merge',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1056
                    )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
  1057
            elif n2 != ma[f]:
30581
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
  1058
                df = None
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
  1059
                for d in branch_copies1.dirmove:
30581
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
  1060
                    if f.startswith(d):
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
  1061
                        # new file added in a directory that was moved
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
  1062
                        df = branch_copies1.dirmove[d] + f[len(d) :]
30581
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
  1063
                        break
31515
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31475
diff changeset
  1064
                if df is not None and df in m1:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1065
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1066
                        df,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1067
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1068
                        (df, f, f, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1069
                        b'local directory rename - respect move '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1070
                        b'from %s' % f,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1071
                    )
30581
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
  1072
                elif acceptremote:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1073
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1074
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1075
                        mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1076
                        (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1077
                        b'remote recreating',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1078
                    )
18606
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
  1079
                else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1080
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1081
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1082
                        mergestatemod.ACTION_DELETED_CHANGED,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1083
                        (None, f, f, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1084
                        b'prompt deleted/changed',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1085
                    )
45584
4c8a93ec6908 merge: store commitinfo if these is a dc or cd conflict
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45580
diff changeset
  1086
                    if branchmerge:
4c8a93ec6908 merge: store commitinfo if these is a dc or cd conflict
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45580
diff changeset
  1087
                        mresult.addcommitinfo(
4c8a93ec6908 merge: store commitinfo if these is a dc or cd conflict
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45580
diff changeset
  1088
                            f, b'merge-removal-candidate', b'yes'
4c8a93ec6908 merge: store commitinfo if these is a dc or cd conflict
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45580
diff changeset
  1089
                        )
45468
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45467
diff changeset
  1090
            else:
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45467
diff changeset
  1091
                mresult.addfile(
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45467
diff changeset
  1092
                    f,
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45467
diff changeset
  1093
                    mergestatemod.ACTION_KEEP_ABSENT,
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45467
diff changeset
  1094
                    None,
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45467
diff changeset
  1095
                    b'local not present, remote unchanged',
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45467
diff changeset
  1096
                )
45587
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
  1097
                if branchmerge:
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
  1098
                    # the file must be absent after merging
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
  1099
                    # however the user might make
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
  1100
                    # the file reappear using revert and if they does,
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
  1101
                    # we force create a new node
768412472663 merge: store cases when a file is absent post merge in commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45584
diff changeset
  1102
                    mresult.addcommitinfo(f, b'merge-removal-candidate', b'yes')
23651
72da02d7f126 merge: collect checking for unknown files at end of manifestmerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23650
diff changeset
  1103
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1104
    if repo.ui.configbool(b'experimental', b'merge.checkpathconflicts'):
34941
37450a122128 merge: add a config option to disable path conflict checking
Siddharth Agarwal <sid0@fb.com>
parents: 34919
diff changeset
  1105
        # If we are merging, look for path conflicts.
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
  1106
        checkpathconflicts(repo, wctx, p2, mresult)
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
  1107
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
  1108
    narrowmatch = repo.narrowmatch()
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
  1109
    if not narrowmatch.always():
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
  1110
        # Updates "actions" in place
45285
e7196f1da2b1 merge: pass mergeresult obj instead of actions in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45284
diff changeset
  1111
        _filternarrowactions(narrowmatch, branchmerge, mresult)
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
  1112
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
  1113
    renamedelete = branch_copies1.renamedelete
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
  1114
    renamedelete.update(branch_copies2.renamedelete)
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
  1115
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
  1116
    mresult.updatevalues(diverge, renamedelete)
45281
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45280
diff changeset
  1117
    return mresult
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
  1118
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1119
45286
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45285
diff changeset
  1120
def _resolvetrivial(repo, wctx, mctx, ancestor, mresult):
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
  1121
    """Resolves false conflicts where the nodeid changed but the content
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1122
    remained the same."""
36316
759579bac31d merge: make a copy of dict.items() before mutating the dict during iteration
Augie Fackler <augie@google.com>
parents: 36177
diff changeset
  1123
    # We force a copy of actions.items() because we're going to mutate
759579bac31d merge: make a copy of dict.items() before mutating the dict during iteration
Augie Fackler <augie@google.com>
parents: 36177
diff changeset
  1124
    # actions as we resolve trivial conflicts.
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
  1125
    for f in list(mresult.files((mergestatemod.ACTION_CHANGED_DELETED,))):
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
  1126
        if f in ancestor and not wctx[f].cmp(ancestor[f]):
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
  1127
            # local did change but ended up with same content
45286
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45285
diff changeset
  1128
            mresult.addfile(
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45285
diff changeset
  1129
                f, mergestatemod.ACTION_REMOVE, None, b'prompt same'
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45285
diff changeset
  1130
            )
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
  1131
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
  1132
    for f in list(mresult.files((mergestatemod.ACTION_DELETED_CHANGED,))):
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
  1133
        if f in ancestor and not mctx[f].cmp(ancestor[f]):
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
  1134
            # remote did change but ended up with same content
45286
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45285
diff changeset
  1135
            mresult.removefile(f)  # don't get = keep local deleted
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1136
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
  1137
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1138
def calculateupdates(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1139
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1140
    wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1141
    mctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1142
    ancestors,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1143
    branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1144
    force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1145
    acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1146
    followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1147
    matcher=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1148
    mergeforce=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1149
):
45168
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1150
    """
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1151
    Calculate the actions needed to merge mctx into wctx using ancestors
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1152
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1153
    Uses manifestmerge() to merge manifest and get list of actions required to
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1154
    perform for merging two manifests. If there are multiple ancestors, uses bid
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1155
    merge if enabled.
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1156
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1157
    Also filters out actions which are unrequired if repository is sparse.
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1158
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1159
    Returns mergeresult object same as manifestmerge().
45168
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1160
    """
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1161
    # Avoid cycle.
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1162
    from . import sparse
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1163
45281
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45280
diff changeset
  1164
    mresult = None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1165
    if len(ancestors) == 1:  # default
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1166
        mresult = manifestmerge(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1167
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1168
            wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1169
            mctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1170
            ancestors[0],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1171
            branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1172
            force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1173
            matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1174
            acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1175
            followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1176
        )
45287
4ad6c4e9e35f merge: pass mergeresult instead of actions in _checkunknownfiles() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45286
diff changeset
  1177
        _checkunknownfiles(repo, wctx, mctx, force, mresult, mergeforce)
49886
becd16690cbe debug: add a config to abort update early
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49365
diff changeset
  1178
        if repo.ui.configbool(b'devel', b'debug.abort-update'):
becd16690cbe debug: add a config to abort update early
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49365
diff changeset
  1179
            exit(1)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1180
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1181
    else:  # only when merge.preferancestor=* - the default
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1182
        repo.ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1183
            _(b"note: merging %s and %s using bids from ancestors %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1184
            % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1185
                wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1186
                mctx,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1187
                _(b' and ').join(pycompat.bytestr(anc) for anc in ancestors),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1188
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1189
        )
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1190
45280
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1191
        # mapping filename to bids (action method to list af actions)
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1192
        # {FILENAME1 : BID1, FILENAME2 : BID2}
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1193
        # BID is another dictionary which contains
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1194
        # mapping of following form:
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1195
        # {ACTION_X : [info, ..], ACTION_Y : [info, ..]}
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1196
        fbids = {}
45470
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45469
diff changeset
  1197
        mresult = mergeresult()
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
  1198
        diverge, renamedelete = None, None
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1199
        for ancestor in ancestors:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1200
            repo.ui.note(_(b'\ncalculating bids for ancestor %s\n') % ancestor)
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1201
            mresult1 = manifestmerge(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1202
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1203
                wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1204
                mctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1205
                ancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1206
                branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1207
                force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1208
                matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1209
                acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1210
                followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1211
                forcefulldiff=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1212
            )
45287
4ad6c4e9e35f merge: pass mergeresult instead of actions in _checkunknownfiles() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45286
diff changeset
  1213
            _checkunknownfiles(repo, wctx, mctx, force, mresult1, mergeforce)
26318
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
  1214
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
  1215
            # Track the shortest set of warning on the theory that bid
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
  1216
            # merge will correctly incorporate more information
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1217
            if diverge is None or len(mresult1.diverge) < len(diverge):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1218
                diverge = mresult1.diverge
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1219
            if renamedelete is None or len(renamedelete) < len(
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1220
                mresult1.renamedelete
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1221
            ):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1222
                renamedelete = mresult1.renamedelete
26318
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
  1223
45470
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45469
diff changeset
  1224
            # blindly update final mergeresult commitinfo with what we get
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45469
diff changeset
  1225
            # from mergeresult object for each ancestor
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45469
diff changeset
  1226
            # TODO: some commitinfo depends on what bid merge choose and hence
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45469
diff changeset
  1227
            # we will need to make commitinfo also depend on bid merge logic
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45469
diff changeset
  1228
            mresult._commitinfo.update(mresult1._commitinfo)
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45469
diff changeset
  1229
45346
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45345
diff changeset
  1230
            for f, a in mresult1.filemap(sort=True):
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1231
                m, args, msg = a
48711
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48708
diff changeset
  1232
                repo.ui.debug(b' %s: %s -> %s\n' % (f, msg, m.__bytes__()))
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1233
                if f in fbids:
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1234
                    d = fbids[f]
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1235
                    if m in d:
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1236
                        d[m].append(a)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1237
                    else:
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1238
                        d[m] = [a]
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1239
                else:
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1240
                    fbids[f] = {m: [a]}
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1241
45280
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1242
        # Call for bids
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1243
        # Pick the best bid for each file
45447
e7c8a5030a90 merge: show number of ancestors in bid merge debug notes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
  1244
        repo.ui.note(
e7c8a5030a90 merge: show number of ancestors in bid merge debug notes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
  1245
            _(b'\nauction for merging merge bids (%d ancestors)\n')
e7c8a5030a90 merge: show number of ancestors in bid merge debug notes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
  1246
            % len(ancestors)
e7c8a5030a90 merge: show number of ancestors in bid merge debug notes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
  1247
        )
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1248
        for f, bids in sorted(fbids.items()):
45459
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45447
diff changeset
  1249
            if repo.ui.debugflag:
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45447
diff changeset
  1250
                repo.ui.debug(b" list of bids for %s:\n" % f)
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45447
diff changeset
  1251
                for m, l in sorted(bids.items()):
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45447
diff changeset
  1252
                    for _f, args, msg in l:
48711
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48708
diff changeset
  1253
                        repo.ui.debug(b'   %s -> %s\n' % (msg, m.__bytes__()))
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1254
            # bids is a mapping from action method to list af actions
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1255
            # Consensus?
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1256
            if len(bids) == 1:  # all bids are the same kind of method
34348
1a5abc45e2fa py3: explicitly convert dict.keys() and dict.items() into a list
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34302
diff changeset
  1257
                m, l = list(bids.items())[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1258
                if all(a == l[0] for a in l[1:]):  # len(bids) is > 1
48711
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48708
diff changeset
  1259
                    repo.ui.note(
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48708
diff changeset
  1260
                        _(b" %s: consensus for %s\n") % (f, m.__bytes__())
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48708
diff changeset
  1261
                    )
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1262
                    mresult.addfile(f, *l[0])
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1263
                    continue
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1264
            # If keep is an option, just do it.
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1265
            if mergestatemod.ACTION_KEEP in bids:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1266
                repo.ui.note(_(b" %s: picking 'keep' action\n") % f)
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1267
                mresult.addfile(f, *bids[mergestatemod.ACTION_KEEP][0])
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1268
                continue
45467
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1269
            # If keep absent is an option, just do that
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1270
            if mergestatemod.ACTION_KEEP_ABSENT in bids:
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1271
                repo.ui.note(_(b" %s: picking 'keep absent' action\n") % f)
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1272
                mresult.addfile(f, *bids[mergestatemod.ACTION_KEEP_ABSENT][0])
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1273
                continue
45619
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1274
            # ACTION_KEEP_NEW and ACTION_CHANGED_DELETED are conflicting actions
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1275
            # as one say that file is new while other says that file was present
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1276
            # earlier too and has a change delete conflict
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1277
            # Let's fall back to conflicting ACTION_CHANGED_DELETED and let user
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1278
            # do the right thing
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1279
            if (
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1280
                mergestatemod.ACTION_CHANGED_DELETED in bids
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1281
                and mergestatemod.ACTION_KEEP_NEW in bids
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1282
            ):
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1283
                repo.ui.note(_(b" %s: picking 'changed/deleted' action\n") % f)
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1284
                mresult.addfile(
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1285
                    f, *bids[mergestatemod.ACTION_CHANGED_DELETED][0]
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1286
                )
e8078af6af30 merge: if CHANGED_DELETED and KEEP_NEW are actions, choose CHANGED_DELETED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45617
diff changeset
  1287
                continue
45524
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
  1288
            # If keep new is an option, let's just do that
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
  1289
            if mergestatemod.ACTION_KEEP_NEW in bids:
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
  1290
                repo.ui.note(_(b" %s: picking 'keep new' action\n") % f)
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
  1291
                mresult.addfile(f, *bids[mergestatemod.ACTION_KEEP_NEW][0])
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
  1292
                continue
45617
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1293
            # ACTION_GET and ACTION_DELETE_CHANGED are conflicting actions as
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1294
            # one action states the file is newer/created on remote side and
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1295
            # other states that file is deleted locally and changed on remote
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1296
            # side. Let's fallback and rely on a conflicting action to let user
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1297
            # do the right thing
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1298
            if (
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1299
                mergestatemod.ACTION_DELETED_CHANGED in bids
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1300
                and mergestatemod.ACTION_GET in bids
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1301
            ):
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1302
                repo.ui.note(_(b" %s: picking 'delete/changed' action\n") % f)
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1303
                mresult.addfile(
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1304
                    f, *bids[mergestatemod.ACTION_DELETED_CHANGED][0]
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1305
                )
ad984583969a merge: if DELETED_CHANGED and GET are in actions, choose DELETED_CHANGED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45587
diff changeset
  1306
                continue
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1307
            # If there are gets and they all agree [how could they not?], do it.
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1308
            if mergestatemod.ACTION_GET in bids:
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1309
                ga0 = bids[mergestatemod.ACTION_GET][0]
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1310
                if all(a == ga0 for a in bids[mergestatemod.ACTION_GET][1:]):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1311
                    repo.ui.note(_(b" %s: picking 'get' action\n") % f)
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1312
                    mresult.addfile(f, *ga0)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1313
                    continue
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1314
            # TODO: Consider other simple actions such as mode changes
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1315
            # Handle inefficient democrazy.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1316
            repo.ui.note(_(b' %s: multiple bids for merge action:\n') % f)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1317
            for m, l in sorted(bids.items()):
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1318
                for _f, args, msg in l:
48711
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48708
diff changeset
  1319
                    repo.ui.note(b'  %s -> %s\n' % (msg, m.__bytes__()))
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1320
            # Pick random action. TODO: Instead, prompt user when resolving
34348
1a5abc45e2fa py3: explicitly convert dict.keys() and dict.items() into a list
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34302
diff changeset
  1321
            m, l = list(bids.items())[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1322
            repo.ui.warn(
48711
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48708
diff changeset
  1323
                _(b' %s: ambiguous merge - picked %s action\n')
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48708
diff changeset
  1324
                % (f, m.__bytes__())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1325
            )
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1326
            mresult.addfile(f, *l[0])
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1327
            continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1328
        repo.ui.note(_(b'end of auction\n\n'))
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
  1329
        mresult.updatevalues(diverge, renamedelete)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1330
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
  1331
    if wctx.rev() is None:
45347
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45346
diff changeset
  1332
        _forgetremoved(wctx, mctx, branchmerge, mresult)
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
  1333
45290
d70c972cec74 sparse: pass mergeresult obj in sparse.filterupdatesactions() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45289
diff changeset
  1334
    sparse.filterupdatesactions(repo, wctx, mctx, branchmerge, mresult)
45286
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45285
diff changeset
  1335
    _resolvetrivial(repo, wctx, mctx, ancestors[0], mresult)
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1336
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1337
    return mresult
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1338
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1339
34142
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1340
def _getcwd():
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1341
    try:
39818
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39464
diff changeset
  1342
        return encoding.getcwd()
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
  1343
    except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
  1344
        return None
34142
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1345
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1346
33081
6582dc01aca3 merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com>
parents: 32863
diff changeset
  1347
def batchremove(repo, wctx, actions):
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1348
    """apply removes to the working directory
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1349
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1350
    yields tuples for progress updates
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1351
    """
18640
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
  1352
    verbose = repo.ui.verbose
34142
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1353
    cwd = _getcwd()
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
  1354
    i = 0
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
  1355
    for f, args, msg in actions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1356
        repo.ui.debug(b" %s: %s -> r\n" % (f, msg))
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1357
        if verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1358
            repo.ui.note(_(b"removing %s\n") % f)
33086
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  1359
        wctx[f].audit()
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1360
        try:
33082
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33081
diff changeset
  1361
            wctx[f].remove(ignoremissing=True)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25151
diff changeset
  1362
        except OSError as inst:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1363
            repo.ui.warn(
45688
ed0ded64a8a9 py3: convert an exception message to bytes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45661
diff changeset
  1364
                _(b"update failed to remove %s: %s!\n")
46692
39f23d20ea47 merge: force an exception message to bytes before printing as a warning
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
  1365
                % (f, stringutil.forcebytestr(inst.strerror))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1366
            )
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1367
        if i == 100:
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1368
            yield i, f
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1369
            i = 0
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1370
        i += 1
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1371
    if i > 0:
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1372
        yield i, f
34142
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1373
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1374
    if cwd and not _getcwd():
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1375
        # cwd was removed in the course of removing files; print a helpful
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1376
        # warning.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1377
        repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1378
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1379
                b"current directory was removed\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1380
                b"(consider changing to repo root: %s)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1381
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1382
            % repo.root
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1383
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1384
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1385
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1386
def batchget(repo, mctx, wctx, wantfiledata, actions):
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1387
    """apply gets to the working directory
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1388
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1389
    mctx is the context to get from
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1390
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1391
    Yields arbitrarily many (False, tuple) for progress updates, followed by
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1392
    exactly one (True, filedata). When wantfiledata is false, filedata is an
42522
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42456
diff changeset
  1393
    empty dict. When wantfiledata is true, filedata[f] is a triple (mode, size,
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42456
diff changeset
  1394
    mtime) of the file f written for each action.
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1395
    """
42522
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42456
diff changeset
  1396
    filedata = {}
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1397
    verbose = repo.ui.verbose
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1398
    fctx = mctx.filectx
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
  1399
    ui = repo.ui
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1400
    i = 0
28200
588695ccbb22 merge: perform background file closing in batchget
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28199
diff changeset
  1401
    with repo.wvfs.backgroundclosing(ui, expectedcount=len(actions)):
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1402
        for f, (flags, backup), msg in actions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1403
            repo.ui.debug(b" %s: %s -> g\n" % (f, msg))
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1404
            if verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1405
                repo.ui.note(_(b"getting %s\n") % f)
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
  1406
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1407
            if backup:
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1408
                # If a file or directory exists with the same name, back that
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1409
                # up.  Otherwise, look to see if there is a file that conflicts
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1410
                # with a directory this file is in, and if so, back that up.
41570
1f2714052d7e merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents: 41569
diff changeset
  1411
                conflicting = f
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1412
                if not repo.wvfs.lexists(f):
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
  1413
                    for p in pathutil.finddirs(f):
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1414
                        if repo.wvfs.isfileorlink(p):
41570
1f2714052d7e merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents: 41569
diff changeset
  1415
                            conflicting = p
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1416
                            break
41570
1f2714052d7e merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents: 41569
diff changeset
  1417
                if repo.wvfs.lexists(conflicting):
41601
ac8cf125d8d5 merge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41570
diff changeset
  1418
                    orig = scmutil.backuppath(ui, repo, conflicting)
ac8cf125d8d5 merge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41570
diff changeset
  1419
                    util.rename(repo.wjoin(conflicting), orig)
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1420
            wfctx = wctx[f]
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1421
            wfctx.clearunknown()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1422
            atomictemp = ui.configbool(b"experimental", b"update.atomic-file")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1423
            size = wfctx.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1424
                fctx(f).data(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1425
                flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1426
                backgroundclose=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1427
                atomictemp=atomictemp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1428
            )
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1429
            if wantfiledata:
48377
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1430
                # XXX note that there is a race window between the time we
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1431
                # write the clean data into the file and we stats it. So another
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1432
                # writing process meddling with the file content right after we
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1433
                # wrote it could cause bad stat data to be gathered.
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1434
                #
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1435
                # They are 2 data we gather here
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1436
                # - the mode:
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1437
                #       That we actually just wrote, we should not need to read
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1438
                #       it from disk, (except not all mode might have survived
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1439
                #       the disk round-trip, which is another issue: we should
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1440
                #       not depends on this)
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1441
                # - the mtime,
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1442
                #       On system that support nanosecond precision, the mtime
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1443
                #       could be accurate enough to tell the two writes appart.
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1444
                #       However gathering it in a racy way make the mtime we
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1445
                #       gather "unreliable".
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1446
                #
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1447
                # (note: we get the size from the data we write, which is sane)
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1448
                #
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1449
                # So in theory the data returned here are fully racy, but in
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1450
                # practice "it works mostly fine".
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1451
                #
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1452
                # Do not be surprised if you end up reading this while looking
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1453
                # for the causes of some buggy status. Feel free to improve
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1454
                # this in the future, but we cannot simply stop gathering
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1455
                # information. Otherwise `hg status` call made after a large `hg
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1456
                # update` runs would have to redo a similar amount of work to
c655483ea6e2 dirstate: add a comment about a racy piece of code during updates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48366
diff changeset
  1457
                # restore and compare all files content.
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1458
                s = wfctx.lstat()
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1459
                mode = s.st_mode
48260
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 47609
diff changeset
  1460
                mtime = timestamp.mtime_of(s)
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 47609
diff changeset
  1461
                # for dirstate.update_file's parentfiledata argument:
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 47609
diff changeset
  1462
                filedata[f] = (mode, size, mtime)
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1463
            if i == 100:
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1464
                yield False, (i, f)
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1465
                i = 0
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1466
            i += 1
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
  1467
    if i > 0:
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1468
        yield False, (i, f)
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1469
    yield True, filedata
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1470
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1471
45335
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45334
diff changeset
  1472
def _prefetchfiles(repo, ctx, mresult):
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37172
diff changeset
  1473
    """Invoke ``scmutil.prefetchfiles()`` for the files relevant to the dict
36142
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36042
diff changeset
  1474
    of merge actions.  ``ctx`` is the context being merged in."""
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36042
diff changeset
  1475
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36042
diff changeset
  1476
    # Skipping 'a', 'am', 'f', 'r', 'dm', 'e', 'k', 'p' and 'pr', because they
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36042
diff changeset
  1477
    # don't touch the context to be merged in.  'cd' is skipped, because
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36042
diff changeset
  1478
    # changed/deleted never resolves to something from the remote side.
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
  1479
    files = mresult.files(
45335
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45334
diff changeset
  1480
        [
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1481
            mergestatemod.ACTION_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1482
            mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1483
            mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1484
            mergestatemod.ACTION_MERGE,
45335
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45334
diff changeset
  1485
        ]
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
  1486
    )
45335
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45334
diff changeset
  1487
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37172
diff changeset
  1488
    prefetch = scmutil.prefetchfiles
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37172
diff changeset
  1489
    matchfiles = scmutil.matchfiles
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1490
    prefetch(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1491
        repo,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1492
        [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1493
            (
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1494
                ctx.rev(),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1495
                matchfiles(repo, files),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1496
            )
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1497
        ],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1498
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1499
34124
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1500
37107
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1501
@attr.s(frozen=True)
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48927
diff changeset
  1502
class updateresult:
37107
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1503
    updatedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1504
    mergedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1505
    removedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1506
    unresolvedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1507
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37112
diff changeset
  1508
    def isempty(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1509
        return not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1510
            self.updatedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1511
            or self.mergedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1512
            or self.removedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1513
            or self.unresolvedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1514
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1515
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37112
diff changeset
  1516
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1517
def applyupdates(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1518
    repo,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1519
    mresult,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1520
    wctx,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1521
    mctx,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1522
    overwrite,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1523
    wantfiledata,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1524
    labels=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1525
):
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1526
    """apply the merge action list to the working directory
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1527
45334
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45333
diff changeset
  1528
    mresult is a mergeresult object representing result of the merge
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1529
    wctx is the working copy context
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1530
    mctx is the context to be merged into the working copy
13162
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
  1531
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1532
    Return a tuple of (counts, filedata), where counts is a tuple
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1533
    (updated, merged, removed, unresolved) that describes how many
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1534
    files were affected by the update, and filedata is as described in
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1535
    batchget.
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1536
    """
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1537
45335
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45334
diff changeset
  1538
    _prefetchfiles(repo, mctx, mresult)
36142
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36042
diff changeset
  1539
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1540
    updated, merged, removed = 0, 0, 0
45499
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45493
diff changeset
  1541
    ms = wctx.mergestate(clean=True)
45493
2c10876bb320 mergestate: make clean() only be about creating a clean mergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45488
diff changeset
  1542
    ms.start(wctx.p1().node(), mctx.node(), labels)
44687
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  1543
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  1544
    for f, op in mresult.commitinfo.items():
45276
cb6a72dc0511 merge: pass commitinfo to applyupdates() and get it stored in mergestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45275
diff changeset
  1545
        # the other side of filenode was choosen while merging, store this in
cb6a72dc0511 merge: pass commitinfo to applyupdates() and get it stored in mergestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45275
diff changeset
  1546
        # mergestate so that it can be reused on commit
45385
05d19ca33b33 mergestate: replace `addmergedother()` with generic `addcommitinfo()` (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45384
diff changeset
  1547
        ms.addcommitinfo(f, op)
45276
cb6a72dc0511 merge: pass commitinfo to applyupdates() and get it stored in mergestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45275
diff changeset
  1548
48713
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48711
diff changeset
  1549
    num_no_op = mresult.len(mergestatemod.MergeAction.NO_OP_ACTIONS)
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48711
diff changeset
  1550
    numupdates = mresult.len() - num_no_op
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1551
    progress = repo.ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1552
        _(b'updating'), unit=_(b'files'), total=numupdates
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1553
    )
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1554
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1555
    if b'.hgsubstate' in mresult._actionmapping[mergestatemod.ACTION_REMOVE]:
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  1556
        subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels)
18632
3e20079117c5 merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents: 18630
diff changeset
  1557
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1558
    # record path conflicts
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1559
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1560
        [mergestatemod.ACTION_PATH_CONFLICT], sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1561
    ):
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1562
        f1, fo = args
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1563
        s = repo.ui.status
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1564
        s(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1565
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1566
                b"%s: path conflict - a file or link has the same name as a "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1567
                b"directory\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1568
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1569
            % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1570
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1571
        if fo == b'l':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1572
            s(_(b"the local file has been renamed to %s\n") % f1)
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1573
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1574
            s(_(b"the remote file has been renamed to %s\n") % f1)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1575
        s(_(b"resolve manually then use 'hg resolve --mark %s'\n") % f)
45159
e05a488cbed0 mergestate: rename addpath() -> addpathonflict() to prevent confusion
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45118
diff changeset
  1576
        ms.addpathconflict(f, f1, fo)
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1577
        progress.increment(item=f)
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1578
34786
9c899660700a merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents: 34680
diff changeset
  1579
    # When merging in-memory, we can't support worker processes, so set the
9c899660700a merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents: 34680
diff changeset
  1580
    # per-item cost at 0 in that case.
9c899660700a merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents: 34680
diff changeset
  1581
    cost = 0 if wctx.isinmemory() else 0.001
9c899660700a merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents: 34680
diff changeset
  1582
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1583
    # remove in parallel (must come before resolving path conflicts and getting)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1584
    prog = worker.worker(
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1585
        repo.ui,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1586
        cost,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1587
        batchremove,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1588
        (repo, wctx),
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1589
        list(mresult.getactions([mergestatemod.ACTION_REMOVE], sort=True)),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1590
    )
19095
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
  1591
    for i, item in prog:
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1592
        progress.increment(step=i, item=item)
45338
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
  1593
    removed = mresult.len((mergestatemod.ACTION_REMOVE,))
21390
26b84128c54d merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents: 21389
diff changeset
  1594
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1595
    # resolve path conflicts (must come before getting)
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1596
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1597
        [mergestatemod.ACTION_PATH_CONFLICT_RESOLVE], sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1598
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1599
        repo.ui.debug(b" %s: %s -> pr\n" % (f, msg))
44939
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44856
diff changeset
  1600
        (f0, origf0) = args
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1601
        if wctx[f0].lexists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1602
            repo.ui.note(_(b"moving %s to %s\n") % (f0, f))
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1603
            wctx[f].audit()
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1604
            wctx[f].write(wctx.filectx(f0).data(), wctx.filectx(f0).flags())
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1605
            wctx[f0].remove()
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1606
        progress.increment(item=f)
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1607
38732
be4984261611 merge: mark file gets as not thread safe (issue5933)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38494
diff changeset
  1608
    # get in parallel.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1609
    threadsafe = repo.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1610
        b'experimental', b'worker.wdir-get-thread-safe'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1611
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1612
    prog = worker.worker(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1613
        repo.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1614
        cost,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1615
        batchget,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1616
        (repo, mctx, wctx, wantfiledata),
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1617
        list(mresult.getactions([mergestatemod.ACTION_GET], sort=True)),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1618
        threadsafe=threadsafe,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1619
        hasretval=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1620
    )
42522
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42456
diff changeset
  1621
    getfiledata = {}
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1622
    for final, res in prog:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1623
        if final:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1624
            getfiledata = res
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1625
        else:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1626
            i, item = res
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1627
            progress.increment(step=i, item=item)
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1628
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1629
    if b'.hgsubstate' in mresult._actionmapping[mergestatemod.ACTION_GET]:
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  1630
        subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels)
18632
3e20079117c5 merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents: 18630
diff changeset
  1631
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1632
    # forget (manifest only, just log it) (must come first)
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1633
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1634
        (mergestatemod.ACTION_FORGET,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1635
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1636
        repo.ui.debug(b" %s: %s -> f\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1637
        progress.increment(item=f)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1638
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1639
    # re-add (manifest only, just log it)
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1640
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1641
        (mergestatemod.ACTION_ADD,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1642
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1643
        repo.ui.debug(b" %s: %s -> a\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1644
        progress.increment(item=f)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1645
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1646
    # re-add/mark as modified (manifest only, just log it)
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1647
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1648
        (mergestatemod.ACTION_ADD_MODIFIED,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1649
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1650
        repo.ui.debug(b" %s: %s -> am\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1651
        progress.increment(item=f)
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1652
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1653
    # keep (noop, just log it)
48713
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48711
diff changeset
  1654
    for a in mergestatemod.MergeAction.NO_OP_ACTIONS:
45524
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
  1655
        for f, args, msg in mresult.getactions((a,), sort=True):
48711
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48708
diff changeset
  1656
            repo.ui.debug(b" %s: %s -> %s\n" % (f, msg, a.__bytes__()))
45524
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
  1657
            # no progress
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1658
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1659
    # directory rename, move local
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1660
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1661
        (mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1662
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1663
        repo.ui.debug(b" %s: %s -> dm\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1664
        progress.increment(item=f)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1665
        f0, flags = args
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1666
        repo.ui.note(_(b"moving %s to %s\n") % (f0, f))
33086
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  1667
        wctx[f].audit()
33083
05c680ebf512 merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com>
parents: 33082
diff changeset
  1668
        wctx[f].write(wctx.filectx(f0).data(), flags)
33082
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33081
diff changeset
  1669
        wctx[f0].remove()
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1670
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1671
    # local directory rename, get
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1672
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1673
        (mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1674
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1675
        repo.ui.debug(b" %s: %s -> dg\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1676
        progress.increment(item=f)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1677
        f0, flags = args
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1678
        repo.ui.note(_(b"getting %s to %s\n") % (f0, f))
33083
05c680ebf512 merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com>
parents: 33082
diff changeset
  1679
        wctx[f].write(mctx.filectx(f0).data(), flags)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1680
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1681
    # exec
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1682
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1683
        (mergestatemod.ACTION_EXEC,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1684
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1685
        repo.ui.debug(b" %s: %s -> e\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1686
        progress.increment(item=f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1687
        (flags,) = args
33086
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  1688
        wctx[f].audit()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1689
        wctx[f].setflags(b'l' in flags, b'x' in flags)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1690
45488
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1691
    moves = []
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1692
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1693
    # 'cd' and 'dc' actions are treated like other merge conflicts
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1694
    mergeactions = list(
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1695
        mresult.getactions(
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1696
            [
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1697
                mergestatemod.ACTION_CHANGED_DELETED,
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1698
                mergestatemod.ACTION_DELETED_CHANGED,
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1699
                mergestatemod.ACTION_MERGE,
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1700
            ],
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1701
            sort=True,
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1702
        )
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1703
    )
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1704
    for f, args, msg in mergeactions:
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1705
        f1, f2, fa, move, anc = args
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1706
        if f == b'.hgsubstate':  # merged internally
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1707
            continue
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1708
        if f1 is None:
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1709
            fcl = filemerge.absentfilectx(wctx, fa)
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1710
        else:
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1711
            repo.ui.debug(b" preserving %s for resolve of %s\n" % (f1, f))
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1712
            fcl = wctx[f1]
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1713
        if f2 is None:
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1714
            fco = filemerge.absentfilectx(mctx, fa)
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1715
        else:
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1716
            fco = mctx[f2]
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1717
        actx = repo[anc]
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1718
        if fa in actx:
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1719
            fca = actx[fa]
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1720
        else:
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1721
            # TODO: move to absentfilectx
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1722
            fca = repo.filectx(f1, fileid=nullrev)
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1723
        ms.add(fcl, fco, fca, f)
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1724
        if f1 != f and move:
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1725
            moves.append(f1)
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1726
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1727
    # remove renamed files after safely stored
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1728
    for f in moves:
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1729
        if wctx[f].lexists():
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1730
            repo.ui.debug(b"removing %s\n" % f)
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1731
            wctx[f].audit()
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1732
            wctx[f].remove()
c4f14db3da1d merge: move initial handling of mergeactions near to later one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45470
diff changeset
  1733
45341
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1734
    # these actions updates the file
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1735
    updated = mresult.len(
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1736
        (
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1737
            mergestatemod.ACTION_GET,
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1738
            mergestatemod.ACTION_EXEC,
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1739
            mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1740
            mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1741
        )
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1742
    )
26786
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1743
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1744
    try:
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1745
        for f, args, msg in mergeactions:
48427
38941a28406a mergestate: merge `preresolve()` into `resolve()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48423
diff changeset
  1746
            repo.ui.debug(b" %s: %s -> m\n" % (f, msg))
46811
5a0b930cfb3e commit: get info from mergestate whether a file was merged or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46794
diff changeset
  1747
            ms.addcommitinfo(f, {b'merged': b'yes'})
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1748
            progress.increment(item=f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1749
            if f == b'.hgsubstate':  # subrepo states need updating
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1750
                subrepoutil.submerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1751
                    repo, wctx, mctx, wctx.ancestor(mctx), overwrite, labels
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1752
                )
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1753
                continue
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1754
            wctx[f].audit()
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1755
            ms.resolve(f, wctx)
26292
007ac1acfcac merge: move merge step to the end
Siddharth Agarwal <sid0@fb.com>
parents: 25959
diff changeset
  1756
48271
5228a6dc212b merge-halt: fix issue with merge.on-failure=halt breaking unshelve
Kyle Lippincott <spectral@google.com>
parents: 47609
diff changeset
  1757
    except error.InterventionRequired:
5228a6dc212b merge-halt: fix issue with merge.on-failure=halt breaking unshelve
Kyle Lippincott <spectral@google.com>
parents: 47609
diff changeset
  1758
        # If the user has merge.on-failure=halt, catch the error and close the
5228a6dc212b merge-halt: fix issue with merge.on-failure=halt breaking unshelve
Kyle Lippincott <spectral@google.com>
parents: 47609
diff changeset
  1759
        # merge state "properly".
5228a6dc212b merge-halt: fix issue with merge.on-failure=halt breaking unshelve
Kyle Lippincott <spectral@google.com>
parents: 47609
diff changeset
  1760
        pass
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1761
    finally:
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1762
        ms.commit()
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1763
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1764
    unresolved = ms.unresolvedcount()
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1765
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1766
    msupdated, msmerged, msremoved = ms.counts()
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1767
    updated += msupdated
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1768
    merged += msmerged
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1769
    removed += msremoved
27080
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
  1770
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
  1771
    extraactions = ms.actions()
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
  1772
38373
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38345
diff changeset
  1773
    progress.complete()
47372
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  1774
    return (
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  1775
        updateresult(updated, merged, removed, unresolved),
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  1776
        getfiledata,
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  1777
        extraactions,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1778
    )
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
  1779
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1780
45167
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1781
def _advertisefsmonitor(repo, num_gets, p1node):
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1782
    # Advertise fsmonitor when its presence could be useful.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1783
    #
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1784
    # We only advertise when performing an update from an empty working
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1785
    # directory. This typically only occurs during initial clone.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1786
    #
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1787
    # We give users a mechanism to disable the warning in case it is
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1788
    # annoying.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1789
    #
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1790
    # We only allow on Linux and MacOS because that's where fsmonitor is
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1791
    # considered stable.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1792
    fsmonitorwarning = repo.ui.configbool(b'fsmonitor', b'warn_when_unused')
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1793
    fsmonitorthreshold = repo.ui.configint(
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1794
        b'fsmonitor', b'warn_update_file_count'
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1795
    )
45462
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1796
    # avoid cycle dirstate -> sparse -> merge -> dirstate
48805
d4486810a179 merge: remove direct rustmod reference
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48757
diff changeset
  1797
    dirstate_rustmod = policy.importrust("dirstate")
45462
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1798
48805
d4486810a179 merge: remove direct rustmod reference
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48757
diff changeset
  1799
    if dirstate_rustmod is not None:
45462
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1800
        # When using rust status, fsmonitor becomes necessary at higher sizes
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1801
        fsmonitorthreshold = repo.ui.configint(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1802
            b'fsmonitor',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  1803
            b'warn_update_file_count_rust',
45462
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1804
        )
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1805
45167
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1806
    try:
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1807
        # avoid cycle: extensions -> cmdutil -> merge
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1808
        from . import extensions
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1809
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1810
        extensions.find(b'fsmonitor')
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1811
        fsmonitorenabled = repo.ui.config(b'fsmonitor', b'mode') != b'off'
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1812
        # We intentionally don't look at whether fsmonitor has disabled
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1813
        # itself because a) fsmonitor may have already printed a warning
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1814
        # b) we only care about the config state here.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1815
    except KeyError:
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1816
        fsmonitorenabled = False
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1817
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1818
    if (
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1819
        fsmonitorwarning
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1820
        and not fsmonitorenabled
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
  1821
        and p1node == repo.nullid
45167
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1822
        and num_gets >= fsmonitorthreshold
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1823
        and pycompat.sysplatform.startswith((b'linux', b'darwin'))
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1824
    ):
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1825
        repo.ui.warn(
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1826
            _(
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1827
                b'(warning: large working directory being used without '
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1828
                b'fsmonitor enabled; enable fsmonitor to improve performance; '
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1829
                b'see "hg help -e fsmonitor")\n'
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1830
            )
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1831
        )
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1832
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1833
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1834
UPDATECHECK_ABORT = b'abort'  # handled at higher layers
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1835
UPDATECHECK_NONE = b'none'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1836
UPDATECHECK_LINEAR = b'linear'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1837
UPDATECHECK_NO_CONFLICT = b'noconflict'
42970
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42959
diff changeset
  1838
52056
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  1839
# Let extensions turn off any Rust code in the update code if that interferes
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  1840
# will their patching.
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  1841
# This being `True` does not mean that you have Rust extensions installed or
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  1842
# that the Rust path will be taken for any given invocation.
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  1843
MAYBE_USE_RUST_UPDATE = True
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  1844
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1845
45557
2c86b9587740 merge: make low-level update() private (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45544
diff changeset
  1846
def _update(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1847
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1848
    node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1849
    branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1850
    force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1851
    ancestor=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1852
    mergeancestor=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1853
    labels=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1854
    matcher=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1855
    mergeforce=False,
44271
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1856
    updatedirstate=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1857
    updatecheck=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1858
    wc=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1859
):
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1860
    """
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1861
    Perform a merge between the working directory and the given node
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1862
30902
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30901
diff changeset
  1863
    node = the node to update to
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1864
    branchmerge = whether to merge between branches
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1865
    force = whether to force branch merging or file overwriting
27344
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27316
diff changeset
  1866
    matcher = a matcher to filter file lists (dirstate not updated)
18778
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
  1867
    mergeancestor = whether it is merging with an ancestor. If true,
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
  1868
      we should accept the incoming changes for any prompts that occur.
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
  1869
      If false, merging with an ancestor (fast-forward) is only allowed
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
  1870
      between different named branches. This flag is used by rebase extension
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
  1871
      as a temporary fix and should be avoided in general.
48757
af9f2c64302e merge: fix documented order of `labels` argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 48746
diff changeset
  1872
    labels = labels to use for local, other, and base
28020
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
  1873
    mergeforce = whether the merge was run with 'merge --force' (deprecated): if
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
  1874
      this is True, then 'force' should be True as well.
9716
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
  1875
34919
1856de4d1297 update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents: 34885
diff changeset
  1876
    The table below shows all the behaviors of the update command given the
1856de4d1297 update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents: 34885
diff changeset
  1877
    -c/--check and -C/--clean or no options, whether the working directory is
1856de4d1297 update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents: 34885
diff changeset
  1878
    dirty, whether a revision is specified, and the relationship of the parent
1856de4d1297 update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents: 34885
diff changeset
  1879
    rev to the target rev (linear or not). Match from top first. The -n
1856de4d1297 update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents: 34885
diff changeset
  1880
    option doesn't exist on the command line, but represents the
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1881
    experimental.updatecheck=noconflict option.
9716
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
  1882
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 12032
diff changeset
  1883
    This logic is tested by test-update-branches.t.
9716
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
  1884
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1885
    -c  -C  -n  -m  dirty  rev  linear  |  result
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1886
     y   y   *   *    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1887
     y   *   y   *    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1888
     y   *   *   y    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1889
     *   y   y   *    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1890
     *   y   *   y    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1891
     *   *   y   y    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1892
     *   *   *   *    *     n     n     |     x
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1893
     *   *   *   *    n     *     *     |    ok
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1894
     n   n   n   n    y     *     y     |   merge
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1895
     n   n   n   n    y     y     n     |    (2)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1896
     n   n   n   y    y     *     *     |   merge
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1897
     n   n   y   n    y     *     *     |  merge if no conflict
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1898
     n   y   n   n    y     *     *     |  discard
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1899
     y   n   n   n    y     *     *     |    (3)
9716
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
  1900
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
  1901
    x = can't happen
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
  1902
    * = don't-care
31161
351207bfdde9 merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents: 31160
diff changeset
  1903
    1 = incompatible options (checked in commands.py)
351207bfdde9 merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents: 31160
diff changeset
  1904
    2 = abort: uncommitted changes (commit or update --clean to discard changes)
351207bfdde9 merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents: 31160
diff changeset
  1905
    3 = abort: uncommitted changes (checked in commands.py)
13162
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
  1906
34302
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1907
    The merge is performed inside ``wc``, a workingctx-like objects. It defaults
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1908
    to repo[None] if None is passed.
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1909
13162
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
  1910
    Return the same tuple as applyupdates().
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1911
    """
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1912
    # Avoid cycle.
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1913
    from . import sparse
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
  1914
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1915
    # This function used to find the default destination if node was None, but
30902
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30901
diff changeset
  1916
    # that's now in destutil.py.
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30901
diff changeset
  1917
    assert node is not None
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1918
    if not branchmerge and not force:
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1919
        # TODO: remove the default once all callers that pass branchmerge=False
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1920
        # and force=False pass a value for updatecheck. We may want to allow
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1921
        # updatecheck='abort' to better suppport some of these callers.
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1922
        if updatecheck is None:
42970
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42959
diff changeset
  1923
            updatecheck = UPDATECHECK_LINEAR
48703
6c4b10d01af0 merge: break up two not-so-one-liner for extra readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48702
diff changeset
  1924
        okay = (UPDATECHECK_NONE, UPDATECHECK_LINEAR, UPDATECHECK_NO_CONFLICT)
6c4b10d01af0 merge: break up two not-so-one-liner for extra readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48702
diff changeset
  1925
        if updatecheck not in okay:
6c4b10d01af0 merge: break up two not-so-one-liner for extra readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48702
diff changeset
  1926
            msg = r'Invalid updatecheck %r (can accept %r)'
6c4b10d01af0 merge: break up two not-so-one-liner for extra readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48702
diff changeset
  1927
            msg %= (updatecheck, okay)
6c4b10d01af0 merge: break up two not-so-one-liner for extra readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48702
diff changeset
  1928
            raise ValueError(msg)
44999
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44939
diff changeset
  1929
    if wc is not None and wc.isinmemory():
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44939
diff changeset
  1930
        maybe_wlock = util.nullcontextmanager()
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44939
diff changeset
  1931
    else:
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44939
diff changeset
  1932
        maybe_wlock = repo.wlock()
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44939
diff changeset
  1933
    with maybe_wlock:
34302
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1934
        if wc is None:
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1935
            wc = repo[None]
20279
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
  1936
        pl = wc.parents()
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
  1937
        p1 = pl[0]
42409
72522fe7fb95 merge: reorder some initialization to make more sense
Martin von Zweigbergk <martinvonz@google.com>
parents: 42163
diff changeset
  1938
        p2 = repo[node]
23405
2a038deeac9a merge: 0 is a valid ancestor different from None
Mads Kiilerich <madski@unity3d.com>
parents: 23398
diff changeset
  1939
        if ancestor is not None:
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
  1940
            pas = [repo[ancestor]]
42410
a5b5ecff5f37 merge: simplify initialization of "pas"
Martin von Zweigbergk <martinvonz@google.com>
parents: 42409
diff changeset
  1941
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1942
            if repo.ui.configlist(b'merge', b'preferancestor') == [b'*']:
21128
f4014f646f71 merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21082
diff changeset
  1943
                cahs = repo.changelog.commonancestorsheads(p1.node(), p2.node())
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
  1944
                pas = [repo[anc] for anc in (sorted(cahs) or [repo.nullid])]
21128
f4014f646f71 merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21082
diff changeset
  1945
            else:
22179
46308fadaa15 merge: show the scary multiple ancestor hint for merges only, not for updates
Mads Kiilerich <madski@unity3d.com>
parents: 21551
diff changeset
  1946
                pas = [p1.ancestor(p2, warn=branchmerge)]
13874
9d67277c9204 merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents: 13728
diff changeset
  1947
36177
187f2474bc11 merge: coerce nodes to bytes, not str
Augie Fackler <augie@google.com>
parents: 36142
diff changeset
  1948
        fp1, fp2, xp1, xp2 = p1.node(), p2.node(), bytes(p1), bytes(p2)
3314
b16456909a0a merge: various tidying
Matt Mackall <mpm@selenic.com>
parents: 3312
diff changeset
  1949
42409
72522fe7fb95 merge: reorder some initialization to make more sense
Martin von Zweigbergk <martinvonz@google.com>
parents: 42163
diff changeset
  1950
        overwrite = force and not branchmerge
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
  1951
        ### check phase
27316
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1952
        if not overwrite:
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1953
            if len(pl) > 1:
46418
dc00324e80f4 errors: use StateError more in merge module
Martin von Zweigbergk <martinvonz@google.com>
parents: 46367
diff changeset
  1954
                raise error.StateError(_(b"outstanding uncommitted merge"))
45499
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45493
diff changeset
  1955
            ms = wc.mergestate()
46361
dfca84970da8 cleanup: use mergestate.unresolvedcount() instead of bool(list(unresolved()))
Augie Fackler <augie@google.com>
parents: 45942
diff changeset
  1956
            if ms.unresolvedcount():
48703
6c4b10d01af0 merge: break up two not-so-one-liner for extra readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48702
diff changeset
  1957
                msg = _(b"outstanding merge conflicts")
6c4b10d01af0 merge: break up two not-so-one-liner for extra readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48702
diff changeset
  1958
                hint = _(b"use 'hg resolve' to resolve")
6c4b10d01af0 merge: break up two not-so-one-liner for extra readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48702
diff changeset
  1959
                raise error.StateError(msg, hint=hint)
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
  1960
        if branchmerge:
48704
58a2c66fa94c merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48703
diff changeset
  1961
            m_a = _(b"merging with a working directory ancestor has no effect")
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
  1962
            if pas == [p2]:
48704
58a2c66fa94c merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48703
diff changeset
  1963
                raise error.Abort(m_a)
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
  1964
            elif pas == [p1]:
31379
b6a6df38a802 merge: check current wc branch for 'nothing to merge', not its p1
Mads Kiilerich <mads@kiilerich.com>
parents: 31323
diff changeset
  1965
                if not mergeancestor and wc.branch() == p2.branch():
48705
bca57b01518f merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48704
diff changeset
  1966
                    msg = _(b"nothing to merge")
bca57b01518f merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48704
diff changeset
  1967
                    hint = _(b"use 'hg update' or check 'hg heads'")
bca57b01518f merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48704
diff changeset
  1968
                    raise error.Abort(msg, hint=hint)
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
  1969
            if not force and (wc.files() or wc.deleted()):
48706
00bfd920169d merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48705
diff changeset
  1970
                msg = _(b"uncommitted changes")
00bfd920169d merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48705
diff changeset
  1971
                hint = _(b"use 'hg status' to list changes")
00bfd920169d merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48705
diff changeset
  1972
                raise error.StateError(msg, hint=hint)
35284
1b03407e808d merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents: 35283
diff changeset
  1973
            if not wc.isinmemory():
1b03407e808d merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents: 35283
diff changeset
  1974
                for s in sorted(wc.substate):
1b03407e808d merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents: 35283
diff changeset
  1975
                    wc.sub(s).bailifchanged()
13437
6169493ac3f9 Do not allow merging with uncommitted changes in a subrepo
Oleg Stepanov <oleg.stepanov@jetbrains.com>
parents: 13400
diff changeset
  1976
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
  1977
        elif not overwrite:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1978
            if p1 == p2:  # no-op update
19929
ab2362e1672e merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 19803
diff changeset
  1979
                # call the hooks and exit early
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1980
                repo.hook(b'preupdate', throw=True, parent1=xp2, parent2=b'')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1981
                repo.hook(b'update', parent1=xp2, parent2=b'', error=0)
37107
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1982
                return updateresult(0, 0, 0, 0)
19929
ab2362e1672e merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 19803
diff changeset
  1983
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1984
            if updatecheck == UPDATECHECK_LINEAR and pas not in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1985
                [p1],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1986
                [p2],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1987
            ):  # nonlinear
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1988
                dirty = wc.dirty(missing=True)
30902
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30901
diff changeset
  1989
                if dirty:
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1990
                    # Branching is a bit strange to ensure we do the minimal
33146
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33095
diff changeset
  1991
                    # amount of call to obsutil.foreground.
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33095
diff changeset
  1992
                    foreground = obsutil.foreground(repo, [p1.node()])
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1993
                    # note: the <node> variable contains a random identifier
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1994
                    if repo[node].node() in foreground:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1995
                        pass  # allow updating to successors
30902
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30901
diff changeset
  1996
                    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1997
                        msg = _(b"uncommitted changes")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1998
                        hint = _(b"commit or update --clean to discard changes")
30961
330fbd515512 destutil: remove duplicate check and leave it to merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30903
diff changeset
  1999
                        raise error.UpdateAbort(msg, hint=hint)
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  2000
                else:
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  2001
                    # Allow jumping branches if clean and specific rev given
30901
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  2002
                    pass
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  2003
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  2004
        if overwrite:
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  2005
            pas = [wc]
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  2006
        elif not branchmerge:
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  2007
            pas = [p1]
2814
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
  2008
25843
bf9ea348b487 merge: mark ancient debugging option
Matt Mackall <mpm@selenic.com>
parents: 25754
diff changeset
  2009
        # deprecated config: merge.followcopies
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2010
        followcopies = repo.ui.configbool(b'merge', b'followcopies')
21080
04540a8499a3 merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents: 21024
diff changeset
  2011
        if overwrite:
30200
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
  2012
            followcopies = False
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
  2013
        elif not pas[0]:
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
  2014
            followcopies = False
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
  2015
        if not branchmerge and not wc.dirty(missing=True):
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
  2016
            followcopies = False
21080
04540a8499a3 merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents: 21024
diff changeset
  2017
52056
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2018
        update_from_null = False
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2019
        update_from_null_fallback = False
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2020
        if (
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2021
            MAYBE_USE_RUST_UPDATE
52057
43e15277498e rust-update: add a config item to disable the Rust update fastpath
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52056
diff changeset
  2022
            and repo.ui.configbool(b"rust", b"update-from-null")
52056
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2023
            and rust_update_mod is not None
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2024
            and p1.rev() == nullrev
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2025
            and not branchmerge
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2026
            # TODO it's probably not too hard to pass down the transaction and
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2027
            # respect the write patterns from Rust. But since it doesn't affect
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2028
            # a simple update from null, then it doesn't matter yet.
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2029
            and repo.currenttransaction() is None
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2030
            and matcher is None
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2031
            and not wc.mergestate().active()
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2032
            and b'.hgsubstate' not in p2
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2033
        ):
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2034
            working_dir_iter = os.scandir(repo.root)
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2035
            maybe_hg_folder = next(working_dir_iter)
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2036
            assert maybe_hg_folder is not None
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2037
            if maybe_hg_folder.name == b".hg":
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2038
                try:
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2039
                    next(working_dir_iter)
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2040
                except StopIteration:
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2041
                    update_from_null = True
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2042
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2043
        if update_from_null:
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2044
            # Check the narrowspec and sparsespec here to display warnings
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2045
            # more easily.
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2046
            # TODO figure out of a way of bubbling up warnings to Python
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2047
            # while not polluting the Rust code (probably a channel)
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2048
            repo.narrowmatch()
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2049
            sparse.matcher(repo, [nullrev, p2.rev()])
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2050
            repo.hook(b'preupdate', throw=True, parent1=xp1, parent2=xp2)
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2051
            # note that we're in the middle of an update
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2052
            repo.vfs.write(b'updatestate', p2.hex())
52186
e6a44bc91bc2 rust-update: make `update_from_null` respect `worker.numcpu` config option
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52057
diff changeset
  2053
            num_cpus = (
e6a44bc91bc2 rust-update: make `update_from_null` respect `worker.numcpu` config option
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52057
diff changeset
  2054
                repo.ui.configint(b"worker", b"numcpus", None)
e6a44bc91bc2 rust-update: make `update_from_null` respect `worker.numcpu` config option
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52057
diff changeset
  2055
                if repo.ui.configbool(b"worker", b"enabled")
e6a44bc91bc2 rust-update: make `update_from_null` respect `worker.numcpu` config option
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52057
diff changeset
  2056
                else 1
e6a44bc91bc2 rust-update: make `update_from_null` respect `worker.numcpu` config option
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52057
diff changeset
  2057
            )
52056
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2058
            try:
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2059
                updated_count = rust_update_mod.update_from_null(
52186
e6a44bc91bc2 rust-update: make `update_from_null` respect `worker.numcpu` config option
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52057
diff changeset
  2060
                    repo.root, p2.rev(), num_cpus
52056
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2061
                )
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2062
            except rust_update_mod.FallbackError:
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2063
                update_from_null_fallback = True
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2064
            else:
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2065
                # We've changed the dirstate from Rust, we need to tell Python
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2066
                repo.dirstate.invalidate()
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2067
                # This includes setting the parents, since they are not read
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2068
                # again on invalidation
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2069
                with repo.dirstate.changing_parents(repo):
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2070
                    repo.dirstate.setparents(fp2)
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2071
                repo.dirstate.setbranch(p2.branch(), repo.currenttransaction())
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2072
                sparse.prunetemporaryincludes(repo)
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2073
                repo.hook(b'update', parent1=xp1, parent2=xp2, error=0)
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2074
                # update completed, clear state
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2075
                util.unlink(repo.vfs.join(b'updatestate'))
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2076
                return updateresult(updated_count, 0, 0, 0)
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2077
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
  2078
        ### calculate phase
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  2079
        mresult = calculateupdates(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2080
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2081
            wc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2082
            p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2083
            pas,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2084
            branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2085
            force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2086
            mergeancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2087
            followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2088
            matcher=matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2089
            mergeforce=mergeforce,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2090
        )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  2091
42970
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42959
diff changeset
  2092
        if updatecheck == UPDATECHECK_NO_CONFLICT:
45278
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
  2093
            if mresult.hasconflicts():
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
  2094
                msg = _(b"conflicting changes")
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
  2095
                hint = _(b"commit or update --clean to discard changes")
46418
dc00324e80f4 errors: use StateError more in merge module
Martin von Zweigbergk <martinvonz@google.com>
parents: 46367
diff changeset
  2096
                raise error.StateError(msg, hint=hint)
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  2097
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  2098
        # Prompt and create actions. Most of this is in the resolve phase
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  2099
        # already, but we can't handle .hgsubstate in filemerge or
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  2100
        # subrepoutil.submerge yet so we have to keep prompting for it.
45344
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
  2101
        vals = mresult.getfile(b'.hgsubstate')
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
  2102
        if vals:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2103
            f = b'.hgsubstate'
45344
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
  2104
            m, args, msg = vals
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29629
diff changeset
  2105
            prompts = filemerge.partextras(labels)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2106
            prompts[b'f'] = f
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2107
            if m == mergestatemod.ACTION_CHANGED_DELETED:
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  2108
                if repo.ui.promptchoice(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2109
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2110
                        b"local%(l)s changed %(f)s which other%(o)s deleted\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2111
                        b"use (c)hanged version or (d)elete?"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2112
                        b"$$ &Changed $$ &Delete"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2113
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2114
                    % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2115
                    0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2116
                ):
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  2117
                    mresult.addfile(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2118
                        f,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2119
                        mergestatemod.ACTION_REMOVE,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2120
                        None,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2121
                        b'prompt delete',
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2122
                    )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  2123
                elif f in p1:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  2124
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  2125
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2126
                        mergestatemod.ACTION_ADD_MODIFIED,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2127
                        None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2128
                        b'prompt keep',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2129
                    )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  2130
                else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  2131
                    mresult.addfile(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2132
                        f,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2133
                        mergestatemod.ACTION_ADD,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2134
                        None,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2135
                        b'prompt keep',
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2136
                    )
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2137
            elif m == mergestatemod.ACTION_DELETED_CHANGED:
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  2138
                f1, f2, fa, move, anc = args
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  2139
                flags = p2[f2].flags()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2140
                if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2141
                    repo.ui.promptchoice(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2142
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2143
                            b"other%(o)s changed %(f)s which local%(l)s deleted\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2144
                            b"use (c)hanged version or leave (d)eleted?"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2145
                            b"$$ &Changed $$ &Deleted"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2146
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2147
                        % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2148
                        0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2149
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2150
                    == 0
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2151
                ):
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  2152
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  2153
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2154
                        mergestatemod.ACTION_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2155
                        (flags, False),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2156
                        b'prompt recreating',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2157
                    )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  2158
                else:
45283
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45282
diff changeset
  2159
                    mresult.removefile(f)
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  2160
29889
6f447b9ec263 util: rename checkcase() to fscasesensitive() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 29831
diff changeset
  2161
        if not util.fscasesensitive(repo.path):
23544
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  2162
            # check collision between files only in p2 for clean update
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2163
            if not branchmerge and (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2164
                force or not wc.dirty(missing=True, branch=False)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2165
            ):
23544
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  2166
                _checkcollision(repo, p2.manifest(), None)
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  2167
            else:
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
  2168
                _checkcollision(repo, wc.manifest(), mresult)
23544
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  2169
23525
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  2170
        # divergent renames
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  2171
        for f, fl in sorted(mresult.diverge.items()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2172
            repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2173
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2174
                    b"note: possible conflict - %s was renamed "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2175
                    b"multiple times to:\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2176
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2177
                % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2178
            )
42110
3a7efcbdf288 copies: print list of divergent renames in sorted order
Martin von Zweigbergk <martinvonz@google.com>
parents: 42057
diff changeset
  2179
            for nf in sorted(fl):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2180
                repo.ui.warn(b" %s\n" % nf)
23525
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  2181
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  2182
        # rename and delete
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  2183
        for f, fl in sorted(mresult.renamedelete.items()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2184
            repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2185
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2186
                    b"note: possible conflict - %s was deleted "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2187
                    b"and renamed to:\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2188
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2189
                % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2190
            )
42110
3a7efcbdf288 copies: print list of divergent renames in sorted order
Martin von Zweigbergk <martinvonz@google.com>
parents: 42057
diff changeset
  2191
            for nf in sorted(fl):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2192
                repo.ui.warn(b" %s\n" % nf)
23525
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  2193
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  2194
        ### apply phase
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2195
        if not branchmerge:  # just jump to the new rev
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
  2196
            fp1, fp2, xp1, xp2 = fp2, repo.nullid, xp2, b''
44165
ae9310709c13 merge: move definition of `partial` closer to where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 44151
diff changeset
  2197
        # If we're doing a partial update, we need to skip updating
44166
faec51c76b7b merge: avoid a negation in the definition of updatedirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44165
diff changeset
  2198
        # the dirstate.
faec51c76b7b merge: avoid a negation in the definition of updatedirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44165
diff changeset
  2199
        always = matcher is None or matcher.always()
44271
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2200
        updatedirstate = updatedirstate and always and not wc.isinmemory()
52056
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2201
        # If we're in the fallback case, we've already done this
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2202
        if updatedirstate and not update_from_null_fallback:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2203
            repo.hook(b'preupdate', throw=True, parent1=xp1, parent2=xp2)
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  2204
            # note that we're in the middle of an update
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2205
            repo.vfs.write(b'updatestate', p2.hex())
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  2206
52056
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2207
        # TODO don't run if Rust is available
45167
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  2208
        _advertisefsmonitor(
45338
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
  2209
            repo, mresult.len((mergestatemod.ACTION_GET,)), p1.node()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2210
        )
34885
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  2211
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  2212
        wantfiledata = updatedirstate and not branchmerge
47372
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  2213
        stats, getfiledata, extraactions = applyupdates(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2214
            repo,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2215
            mresult,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2216
            wc,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2217
            p2,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2218
            overwrite,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2219
            wantfiledata,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45940
diff changeset
  2220
            labels=labels,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2221
        )
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  2222
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  2223
        if updatedirstate:
47372
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  2224
            if extraactions:
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  2225
                for k, acts in extraactions.items():
47372
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  2226
                    for a in acts:
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  2227
                        mresult.addfile(a[0], k, *a[1:])
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  2228
                    if k == mergestatemod.ACTION_GET and wantfiledata:
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  2229
                        # no filedata until mergestate is updated to provide it
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  2230
                        for a in acts:
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  2231
                            getfiledata[a[0]] = None
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  2232
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  2233
            assert len(getfiledata) == (
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  2234
                mresult.len((mergestatemod.ACTION_GET,)) if wantfiledata else 0
9e6e12e1a87e merge: make applyupdates() not mutate mresult argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  2235
            )
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
  2236
            with repo.dirstate.changing_parents(repo):
48380
6dc3dc5e9636 update: filter the ambiguous mtime in update directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48377
diff changeset
  2237
                if getfiledata:
52054
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2238
                    getfiledata = filter_ambiguous_files(repo, getfiledata)
48380
6dc3dc5e9636 update: filter the ambiguous mtime in update directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48377
diff changeset
  2239
32351
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  2240
                repo.setparents(fp1, fp2)
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2241
                mergestatemod.recordupdates(
45334
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45333
diff changeset
  2242
                    repo, mresult.actionsdict, branchmerge, getfiledata
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2243
                )
32351
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  2244
                if not branchmerge:
50260
e60f9168263c branch: pass current transaction when writing branch in merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
  2245
                    repo.dirstate.setbranch(
e60f9168263c branch: pass current transaction when writing branch in merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
  2246
                        p2.branch(), repo.currenttransaction()
e60f9168263c branch: pass current transaction when writing branch in merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
  2247
                    )
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10431
diff changeset
  2248
52056
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2249
                # update completed, clear state
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2250
                util.unlink(repo.vfs.join(b'updatestate'))
8b7123c8947b update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52055
diff changeset
  2251
47609
c8d6e23fb14a sparse: adjust the temporary includes within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47372
diff changeset
  2252
                # If we're updating to a location, clean up any stale temporary includes
c8d6e23fb14a sparse: adjust the temporary includes within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47372
diff changeset
  2253
                # (ex: this happens during hg rebase --abort).
c8d6e23fb14a sparse: adjust the temporary includes within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47372
diff changeset
  2254
                if not branchmerge:
c8d6e23fb14a sparse: adjust the temporary includes within a `parentchange` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47372
diff changeset
  2255
                    sparse.prunetemporaryincludes(repo)
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  2256
44150
ff22c76825b9 merge: don't call update hook when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 44092
diff changeset
  2257
    if updatedirstate:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2258
        repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2259
            b'update', parent1=xp1, parent2=xp2, error=stats.unresolvedcount
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2260
        )
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10431
diff changeset
  2261
    return stats
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2262
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2263
52054
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2264
# filename -> (mode, size, timestamp)
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2265
FileData = Dict[bytes, Optional[Tuple[int, int, Optional[timestamp.timestamp]]]]
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2266
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2267
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2268
def filter_ambiguous_files(repo, file_data: FileData) -> Optional[FileData]:
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2269
    """We've gathered "cache" information for the clean files while updating
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2270
    them: their mtime, size and mode.
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2271
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2272
    At the time this comment is written, there are various issues with how we
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2273
    gather the `mode` and `mtime` information (see the comment in `batchget`).
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2274
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2275
    We are going to smooth one of these issues here: mtime ambiguity.
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2276
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2277
    i.e. even if the mtime gathered during `batchget` was correct[1] a change
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2278
    happening right after it could change the content while keeping
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2279
    the same mtime[2].
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2280
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2281
    When we reach the current code, the "on disk" part of the update operation
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2282
    is finished. We still assume that no other process raced that "on disk"
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2283
    part, but we want to at least prevent later file changes to alter the
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2284
    contents of the file right after the update operation so quickly that the
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2285
    same mtime is recorded for the operation.
52055
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2286
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2287
    To prevent such ambiguities from happenning, we will do (up to) two things:
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2288
        - wait until the filesystem clock has ticked
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2289
        - only keep the "file data" for files with mtimes that are strictly in
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2290
          the past, i.e. whose mtime is strictly lower than the current time.
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2291
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2292
    We only wait for the system clock to tick if using dirstate-v2, since v1
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2293
    only has second-level granularity and waiting for a whole second is
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2294
    too much of a penalty in the general case.
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2295
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2296
    Although we're assuming that people running dirstate-v2 on Linux
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2297
    don't have a second-granularity FS (with the exclusion of NFS), users
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2298
    can be surprising, and at some point in the future, dirstate-v2 will become
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2299
    the default. To that end, we limit the wait time to 100ms and fall back
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2300
    to the filtering method in case of a timeout.
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2301
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2302
    +------------+------+--------------+
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2303
    |   version  | wait | filter level |
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2304
    +------------+------+--------------+
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2305
    |     V1     | No   | Second       |
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2306
    |     V2     | Yes  | Nanosecond   |
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2307
    | V2-slow-fs | No   | Second       |
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2308
    +------------+------+--------------+
52054
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2309
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2310
    This protects us from race conditions from operations that could run right
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2311
    after this one, especially other Mercurial operations that could be waiting
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2312
    for the wlock to touch files contents and the dirstate.
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2313
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2314
    In an ideal world, we could only get reliable information in `getfiledata`
52055
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2315
    (from `getbatch`), however this filtering approach has been a successful
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2316
    compromise for many years. A patch series of the linux kernel might change
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2317
    this in 6.12³.
52054
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2318
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2319
    At the time this comment is written, not using any "cache" file data at all
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2320
    here would not be viable, as it would result is a very large amount of work
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2321
    (equivalent to the previous `hg update` during the next status after an
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2322
    update).
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2323
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2324
    [1] the current code cannot grantee that the `mtime` and `mode`
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2325
    are correct, but the result is "okay in practice".
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2326
    (see the comment in `batchget`)
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2327
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2328
    [2] using nano-second precision can greatly help here because it makes the
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2329
    "different write with same mtime" issue virtually vanish. However,
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2330
    dirstate v1 cannot store such precision and a bunch of python-runtime,
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2331
    operating-system and filesystem parts do not provide us with such
52055
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2332
    precision, so we have to operate as if it wasn't available.
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2333
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2334
    [3] https://lore.kernel.org/all/20241002-mgtime-v10-8-d1c4717f5284@kernel.org
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2335
    """
52054
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2336
    ambiguous_mtime: FileData = {}
52055
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2337
    dirstate_v2 = repo.dirstate._use_dirstate_v2
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2338
    fs_now_result = None
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2339
    fast_enough_fs = True
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2340
    if dirstate_v2:
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2341
        fstype = util.getfstype(repo.vfs.base)
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2342
        # Exclude NFS right off the bat
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2343
        fast_enough_fs = fstype != b'nfs'
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2344
        if fstype is not None and fast_enough_fs:
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2345
            fs_now_result = timestamp.wait_until_fs_tick(repo.vfs)
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2346
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2347
    if fs_now_result is None:
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2348
        try:
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2349
            now = timestamp.get_fs_now(repo.vfs)
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2350
            fs_now_result = (now, False)
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2351
        except OSError:
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2352
            pass
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2353
52054
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2354
    if fs_now_result is None:
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2355
        # we can't write to the FS, so we won't actually update
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2356
        # the dirstate content anyway, no need to put cache
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2357
        # information.
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2358
        return None
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2359
    else:
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2360
        now, timed_out = fs_now_result
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2361
        if timed_out:
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2362
            fast_enough_fs = False
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2363
        for f, m in file_data.items():
52055
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2364
            if m is not None:
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2365
                reliable = timestamp.make_mtime_reliable(m[2], now)
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2366
                if reliable is None or (
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2367
                    reliable[2] and (not dirstate_v2 or not fast_enough_fs)
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2368
                ):
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2369
                    # Either it's not reliable, or it's second ambiguous
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2370
                    # and we're in dirstate-v1 or in a slow fs, so discard
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2371
                    # the mtime.
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2372
                    ambiguous_mtime[f] = (m[0], m[1], None)
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2373
                elif reliable[2]:
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2374
                    # We need to remember that this time is "second ambiguous"
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2375
                    # otherwise the next status might miss a subsecond change
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2376
                    # if its "stat" doesn't provide nanoseconds.
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2377
                    #
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2378
                    # TODO make osutil.c understand nanoseconds when possible
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2379
                    # (see timestamp.py for the same note)
b332ae615714 merge: improve working-copy mtime race handling
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52054
diff changeset
  2380
                    ambiguous_mtime[f] = (m[0], m[1], reliable)
52054
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2381
        for f, m in ambiguous_mtime.items():
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2382
            file_data[f] = m
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2383
    return file_data
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2384
f5742367a279 merge: move the filtering of ambiguous files to a dedicated function
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51859
diff changeset
  2385
44399
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2386
def merge(ctx, labels=None, force=False, wc=None):
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2387
    """Merge another topological branch into the working copy.
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2388
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2389
    force = whether the merge was run with 'merge --force' (deprecated)
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2390
    """
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2391
45557
2c86b9587740 merge: make low-level update() private (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45544
diff changeset
  2392
    return _update(
44399
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2393
        ctx.repo(),
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2394
        ctx.rev(),
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2395
        labels=labels,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2396
        branchmerge=True,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2397
        force=force,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2398
        mergeforce=force,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2399
        wc=wc,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2400
    )
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2401
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2402
45576
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2403
def update(ctx, updatecheck=None, wc=None):
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2404
    """Do a regular update to the given commit, aborting if there are conflicts.
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2405
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2406
    The 'updatecheck' argument can be used to control what to do in case of
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2407
    conflicts.
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2408
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2409
    Note: This is a new, higher-level update() than the one that used to exist
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2410
    in this module. That function is now called _update(). You can hopefully
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2411
    replace your callers to use this new update(), or clean_update(), merge(),
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2412
    revert_to(), or graft().
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2413
    """
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2414
    return _update(
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2415
        ctx.repo(),
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2416
        ctx.rev(),
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2417
        branchmerge=False,
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2418
        force=False,
48590
7e503eff3c76 update: set custom conflict label for base commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 48450
diff changeset
  2419
        labels=[b'working copy', b'destination', b'working copy parent'],
45576
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2420
        updatecheck=updatecheck,
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2421
        wc=wc,
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2422
    )
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2423
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
  2424
44270
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2425
def clean_update(ctx, wc=None):
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2426
    """Do a clean update to the given commit.
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2427
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2428
    This involves updating to the commit and discarding any changes in the
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2429
    working copy.
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2430
    """
45557
2c86b9587740 merge: make low-level update() private (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45544
diff changeset
  2431
    return _update(ctx.repo(), ctx.rev(), branchmerge=False, force=True, wc=wc)
44270
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2432
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2433
44271
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2434
def revert_to(ctx, matcher=None, wc=None):
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2435
    """Revert the working copy to the given commit.
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2436
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2437
    The working copy will keep its current parent(s) but its content will
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2438
    be the same as in the given commit.
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2439
    """
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2440
45557
2c86b9587740 merge: make low-level update() private (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45544
diff changeset
  2441
    return _update(
44271
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2442
        ctx.repo(),
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2443
        ctx.rev(),
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2444
        branchmerge=False,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2445
        force=True,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2446
        updatedirstate=False,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2447
        matcher=matcher,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2448
        wc=wc,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2449
    )
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2450
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2451
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2452
def graft(
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2453
    repo,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2454
    ctx,
44212
cb8b67016110 graft: default `base` argument to common case of `ctx.p1()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44211
diff changeset
  2455
    base=None,
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2456
    labels=None,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2457
    keepparent=False,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2458
    keepconflictparent=False,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2459
    wctx=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2460
):
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2461
    """Do a graft-like merge.
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2462
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2463
    This is a merge where the merge ancestor is chosen such that one
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2464
    or more changesets are grafted onto the current changeset. In
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2465
    addition to the merge, this fixes up the dirstate to include only
27267
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  2466
    a single parent (if keepparent is False) and tries to duplicate any
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  2467
    renames/copies appropriately.
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2468
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2469
    ctx - changeset to rebase
44212
cb8b67016110 graft: default `base` argument to common case of `ctx.p1()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44211
diff changeset
  2470
    base - merge base, or ctx.p1() if not specified
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2471
    labels - merge labels eg ['local', 'graft']
27267
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  2472
    keepparent - keep second parent if any
42412
127937874395 merge: correct argument name in docstring
Anton Shestakov <av6@dwimlabs.net>
parents: 42410
diff changeset
  2473
    keepconflictparent - if unresolved, keep parent used for the merge
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2474
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2475
    """
24643
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
  2476
    # If we're grafting a descendant onto an ancestor, be sure to pass
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
  2477
    # mergeancestor=True to update. This does two things: 1) allows the merge if
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
  2478
    # the destination is the same as the parent of the ctx (so we can use graft
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
  2479
    # to copy commits), and 2) informs update that the incoming changes are
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
  2480
    # newer than the destination so it doesn't prompt about "remote changed foo
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
  2481
    # which local deleted".
44383
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44289
diff changeset
  2482
    # We also pass mergeancestor=True when base is the same revision as p1. 2)
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44289
diff changeset
  2483
    # doesn't matter as there can't possibly be conflicts, but 1) is necessary.
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2484
    wctx = wctx or repo[None]
44089
bd22e90c54b3 graft: extract repo[None] to a variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 44060
diff changeset
  2485
    pctx = wctx.p1()
44212
cb8b67016110 graft: default `base` argument to common case of `ctx.p1()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44211
diff changeset
  2486
    base = base or ctx.p1()
44383
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44289
diff changeset
  2487
    mergeancestor = (
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44289
diff changeset
  2488
        repo.changelog.isancestor(pctx.node(), ctx.node())
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44289
diff changeset
  2489
        or pctx.rev() == base.rev()
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44289
diff changeset
  2490
    )
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2491
45557
2c86b9587740 merge: make low-level update() private (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45544
diff changeset
  2492
    stats = _update(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2493
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2494
        ctx.node(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2495
        True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2496
        True,
43796
ebfd349eac46 graft: rename `pctx` argument to `base` since that's what it is
Martin von Zweigbergk <martinvonz@google.com>
parents: 43787
diff changeset
  2497
        base.node(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2498
        mergeancestor=mergeancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2499
        labels=labels,
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2500
        wc=wctx,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2501
    )
38494
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2502
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2503
    if keepconflictparent and stats.unresolvedcount:
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2504
        pother = ctx.node()
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2505
    else:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
  2506
        pother = repo.nullid
38494
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2507
        parents = ctx.parents()
43796
ebfd349eac46 graft: rename `pctx` argument to `base` since that's what it is
Martin von Zweigbergk <martinvonz@google.com>
parents: 43787
diff changeset
  2508
        if keepparent and len(parents) == 2 and base in parents:
ebfd349eac46 graft: rename `pctx` argument to `base` since that's what it is
Martin von Zweigbergk <martinvonz@google.com>
parents: 43787
diff changeset
  2509
            parents.remove(base)
38494
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2510
            pother = parents[0].node()
43798
32d11a23c9cf graft: never set both parents equal in the dirstate (issue6098)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43797
diff changeset
  2511
    # Never set both parents equal to each other
32d11a23c9cf graft: never set both parents equal in the dirstate (issue6098)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43797
diff changeset
  2512
    if pother == pctx.node():
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
  2513
        pother = repo.nullid
27267
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  2514
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2515
    if wctx.isinmemory():
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2516
        wctx.setparents(pctx.node(), pother)
32351
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  2517
        # fix up dirstate for copies and renames
44092
833210fbd900 graftcopies: remove `skip` and `repo` arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 44090
diff changeset
  2518
        copies.graftcopies(wctx, ctx, base)
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2519
    else:
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
  2520
        with repo.dirstate.changing_parents(repo):
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2521
            repo.setparents(pctx.node(), pother)
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2522
            repo.dirstate.write(repo.currenttransaction())
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2523
            # fix up dirstate for copies and renames
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2524
            copies.graftcopies(wctx, ctx, base)
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2525
    return stats
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2526
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2527
45544
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2528
def back_out(ctx, parent=None, wc=None):
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2529
    if parent is None:
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2530
        if ctx.p2() is not None:
48707
48aff31e7f4c merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48706
diff changeset
  2531
            msg = b"must specify parent of merge commit to back out"
48aff31e7f4c merge: break up a not-so-one-liner for readability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48706
diff changeset
  2532
            raise error.ProgrammingError(msg)
45544
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2533
        parent = ctx.p1()
45557
2c86b9587740 merge: make low-level update() private (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45544
diff changeset
  2534
    return _update(
45544
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2535
        ctx.repo(),
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2536
        parent,
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2537
        branchmerge=True,
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2538
        force=True,
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2539
        ancestor=ctx.node(),
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2540
        mergeancestor=False,
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2541
    )
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2542
2b339c6c6e99 merge: add a back_out() function to encapsulate update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45525
diff changeset
  2543
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2544
def purge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2545
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2546
    matcher,
44289
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44287
diff changeset
  2547
    unknown=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2548
    ignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2549
    removeemptydirs=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2550
    removefiles=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2551
    abortonerror=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2552
    noop=False,
46366
135056e8b5a8 purge: add a --confirm option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46361
diff changeset
  2553
    confirm=False,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2554
):
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2555
    """Purge the working directory of untracked files.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2556
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2557
    ``matcher`` is a matcher configured to scan the working directory -
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2558
    potentially a subset.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2559
44289
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44287
diff changeset
  2560
    ``unknown`` controls whether unknown files should be purged.
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44287
diff changeset
  2561
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44287
diff changeset
  2562
    ``ignored`` controls whether ignored files should be purged.
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2563
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2564
    ``removeemptydirs`` controls whether empty directories should be removed.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2565
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2566
    ``removefiles`` controls whether files are removed.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2567
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2568
    ``abortonerror`` causes an exception to be raised if an error occurs
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2569
    deleting a file or directory.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2570
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2571
    ``noop`` controls whether to actually remove files. If not defined, actions
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2572
    will be taken.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2573
46366
135056e8b5a8 purge: add a --confirm option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46361
diff changeset
  2574
    ``confirm`` ask confirmation before actually removing anything.
135056e8b5a8 purge: add a --confirm option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46361
diff changeset
  2575
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2576
    Returns an iterable of relative paths in the working directory that were
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2577
    or would be removed.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2578
    """
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2579
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2580
    def remove(removefn, path):
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2581
        try:
39464
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39463
diff changeset
  2582
            removefn(path)
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2583
        except OSError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2584
            m = _(b'%s cannot be removed') % path
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2585
            if abortonerror:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2586
                raise error.Abort(m)
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2587
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2588
                repo.ui.warn(_(b'warning: %s\n') % m)
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2589
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2590
    # There's no API to copy a matcher. So mutate the passed matcher and
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2591
    # restore it when we're done.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2592
    oldtraversedir = matcher.traversedir
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2593
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2594
    res = []
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2595
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2596
    try:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2597
        if removeemptydirs:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2598
            directories = []
43713
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43633
diff changeset
  2599
            matcher.traversedir = directories.append
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2600
44289
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44287
diff changeset
  2601
        status = repo.status(match=matcher, ignored=ignored, unknown=unknown)
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2602
46366
135056e8b5a8 purge: add a --confirm option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46361
diff changeset
  2603
        if confirm:
49352
0cc5f74ff7f0 purge: prevent a silly crash with --confirm --files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48805
diff changeset
  2604
            msg = None
46366
135056e8b5a8 purge: add a --confirm option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46361
diff changeset
  2605
            nb_ignored = len(status.ignored)
48423
fff5942d445f typo: s/unkown/unknown across the codebase
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48380
diff changeset
  2606
            nb_unknown = len(status.unknown)
fff5942d445f typo: s/unkown/unknown across the codebase
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48380
diff changeset
  2607
            if nb_unknown and nb_ignored:
fff5942d445f typo: s/unkown/unknown across the codebase
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48380
diff changeset
  2608
                msg = _(b"permanently delete %d unknown and %d ignored files?")
fff5942d445f typo: s/unkown/unknown across the codebase
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48380
diff changeset
  2609
                msg %= (nb_unknown, nb_ignored)
fff5942d445f typo: s/unkown/unknown across the codebase
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48380
diff changeset
  2610
            elif nb_unknown:
fff5942d445f typo: s/unkown/unknown across the codebase
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48380
diff changeset
  2611
                msg = _(b"permanently delete %d unknown files?")
fff5942d445f typo: s/unkown/unknown across the codebase
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48380
diff changeset
  2612
                msg %= nb_unknown
46366
135056e8b5a8 purge: add a --confirm option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46361
diff changeset
  2613
            elif nb_ignored:
135056e8b5a8 purge: add a --confirm option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46361
diff changeset
  2614
                msg = _(b"permanently delete %d ignored files?")
135056e8b5a8 purge: add a --confirm option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46361
diff changeset
  2615
                msg %= nb_ignored
46367
57370e7deb7b purge: also deal with directory with --confirm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46366
diff changeset
  2616
            elif removeemptydirs:
57370e7deb7b purge: also deal with directory with --confirm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46366
diff changeset
  2617
                dir_count = 0
57370e7deb7b purge: also deal with directory with --confirm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46366
diff changeset
  2618
                for f in directories:
57370e7deb7b purge: also deal with directory with --confirm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46366
diff changeset
  2619
                    if matcher(f) and not repo.wvfs.listdir(f):
57370e7deb7b purge: also deal with directory with --confirm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46366
diff changeset
  2620
                        dir_count += 1
57370e7deb7b purge: also deal with directory with --confirm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46366
diff changeset
  2621
                if dir_count:
57370e7deb7b purge: also deal with directory with --confirm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46366
diff changeset
  2622
                    msg = _(
57370e7deb7b purge: also deal with directory with --confirm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46366
diff changeset
  2623
                        b"permanently delete at least %d empty directories?"
57370e7deb7b purge: also deal with directory with --confirm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46366
diff changeset
  2624
                    )
57370e7deb7b purge: also deal with directory with --confirm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46366
diff changeset
  2625
                    msg %= dir_count
49352
0cc5f74ff7f0 purge: prevent a silly crash with --confirm --files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48805
diff changeset
  2626
            if msg is None:
0cc5f74ff7f0 purge: prevent a silly crash with --confirm --files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48805
diff changeset
  2627
                return res
0cc5f74ff7f0 purge: prevent a silly crash with --confirm --files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48805
diff changeset
  2628
            else:
0cc5f74ff7f0 purge: prevent a silly crash with --confirm --files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48805
diff changeset
  2629
                msg += b" (yN)$$ &Yes $$ &No"
0cc5f74ff7f0 purge: prevent a silly crash with --confirm --files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48805
diff changeset
  2630
                if repo.ui.promptchoice(msg, default=1) == 1:
0cc5f74ff7f0 purge: prevent a silly crash with --confirm --files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48805
diff changeset
  2631
                    raise error.CanceledError(_(b'removal cancelled'))
46366
135056e8b5a8 purge: add a --confirm option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46361
diff changeset
  2632
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2633
        if removefiles:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2634
            for f in sorted(status.unknown + status.ignored):
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2635
                if not noop:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2636
                    repo.ui.note(_(b'removing file %s\n') % f)
39464
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39463
diff changeset
  2637
                    remove(repo.wvfs.unlink, f)
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2638
                res.append(f)
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2639
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2640
        if removeemptydirs:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2641
            for f in sorted(directories, reverse=True):
39464
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39463
diff changeset
  2642
                if matcher(f) and not repo.wvfs.listdir(f):
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2643
                    if not noop:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2644
                        repo.ui.note(_(b'removing directory %s\n') % f)
39464
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39463
diff changeset
  2645
                        remove(repo.wvfs.rmdir, f)
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2646
                    res.append(f)
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2647
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2648
        return res
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2649
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2650
    finally:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2651
        matcher.traversedir = oldtraversedir