mercurial/merge.py
author Yuya Nishihara <yuya@tcha.org>
Mon, 29 Jun 2020 20:53:32 +0900
changeset 45034 4a503c1b664a
parent 45019 d1471dbbdd63
child 45073 a56ba57c837d
permissions -rw-r--r--
merge with stable
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
#
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
     3
# Copyright 2006, 2007 Matt Mackall <mpm@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
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
     8
from __future__ import absolute_import
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
     9
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    10
import errno
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
    11
import stat
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
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    13
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    14
from .i18n import _
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    15
from .node import (
30371
1070df141718 dirstate: change added/modified placeholder hash length to 20 bytes
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
    16
    addednodeid,
30372
3c6893ba2d36 merge: change modified indicator to be 20 bytes
Durham Goode <durham@fb.com>
parents: 30371
diff changeset
    17
    modifiednodeid,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    18
    nullid,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    19
    nullrev,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    20
)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
    21
from .thirdparty import attr
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    22
from . import (
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    23
    copies,
39823
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39481
diff changeset
    24
    encoding,
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26570
diff changeset
    25
    error,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    26
    filemerge,
31267
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31185
diff changeset
    27
    match as matchmod,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
    28
    mergestate as mergestatemod,
33152
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33107
diff changeset
    29
    obsutil,
43677
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
    30
    pathutil,
30528
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30495
diff changeset
    31
    pycompat,
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
    32
    scmutil,
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
    33
    subrepoutil,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    34
    util,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    35
    worker,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    36
)
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
    37
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    38
_pack = struct.pack
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    39
_unpack = struct.unpack
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    40
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
    41
27740
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
    42
def _getcheckunknownconfig(repo, section, name):
34522
bed1d2eaa108 configitems: register 'merge.checkunknown' and 'merge.checkignored'
Boris Feld <boris.feld@octobus.net>
parents: 34486
diff changeset
    43
    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
    44
    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
    45
    if config not in valid:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    46
        validstr = b', '.join([b"'" + v + b"'" for v in valid])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
    47
        raise error.ConfigError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
    48
            _(b"%s.%s not valid ('%s' is none of %s)")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
    49
            % (section, name, config, validstr)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
    50
        )
27740
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
    51
    return config
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
    52
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
    53
23653
0297d8469350 merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents: 23652
diff changeset
    54
def _checkunknownfile(repo, wctx, mctx, f, f2=None):
35297
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
    55
    if wctx.isinmemory():
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
    56
        # 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: 35293
diff changeset
    57
        # unknown file.
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
    58
        #
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
    59
        # 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: 35293
diff changeset
    60
        # because that function does other useful work.
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
    61
        return False
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
    62
23653
0297d8469350 merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents: 23652
diff changeset
    63
    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
    64
        f2 = f
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
    65
    return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
    66
        repo.wvfs.audit.check(f)
28088
19424f960bf5 checkunknown: audit path before checking if it's a file or link
Durham Goode <durham@fb.com>
parents: 28022
diff changeset
    67
        and repo.wvfs.isfileorlink(f)
16284
2b0a406d3043 merge: fix unknown file merge detection for case-folding systems
Matt Mackall <mpm@selenic.com>
parents: 16261
diff changeset
    68
        and repo.dirstate.normalize(f) not in repo.dirstate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
    69
        and mctx[f2].cmp(wctx[f])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
    70
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
    71
16093
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16092
diff changeset
    72
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    73
class _unknowndirschecker(object):
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    74
    """
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    75
    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
    76
    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
    77
    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
    78
    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
    79
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    80
    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
    81
    no conflict.
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    82
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
    83
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    84
    def __init__(self):
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    85
        # 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
    86
        # 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
    87
        # to be safe.
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    88
        self._unknowndircache = set()
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    89
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    90
        # 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
    91
        # 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
    92
        # 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
    93
        self._missingdircache = set()
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    94
35297
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
    95
    def __call__(self, repo, wctx, f):
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
    96
        if wctx.isinmemory():
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
    97
            # 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: 35293
diff changeset
    98
            return False
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
    99
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   100
        # Check for path prefixes that exist as unknown files.
43677
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
   101
        for p in reversed(list(pathutil.finddirs(f))):
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   102
            if p in self._missingdircache:
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   103
                return
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   104
            if p in self._unknowndircache:
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   105
                continue
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   106
            if repo.wvfs.audit.check(p):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   107
                if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   108
                    repo.wvfs.isfileorlink(p)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   109
                    and repo.dirstate.normalize(p) not in repo.dirstate
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   110
                ):
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   111
                    return p
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   112
                if not repo.wvfs.lexists(p):
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   113
                    self._missingdircache.add(p)
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   114
                    return
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   115
                self._unknowndircache.add(p)
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   116
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   117
        # 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
   118
        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
   119
            # 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
   120
            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
   121
                for fn in files:
37089
658b1d28813c merge: pconvert paths in _unknowndirschecker before dirstate-normalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 36566
diff changeset
   122
                    relf = util.pconvert(repo.wvfs.reljoin(p, fn))
37090
e4640ec346ac merge: add 'isknown=True' to a dirstate.normalize() in _unknowndirschecker
Matt Harbison <matt_harbison@yahoo.com>
parents: 37089
diff changeset
   123
                    relf = repo.dirstate.normalize(relf, isknown=True)
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   124
                    if relf not in repo.dirstate:
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   125
                        return f
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   126
        return None
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
   127
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   128
28020
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
   129
def _checkunknownfiles(repo, wctx, mctx, force, actions, mergeforce):
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   130
    """
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   131
    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
   132
    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
   133
    choose a different action.
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   134
    """
34551
1609a5afc4f5 merge: rename conflicts to fileconflicts in _checkunknownfiles
Mark Thomas <mbthomas@fb.com>
parents: 34550
diff changeset
   135
    fileconflicts = set()
34552
33c8a6837181 merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34551
diff changeset
   136
    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
   137
    warnconflicts = set()
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   138
    abortconflicts = set()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   139
    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
   140
    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
   141
    pathconfig = repo.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   142
        b'experimental', b'merge.checkpathconflicts'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   143
    )
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   144
    if not force:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   145
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   146
        def collectconflicts(conflicts, config):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   147
            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
   148
                abortconflicts.update(conflicts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   149
            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
   150
                warnconflicts.update(conflicts)
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   151
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   152
        checkunknowndirs = _unknowndirschecker()
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
   153
        for f, (m, args, msg) in pycompat.iteritems(actions):
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   154
            if m in (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   155
                mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   156
                mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   157
            ):
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   158
                if _checkunknownfile(repo, wctx, mctx, f):
34551
1609a5afc4f5 merge: rename conflicts to fileconflicts in _checkunknownfiles
Mark Thomas <mbthomas@fb.com>
parents: 34550
diff changeset
   159
                    fileconflicts.add(f)
34941
37450a122128 merge: add a config option to disable path conflict checking
Siddharth Agarwal <sid0@fb.com>
parents: 34919
diff changeset
   160
                elif pathconfig and f not in wctx:
35297
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
   161
                    path = checkunknowndirs(repo, wctx, f)
34552
33c8a6837181 merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34551
diff changeset
   162
                    if path is not None:
33c8a6837181 merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34551
diff changeset
   163
                        pathconflicts.add(path)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   164
            elif m == mergestatemod.ACTION_LOCAL_DIR_RENAME_GET:
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   165
                if _checkunknownfile(repo, wctx, mctx, f, args[0]):
34551
1609a5afc4f5 merge: rename conflicts to fileconflicts in _checkunknownfiles
Mark Thomas <mbthomas@fb.com>
parents: 34550
diff changeset
   166
                    fileconflicts.add(f)
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   167
34552
33c8a6837181 merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34551
diff changeset
   168
        allconflicts = fileconflicts | pathconflicts
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   169
        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
   170
        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
   171
        collectconflicts(ignoredconflicts, ignoredconfig)
6b639caa1652 merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents: 27741
diff changeset
   172
        collectconflicts(unknownconflicts, unknownconfig)
28022
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   173
    else:
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
   174
        for f, (m, args, msg) in pycompat.iteritems(actions):
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   175
            if m == mergestatemod.ACTION_CREATED_MERGE:
28022
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   176
                fl2, anc = args
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   177
                different = _checkunknownfile(repo, wctx, mctx, f)
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   178
                if repo.dirstate._ignore(f):
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   179
                    config = ignoredconfig
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   180
                else:
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   181
                    config = unknownconfig
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   182
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   183
                # The behavior when force is True is described by this table:
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   184
                #  config  different  mergeforce  |    action    backup
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   185
                #    *         n          *       |      get        n
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   186
                #    *         y          y       |     merge       -
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   187
                #   abort      y          n       |     merge       -   (1)
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   188
                #   warn       y          n       |  warn + get     y
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   189
                #  ignore      y          n       |      get        y
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   190
                #
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   191
                # (1) this is probably the wrong behavior here -- we should
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   192
                #     probably abort, but some actions like rebases currently
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   193
                #     don't like an abort happening in the middle of
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   194
                #     merge.update.
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   195
                if not different:
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   196
                    actions[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   197
                        mergestatemod.ACTION_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   198
                        (fl2, False),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   199
                        b'remote created',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   200
                    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   201
                elif mergeforce or config == b'abort':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   202
                    actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   203
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   204
                        (f, f, None, False, anc),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   205
                        b'remote differs from untracked local',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   206
                    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   207
                elif config == b'abort':
28022
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   208
                    abortconflicts.add(f)
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   209
                else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   210
                    if config == b'warn':
28022
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   211
                        warnconflicts.add(f)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   212
                    actions[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   213
                        mergestatemod.ACTION_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   214
                        (fl2, True),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   215
                        b'remote created',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   216
                    )
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   217
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   218
    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
   219
        warn = repo.ui.warn
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
   220
        if f in pathconflicts:
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
   221
            if repo.wvfs.isfileorlink(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   222
                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
   223
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   224
                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
   225
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   226
            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
   227
    if abortconflicts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   228
        raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   229
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   230
                b"untracked files in working directory "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   231
                b"differ from files in requested revision"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   232
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   233
        )
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   234
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   235
    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
   236
        if repo.wvfs.isfileorlink(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   237
            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
   238
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   239
            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
   240
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
   241
    for f, (m, args, msg) in pycompat.iteritems(actions):
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   242
        if m == mergestatemod.ACTION_CREATED:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   243
            backup = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   244
                f in fileconflicts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   245
                or f in pathconflicts
43677
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
   246
                or any(p in pathconflicts for p in pathutil.finddirs(f))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   247
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   248
            (flags,) = args
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   249
            actions[f] = (mergestatemod.ACTION_GET, (flags, backup), msg)
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   250
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   251
6269
ffdf70e74623 merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents: 6268
diff changeset
   252
def _forgetremoved(wctx, mctx, branchmerge):
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   253
    """
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   254
    Forget removed files
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   255
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   256
    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
   257
    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
   258
    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
   259
    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
   260
    manifest.
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   261
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   262
    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
   263
    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
   264
    as removed.
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   265
    """
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   266
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
   267
    actions = {}
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   268
    m = mergestatemod.ACTION_FORGET
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   269
    if branchmerge:
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   270
        m = mergestatemod.ACTION_REMOVE
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   271
    for f in wctx.deleted():
6272
dd9bd227ae9a merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents: 6271
diff changeset
   272
        if f not in mctx:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   273
            actions[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
   274
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   275
    if not branchmerge:
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   276
        for f in wctx.removed():
6272
dd9bd227ae9a merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents: 6271
diff changeset
   277
            if f not in mctx:
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   278
                actions[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   279
                    mergestatemod.ACTION_FORGET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   280
                    None,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   281
                    b"forget removed",
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   282
                )
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   283
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
   284
    return actions
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   285
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   286
20640
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
   287
def _checkcollision(repo, wmf, actions):
38078
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
   288
    """
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
   289
    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: 38077
diff changeset
   290
    """
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
   291
    # 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: 38077
diff changeset
   292
    narrowmatch = repo.narrowmatch()
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
   293
    if not narrowmatch.always():
44333
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44318
diff changeset
   294
        pmmf = set(wmf.walk(narrowmatch))
38078
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
   295
        if actions:
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
   296
            narrowactions = {}
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
   297
            for m, actionsfortype in pycompat.iteritems(actions):
38078
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
   298
                narrowactions[m] = []
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
   299
                for (f, args, msg) in actionsfortype:
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
   300
                    if narrowmatch(f):
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
   301
                        narrowactions[m].append((f, args, msg))
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
   302
            actions = narrowactions
44333
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44318
diff changeset
   303
    else:
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44318
diff changeset
   304
        # build provisional merged manifest up
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44318
diff changeset
   305
        pmmf = set(wmf)
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   306
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   307
    if actions:
37115
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
   308
        # KEEP and EXEC are no-op
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   309
        for m in (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   310
            mergestatemod.ACTION_ADD,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   311
            mergestatemod.ACTION_ADD_MODIFIED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   312
            mergestatemod.ACTION_FORGET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   313
            mergestatemod.ACTION_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   314
            mergestatemod.ACTION_CHANGED_DELETED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   315
            mergestatemod.ACTION_DELETED_CHANGED,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   316
        ):
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   317
            for f, args, msg in actions[m]:
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   318
                pmmf.add(f)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   319
        for f, args, msg in actions[mergestatemod.ACTION_REMOVE]:
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   320
            pmmf.discard(f)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   321
        for f, args, msg in actions[mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL]:
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   322
            f2, flags = args
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   323
            pmmf.discard(f2)
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   324
            pmmf.add(f)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   325
        for f, args, msg in actions[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
   326
            pmmf.add(f)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   327
        for f, args, msg in actions[mergestatemod.ACTION_MERGE]:
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   328
            f1, f2, fa, move, anc = args
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   329
            if move:
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   330
                pmmf.discard(f1)
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   331
            pmmf.add(f)
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   332
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   333
    # 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
   334
    foldmap = {}
33829
055fee3547df merge: removed sorting in casefolding detection, for a slight performance win
Alex Gaynor <agaynor@mozilla.com>
parents: 33499
diff changeset
   335
    for f in pmmf:
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   336
        fold = util.normcase(f)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   337
        if fold in foldmap:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   338
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   339
                _(b"case-folding collision between %s and %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   340
                % (f, foldmap[fold])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   341
            )
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   342
        foldmap[fold] = f
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   343
26661
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   344
    # check case-folding of directories
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   345
    foldprefix = unfoldprefix = lastfull = b''
26661
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   346
    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
   347
        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
   348
            # the folded prefix matches but actual casing is different
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   349
            raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   350
                _(b"case-folding collision between %s and directory of %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   351
                % (lastfull, f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   352
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   353
        foldprefix = fold + b'/'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   354
        unfoldprefix = f + b'/'
26661
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   355
        lastfull = f
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   356
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   357
26785
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   358
def driverpreprocess(repo, ms, wctx, labels=None):
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   359
    """run the preprocess step of the merge driver, if any
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   360
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   361
    This is currently not implemented -- it's an extension point."""
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   362
    return True
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   363
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   364
26785
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   365
def driverconclude(repo, ms, wctx, labels=None):
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   366
    """run the conclude step of the merge driver, if any
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   367
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   368
    This is currently not implemented -- it's an extension point."""
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   369
    return True
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   370
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   371
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   372
def _filesindirs(repo, manifest, dirs):
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   373
    """
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   374
    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
   375
    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
   376
    in.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   377
    """
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   378
    for f in manifest:
43677
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
   379
        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
   380
            if p in dirs:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   381
                yield f, p
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   382
                break
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   383
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   384
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   385
def checkpathconflicts(repo, wctx, mctx, actions):
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
    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
   388
    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
   389
    """
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   390
    mf = wctx.manifest()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   391
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   392
    # 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
   393
    localconflicts = set()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   394
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   395
    # 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
   396
    # 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
   397
    remoteconflicts = set()
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
    # 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
   400
    # 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
   401
    # can't be updated to cleanly.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   402
    invalidconflicts = set()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   403
34998
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
   404
    # 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: 34997
diff changeset
   405
    createdfiledirs = set()
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
   406
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   407
    # 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
   408
    deletedfiles = set()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   409
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   410
    for f, (m, args, msg) in actions.items():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   411
        if m in (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   412
            mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   413
            mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   414
            mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   415
            mergestatemod.ACTION_CREATED_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   416
        ):
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   417
            # This action may create a new local file.
43677
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
   418
            createdfiledirs.update(pathutil.finddirs(f))
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   419
            if mf.hasdir(f):
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   420
                # The file aliases a local directory.  This might be ok if all
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   421
                # the files in the local directory are being deleted.  This
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   422
                # will be checked once we know what all the deleted files are.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   423
                remoteconflicts.add(f)
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   424
        # Track the names of all deleted files.
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   425
        if m == mergestatemod.ACTION_REMOVE:
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   426
            deletedfiles.add(f)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   427
        if m == mergestatemod.ACTION_MERGE:
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   428
            f1, f2, fa, move, anc = args
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   429
            if move:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   430
                deletedfiles.add(f1)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   431
        if m == mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL:
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   432
            f2, flags = args
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   433
            deletedfiles.add(f2)
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   434
34998
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
   435
    # 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: 34997
diff changeset
   436
    for p in createdfiledirs:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
   437
        if p in mf:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
   438
            if p in mctx:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
   439
                # 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: 34997
diff changeset
   440
                # 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: 34997
diff changeset
   441
                # within the remote manifest.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
   442
                invalidconflicts.add(p)
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
   443
            else:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
   444
                # 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: 34997
diff changeset
   445
                # 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: 34997
diff changeset
   446
                localconflicts.add(p)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   447
        if p in actions and actions[p][0] in (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   448
            mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   449
            mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   450
            mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   451
            mergestatemod.ACTION_CREATED_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   452
        ):
34998
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
   453
            # 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: 34997
diff changeset
   454
            # 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: 34997
diff changeset
   455
            # manifest.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
   456
            invalidconflicts.add(p)
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
   457
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   458
    # 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
   459
    for p in localconflicts:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   460
        if p not in deletedfiles:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   461
            ctxname = bytes(wctx).rstrip(b'+')
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   462
            pnew = util.safename(p, ctxname, wctx, set(actions.keys()))
44980
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44915
diff changeset
   463
            porig = wctx[p].copysource() or p
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   464
            actions[pnew] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   465
                mergestatemod.ACTION_PATH_CONFLICT_RESOLVE,
44980
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44915
diff changeset
   466
                (p, porig),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   467
                b'local path conflict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   468
            )
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   469
            actions[p] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   470
                mergestatemod.ACTION_PATH_CONFLICT,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   471
                (pnew, b'l'),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   472
                b'path conflict',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   473
            )
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   474
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   475
    if remoteconflicts:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   476
        # 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
   477
        ctxname = bytes(mctx).rstrip(b'+')
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   478
        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
   479
            if f not in deletedfiles:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   480
                m, args, msg = actions[p]
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   481
                pnew = util.safename(p, ctxname, wctx, set(actions.keys()))
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   482
                if m in (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   483
                    mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   484
                    mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   485
                ):
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   486
                    # Action was merge, just update target.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   487
                    actions[pnew] = (m, args, msg)
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   488
                else:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   489
                    # 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
   490
                    fl = args[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   491
                    actions[pnew] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   492
                        mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   493
                        (p, fl),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   494
                        b'remote path conflict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   495
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   496
                actions[p] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   497
                    mergestatemod.ACTION_PATH_CONFLICT,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   498
                    (pnew, mergestatemod.ACTION_REMOVE),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   499
                    b'path conflict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   500
                )
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   501
                remoteconflicts.remove(p)
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   502
                break
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   503
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   504
    if invalidconflicts:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   505
        for p in invalidconflicts:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   506
            repo.ui.warn(_(b"%s: is both a file and a directory\n") % p)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   507
        raise error.Abort(_(b"destination manifest contains path conflicts"))
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   508
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   509
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   510
def _filternarrowactions(narrowmatch, branchmerge, actions):
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   511
    """
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   512
    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: 38003
diff changeset
   513
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   514
    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: 38003
diff changeset
   515
    narrowed.
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   516
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   517
    nooptypes = {b'k'}  # TODO: handle with nonconflicttypes
44688
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
   518
    nonconflicttypes = set(b'a am c cm f g gs r e'.split())
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   519
    # 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: 38003
diff changeset
   520
    # over a copy.
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   521
    for f, action in list(actions.items()):
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   522
        if narrowmatch(f):
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   523
            pass
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   524
        elif not branchmerge:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   525
            del actions[f]  # just updating, ignore changes outside clone
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   526
        elif action[0] in nooptypes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   527
            del actions[f]  # merge does not affect file
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   528
        elif action[0] in nonconflicttypes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   529
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   530
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   531
                    b'merge affects file \'%s\' outside narrow, '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   532
                    b'which is not yet supported'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   533
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   534
                % f,
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   535
                hint=_(b'merging in the other direction may work'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   536
            )
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   537
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   538
            raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   539
                _(b'conflict in file \'%s\' is outside narrow clone') % f
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   540
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   541
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   542
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   543
def manifestmerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   544
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   545
    wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   546
    p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   547
    pa,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   548
    branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   549
    force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   550
    matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   551
    acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   552
    followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   553
    forcefulldiff=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   554
):
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   555
    """
30096
98d3d8108db0 merge: update doc of manifestmerge() per 18c2184c27dc
Yuya Nishihara <yuya@tcha.org>
parents: 30060
diff changeset
   556
    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
   557
18605
bcf29565d89f manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents: 18544
diff changeset
   558
    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
   559
    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
   560
    acceptremote = accept the incoming changes without prompting
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   561
    """
27346
ba0da4b7397d merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents: 27345
diff changeset
   562
    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
   563
        matcher = None
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   564
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   565
    # 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: 42974
diff changeset
   566
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   567
        x.manifest()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   568
        for x in sorted(wctx.parents() + [p2, pa], key=scmutil.intrev)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   569
    ]
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   570
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   571
    branch_copies1 = copies.branch_copies()
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   572
    branch_copies2 = copies.branch_copies()
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   573
    diverge = {}
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   574
    if followcopies:
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   575
        branch_copies1, branch_copies2, diverge = copies.mergecopies(
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   576
            repo, wctx, p2, pa
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   577
        )
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
   578
32664
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32635
diff changeset
   579
    boolbm = pycompat.bytestr(bool(branchmerge))
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32635
diff changeset
   580
    boolf = pycompat.bytestr(bool(force))
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32635
diff changeset
   581
    boolm = pycompat.bytestr(bool(matcher))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   582
    repo.ui.note(_(b"resolving manifests\n"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   583
    repo.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   584
        b" branchmerge: %s, force: %s, partial: %s\n" % (boolbm, boolf, boolm)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   585
    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   586
    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
   587
18611
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
   588
    m1, m2, ma = wctx.manifest(), p2.manifest(), pa.manifest()
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   589
    copied1 = set(branch_copies1.copy.values())
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   590
    copied1.update(branch_copies1.movewithdir.values())
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   591
    copied2 = set(branch_copies2.copy.values())
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   592
    copied2.update(branch_copies2.movewithdir.values())
3295
72d1e521da77 merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents: 3292
diff changeset
   593
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   594
    if b'.hgsubstate' in m1 and wctx.rev() is None:
37878
1322ae04d3d7 merge: do not fill manifest of committed revision with pseudo node (issue5526)
Yuya Nishihara <yuya@tcha.org>
parents: 37762
diff changeset
   595
        # 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
   596
        # 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
   597
        # 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
   598
        if any(wctx.sub(s).dirty() for s in wctx.substate):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   599
            m1[b'.hgsubstate'] = modifiednodeid
9783
ee00ef6f9be7 submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
   600
32200
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
   601
    # Don't use m2-vs-ma optimization if:
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
   602
    # - 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: 31651
diff changeset
   603
    # - 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: 31651
diff changeset
   604
    #   merge.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   605
    if pa not in ([wctx, p2] + wctx.parents()) and not forcefulldiff:
32200
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
   606
        # 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: 31651
diff changeset
   607
        # 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: 31651
diff changeset
   608
        # performance benefits in large repositories.
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
   609
        relevantfiles = set(ma.diff(m2).keys())
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
   610
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
   611
        # For copied and moved files, we need to add the source file too.
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   612
        for copykey, copyvalue in pycompat.iteritems(branch_copies1.copy):
32200
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
   613
            if copyvalue in relevantfiles:
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
   614
                relevantfiles.add(copykey)
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   615
        for movedirkey in branch_copies1.movewithdir:
32200
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
   616
            relevantfiles.add(movedirkey)
32531
bd56bea5ecf8 merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32390
diff changeset
   617
        filesmatcher = scmutil.matchfiles(repo, relevantfiles)
bd56bea5ecf8 merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32390
diff changeset
   618
        matcher = matchmod.intersectmatchers(matcher, filesmatcher)
32200
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
   619
31267
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31185
diff changeset
   620
    diff = m1.diff(m2, match=matcher)
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31185
diff changeset
   621
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   622
    actions = {}
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
   623
    for f, ((n1, fl1), (n2, fl2)) in pycompat.iteritems(diff):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   624
        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
   625
            if f not in ma:
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   626
                # 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: 44274
diff changeset
   627
                fa = branch_copies1.copy.get(
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   628
                    f, None
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   629
                ) or branch_copies2.copy.get(f, None)
23397
c7c95838be9a merge: break out "both renamed a -> b" case
Martin von Zweigbergk <martinvonz@google.com>
parents: 23396
diff changeset
   630
                if fa is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   631
                    actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   632
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   633
                        (f, f, fa, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   634
                        b'both renamed from %s' % fa,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   635
                    )
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
   636
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   637
                    actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   638
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   639
                        (f, f, None, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   640
                        b'both created',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   641
                    )
16094
0776a6cababe merge: don't use unknown()
Matt Mackall <mpm@selenic.com>
parents: 16093
diff changeset
   642
            else:
23396
6a254a2dd37c merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23395
diff changeset
   643
                a = ma[f]
6a254a2dd37c merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23395
diff changeset
   644
                fla = ma.flags(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   645
                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
   646
                if n2 == a and fl2 == fla:
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   647
                    actions[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   648
                        mergestatemod.ACTION_KEEP,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   649
                        (),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   650
                        b'remote unchanged',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   651
                    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   652
                elif n1 == a and fl1 == fla:  # local unchanged - use remote
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   653
                    if n1 == n2:  # optimization: keep local content
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   654
                        actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   655
                            mergestatemod.ACTION_EXEC,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   656
                            (fl2,),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   657
                            b'update permissions',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   658
                        )
23395
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
   659
                    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   660
                        actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   661
                            mergestatemod.ACTION_GET_OTHER_AND_STORE
44688
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
   662
                            if branchmerge
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   663
                            else mergestatemod.ACTION_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   664
                            (fl2, False),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   665
                            b'remote is newer',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   666
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   667
                elif nol and n2 == a:  # remote only changed 'x'
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   668
                    actions[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   669
                        mergestatemod.ACTION_EXEC,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   670
                        (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   671
                        b'update permissions',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   672
                    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   673
                elif nol and n1 == a:  # local only changed 'x'
44688
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
   674
                    actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   675
                        mergestatemod.ACTION_GET_OTHER_AND_STORE
44688
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
   676
                        if branchmerge
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   677
                        else mergestatemod.ACTION_GET,
44688
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
   678
                        (fl1, False),
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
   679
                        b'remote is newer',
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
   680
                    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   681
                else:  # both changed something
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   682
                    actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   683
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   684
                        (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
   685
                        b'versions differ',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   686
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   687
        elif n1:  # file exists only on local side
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   688
            if f in copied2:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   689
                pass  # we'll deal with it on m2 side
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   690
            elif (
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   691
                f in branch_copies1.movewithdir
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   692
            ):  # directory rename, move local
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   693
                f2 = branch_copies1.movewithdir[f]
31522
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31482
diff changeset
   694
                if f2 in m2:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   695
                    actions[f2] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   696
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   697
                        (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
   698
                        b'remote directory rename, both created',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   699
                    )
23475
67f1d68861fb merge: don't ignore conflicting file in remote renamed directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 23474
diff changeset
   700
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   701
                    actions[f2] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   702
                        mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   703
                        (f, fl1),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   704
                        b'remote directory rename - move from %s' % f,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   705
                    )
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   706
            elif f in branch_copies1.copy:
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   707
                f2 = branch_copies1.copy[f]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   708
                actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   709
                    mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   710
                    (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
   711
                    b'local copied/moved from %s' % f2,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   712
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   713
            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
   714
                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
   715
                    if acceptremote:
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   716
                        actions[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   717
                            mergestatemod.ACTION_REMOVE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   718
                            None,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   719
                            b'remote delete',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   720
                        )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   721
                    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   722
                        actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   723
                            mergestatemod.ACTION_CHANGED_DELETED,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   724
                            (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
   725
                            b'prompt changed/deleted',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   726
                        )
30371
1070df141718 dirstate: change added/modified placeholder hash length to 20 bytes
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
   727
                elif n1 == addednodeid:
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   728
                    # This extra 'a' is added by working copy manifest to mark
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   729
                    # the file as locally added. We should forget it instead of
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   730
                    # deleting it.
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   731
                    actions[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   732
                        mergestatemod.ACTION_FORGET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   733
                        None,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   734
                        b'remote deleted',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   735
                    )
20639
1df033640a8e merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents: 20620
diff changeset
   736
                else:
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   737
                    actions[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   738
                        mergestatemod.ACTION_REMOVE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   739
                        None,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   740
                        b'other deleted',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   741
                    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   742
        elif n2:  # file exists only on remote side
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   743
            if f in copied1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   744
                pass  # we'll deal with it on m1 side
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   745
            elif f in branch_copies2.movewithdir:
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   746
                f2 = branch_copies2.movewithdir[f]
31522
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31482
diff changeset
   747
                if f2 in m1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   748
                    actions[f2] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   749
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   750
                        (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
   751
                        b'local directory rename, both created',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   752
                    )
23476
39a12719ec65 merge: don't overwrite conflicting file in locally renamed directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 23475
diff changeset
   753
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   754
                    actions[f2] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   755
                        mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   756
                        (f, fl2),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   757
                        b'local directory rename - get from %s' % f,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   758
                    )
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   759
            elif f in branch_copies2.copy:
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   760
                f2 = branch_copies2.copy[f]
31522
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31482
diff changeset
   761
                if f2 in m2:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   762
                    actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   763
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   764
                        (f2, f, f2, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   765
                        b'remote copied from %s' % f2,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   766
                    )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   767
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   768
                    actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   769
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   770
                        (f2, f, f2, True, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   771
                        b'remote moved from %s' % f2,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   772
                    )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   773
            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
   774
                # 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
   775
                # 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
   776
                #
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   777
                # 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
   778
                #   n         *           *      |   create
23650
b85c548ab14d merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents: 23649
diff changeset
   779
                #   y         n           *      |   create
b85c548ab14d merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents: 23649
diff changeset
   780
                #   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
   781
                #   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
   782
                #
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   783
                # 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
   784
                # 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
   785
                if not force:
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   786
                    actions[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   787
                        mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   788
                        (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   789
                        b'remote created',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   790
                    )
23649
18ab5e5955df merge: structure 'remote created' code to match table
Martin von Zweigbergk <martinvonz@google.com>
parents: 23641
diff changeset
   791
                elif not branchmerge:
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   792
                    actions[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   793
                        mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   794
                        (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   795
                        b'remote created',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   796
                    )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   797
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   798
                    actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   799
                        mergestatemod.ACTION_CREATED_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   800
                        (fl2, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   801
                        b'remote created, get or merge',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   802
                    )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   803
            elif n2 != ma[f]:
30586
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30528
diff changeset
   804
                df = None
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   805
                for d in branch_copies1.dirmove:
30586
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30528
diff changeset
   806
                    if f.startswith(d):
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30528
diff changeset
   807
                        # new file added in a directory that was moved
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   808
                        df = branch_copies1.dirmove[d] + f[len(d) :]
30586
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30528
diff changeset
   809
                        break
31522
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31482
diff changeset
   810
                if df is not None and df in m1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   811
                    actions[df] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   812
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   813
                        (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
   814
                        b'local directory rename - respect move '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   815
                        b'from %s' % f,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   816
                    )
30586
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30528
diff changeset
   817
                elif acceptremote:
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   818
                    actions[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   819
                        mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   820
                        (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   821
                        b'remote recreating',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   822
                    )
18606
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
   823
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   824
                    actions[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   825
                        mergestatemod.ACTION_DELETED_CHANGED,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   826
                        (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
   827
                        b'prompt deleted/changed',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   828
                    )
23651
72da02d7f126 merge: collect checking for unknown files at end of manifestmerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23650
diff changeset
   829
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   830
    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
   831
        # If we are merging, look for path conflicts.
37450a122128 merge: add a config option to disable path conflict checking
Siddharth Agarwal <sid0@fb.com>
parents: 34919
diff changeset
   832
        checkpathconflicts(repo, wctx, p2, actions)
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   833
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   834
    narrowmatch = repo.narrowmatch()
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   835
    if not narrowmatch.always():
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   836
        # Updates "actions" in place
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   837
        _filternarrowactions(narrowmatch, branchmerge, actions)
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
   838
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   839
    renamedelete = branch_copies1.renamedelete
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   840
    renamedelete.update(branch_copies2.renamedelete)
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
   841
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
   842
    return actions, diverge, renamedelete
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   843
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   844
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
   845
def _resolvetrivial(repo, wctx, mctx, ancestor, actions):
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
   846
    """Resolves false conflicts where the nodeid changed but the content
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
   847
       remained the same."""
36349
759579bac31d merge: make a copy of dict.items() before mutating the dict during iteration
Augie Fackler <augie@google.com>
parents: 36215
diff changeset
   848
    # 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: 36215
diff changeset
   849
    # actions as we resolve trivial conflicts.
759579bac31d merge: make a copy of dict.items() before mutating the dict during iteration
Augie Fackler <augie@google.com>
parents: 36215
diff changeset
   850
    for f, (m, args, msg) in list(actions.items()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   851
        if (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   852
            m == mergestatemod.ACTION_CHANGED_DELETED
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   853
            and f in ancestor
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   854
            and not wctx[f].cmp(ancestor[f])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   855
        ):
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
   856
            # local did change but ended up with same content
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   857
            actions[f] = mergestatemod.ACTION_REMOVE, None, b'prompt same'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   858
        elif (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   859
            m == mergestatemod.ACTION_DELETED_CHANGED
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   860
            and f in ancestor
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   861
            and not mctx[f].cmp(ancestor[f])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   862
        ):
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
   863
            # remote did change but ended up with same content
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   864
            del actions[f]  # don't get = keep local deleted
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   865
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
   866
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   867
def calculateupdates(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   868
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   869
    wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   870
    mctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   871
    ancestors,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   872
    branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   873
    force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   874
    acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   875
    followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   876
    matcher=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   877
    mergeforce=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   878
):
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   879
    """Calculate the actions needed to merge mctx into wctx using ancestors"""
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   880
    # Avoid cycle.
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   881
    from . import sparse
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   882
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   883
    if len(ancestors) == 1:  # default
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
   884
        actions, diverge, renamedelete = manifestmerge(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   885
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   886
            wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   887
            mctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   888
            ancestors[0],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   889
            branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   890
            force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   891
            matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   892
            acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   893
            followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   894
        )
28020
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
   895
        _checkunknownfiles(repo, wctx, mctx, force, actions, mergeforce)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   896
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   897
    else:  # only when merge.preferancestor=* - the default
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   898
        repo.ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   899
            _(b"note: merging %s and %s using bids from ancestors %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   900
            % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   901
                wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   902
                mctx,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   903
                _(b' and ').join(pycompat.bytestr(anc) for anc in ancestors),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   904
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   905
        )
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   906
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   907
        # Call for bids
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   908
        fbids = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   909
            {}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   910
        )  # mapping filename to bids (action method to list af actions)
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
   911
        diverge, renamedelete = None, None
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   912
        for ancestor in ancestors:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   913
            repo.ui.note(_(b'\ncalculating bids for ancestor %s\n') % ancestor)
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
   914
            actions, diverge1, renamedelete1 = manifestmerge(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   915
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   916
                wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   917
                mctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   918
                ancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   919
                branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   920
                force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   921
                matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   922
                acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   923
                followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   924
                forcefulldiff=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   925
            )
28020
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
   926
            _checkunknownfiles(repo, wctx, mctx, force, actions, mergeforce)
26318
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
   927
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
   928
            # 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
   929
            # merge will correctly incorporate more information
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
   930
            if diverge is None or len(diverge1) < len(diverge):
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
   931
                diverge = diverge1
26318
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
   932
            if renamedelete is None or len(renamedelete) < len(renamedelete1):
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
   933
                renamedelete = renamedelete1
26318
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
   934
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
   935
            for f, a in sorted(pycompat.iteritems(actions)):
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
   936
                m, args, msg = a
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   937
                if m == mergestatemod.ACTION_GET_OTHER_AND_STORE:
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   938
                    m = mergestatemod.ACTION_GET
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   939
                repo.ui.debug(b' %s: %s -> %s\n' % (f, msg, m))
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
   940
                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
   941
                    d = fbids[f]
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
   942
                    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
   943
                        d[m].append(a)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   944
                    else:
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
   945
                        d[m] = [a]
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
   946
                else:
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
   947
                    fbids[f] = {m: [a]}
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   948
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   949
        # Pick the best bid for each file
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   950
        repo.ui.note(_(b'\nauction for merging merge bids\n'))
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
   951
        actions = {}
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   952
        for f, bids in sorted(fbids.items()):
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   953
            # 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
   954
            # Consensus?
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   955
            if len(bids) == 1:  # all bids are the same kind of method
34355
1a5abc45e2fa py3: explicitly convert dict.keys() and dict.items() into a list
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34309
diff changeset
   956
                m, l = list(bids.items())[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   957
                if all(a == l[0] for a in l[1:]):  # len(bids) is > 1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   958
                    repo.ui.note(_(b" %s: consensus for %s\n") % (f, m))
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
   959
                    actions[f] = l[0]
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   960
                    continue
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   961
            # If keep is an option, just do it.
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   962
            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
   963
                repo.ui.note(_(b" %s: picking 'keep' action\n") % f)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   964
                actions[f] = bids[mergestatemod.ACTION_KEEP][0]
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   965
                continue
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   966
            # If there are gets and they all agree [how could they not?], do it.
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   967
            if mergestatemod.ACTION_GET in bids:
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   968
                ga0 = bids[mergestatemod.ACTION_GET][0]
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
   969
                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
   970
                    repo.ui.note(_(b" %s: picking 'get' action\n") % f)
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
   971
                    actions[f] = ga0
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   972
                    continue
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   973
            # 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
   974
            # Handle inefficient democrazy.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   975
            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
   976
            for m, l in sorted(bids.items()):
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   977
                for _f, args, msg in l:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   978
                    repo.ui.note(b'  %s -> %s\n' % (msg, m))
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   979
            # Pick random action. TODO: Instead, prompt user when resolving
34355
1a5abc45e2fa py3: explicitly convert dict.keys() and dict.items() into a list
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34309
diff changeset
   980
            m, l = list(bids.items())[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   981
            repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   982
                _(b' %s: ambiguous merge - picked %s action\n') % (f, m)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   983
            )
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
   984
            actions[f] = l[0]
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   985
            continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   986
        repo.ui.note(_(b'end of auction\n\n'))
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   987
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
   988
    if wctx.rev() is None:
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
   989
        fractions = _forgetremoved(wctx, mctx, branchmerge)
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
   990
        actions.update(fractions)
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
   991
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   992
    prunedactions = sparse.filterupdatesactions(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   993
        repo, wctx, mctx, branchmerge, actions
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   994
    )
38757
d49e490a9e85 merge: do the trivial resolution after updating sparse checkout
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38732
diff changeset
   995
    _resolvetrivial(repo, wctx, mctx, ancestors[0], actions)
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   996
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   997
    return prunedactions, diverge, renamedelete
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
   998
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
   999
34157
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
  1000
def _getcwd():
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
  1001
    try:
39823
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39481
diff changeset
  1002
        return encoding.getcwd()
34157
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
  1003
    except OSError as err:
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
  1004
        if err.errno == errno.ENOENT:
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
  1005
            return None
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
  1006
        raise
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
  1007
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1008
33093
6582dc01aca3 merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com>
parents: 32881
diff changeset
  1009
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
  1010
    """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
  1011
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1012
    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
  1013
    """
18640
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
  1014
    verbose = repo.ui.verbose
34157
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
  1015
    cwd = _getcwd()
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
  1016
    i = 0
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
  1017
    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
  1018
        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
  1019
        if verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1020
            repo.ui.note(_(b"removing %s\n") % f)
33098
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
  1021
        wctx[f].audit()
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1022
        try:
33094
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33093
diff changeset
  1023
            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
  1024
        except OSError as inst:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1025
            repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1026
                _(b"update failed to remove %s: %s!\n") % (f, inst.strerror)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1027
            )
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1028
        if i == 100:
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1029
            yield i, f
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1030
            i = 0
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1031
        i += 1
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1032
    if i > 0:
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1033
        yield i, f
34157
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
  1034
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
  1035
    if cwd and not _getcwd():
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
  1036
        # 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: 34140
diff changeset
  1037
        # warning.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1038
        repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1039
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1040
                b"current directory was removed\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1041
                b"(consider changing to repo root: %s)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1042
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1043
            % repo.root
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1044
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1045
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1046
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1047
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
  1048
    """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
  1049
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1050
    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
  1051
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1052
    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: 42431
diff changeset
  1053
    exactly one (True, filedata). When wantfiledata is false, filedata is an
42529
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42472
diff changeset
  1054
    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: 42472
diff changeset
  1055
    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
  1056
    """
42529
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42472
diff changeset
  1057
    filedata = {}
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1058
    verbose = repo.ui.verbose
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1059
    fctx = mctx.filectx
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
  1060
    ui = repo.ui
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1061
    i = 0
28200
588695ccbb22 merge: perform background file closing in batchget
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28199
diff changeset
  1062
    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
  1063
        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
  1064
            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
  1065
            if verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1066
                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
  1067
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1068
            if backup:
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1069
                # 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
  1070
                # 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
  1071
                # with a directory this file is in, and if so, back that up.
41584
1f2714052d7e merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents: 41583
diff changeset
  1072
                conflicting = f
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1073
                if not repo.wvfs.lexists(f):
43677
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
  1074
                    for p in pathutil.finddirs(f):
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1075
                        if repo.wvfs.isfileorlink(p):
41584
1f2714052d7e merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents: 41583
diff changeset
  1076
                            conflicting = p
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1077
                            break
41584
1f2714052d7e merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents: 41583
diff changeset
  1078
                if repo.wvfs.lexists(conflicting):
41614
ac8cf125d8d5 merge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41584
diff changeset
  1079
                    orig = scmutil.backuppath(ui, repo, conflicting)
ac8cf125d8d5 merge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41584
diff changeset
  1080
                    util.rename(repo.wjoin(conflicting), orig)
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1081
            wfctx = wctx[f]
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1082
            wfctx.clearunknown()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1083
            atomictemp = ui.configbool(b"experimental", b"update.atomic-file")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1084
            size = wfctx.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1085
                fctx(f).data(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1086
                flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1087
                backgroundclose=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1088
                atomictemp=atomictemp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1089
            )
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1090
            if wantfiledata:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1091
                s = wfctx.lstat()
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1092
                mode = s.st_mode
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1093
                mtime = s[stat.ST_MTIME]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1094
                filedata[f] = (mode, size, mtime)  # for dirstate.normal
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1095
            if i == 100:
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1096
                yield False, (i, f)
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1097
                i = 0
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1098
            i += 1
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
  1099
    if i > 0:
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1100
        yield False, (i, f)
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1101
    yield True, filedata
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1102
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1103
36180
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36080
diff changeset
  1104
def _prefetchfiles(repo, ctx, actions):
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37174
diff changeset
  1105
    """Invoke ``scmutil.prefetchfiles()`` for the files relevant to the dict
36180
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36080
diff changeset
  1106
    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: 36080
diff changeset
  1107
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36080
diff changeset
  1108
    # 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: 36080
diff changeset
  1109
    # 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: 36080
diff changeset
  1110
    # changed/deleted never resolves to something from the remote side.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1111
    oplist = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1112
        actions[a]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1113
        for a in (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1114
            mergestatemod.ACTION_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1115
            mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1116
            mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1117
            mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1118
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1119
    ]
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37174
diff changeset
  1120
    prefetch = scmutil.prefetchfiles
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37174
diff changeset
  1121
    matchfiles = scmutil.matchfiles
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1122
    prefetch(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1123
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1124
        [ctx.rev()],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1125
        matchfiles(repo, [f for sublist in oplist for f, args, msg in sublist]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1126
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1127
34139
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34137
diff changeset
  1128
37110
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
  1129
@attr.s(frozen=True)
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
  1130
class updateresult(object):
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
  1131
    updatedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
  1132
    mergedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
  1133
    removedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
  1134
    unresolvedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
  1135
37128
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37115
diff changeset
  1136
    def isempty(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1137
        return not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1138
            self.updatedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1139
            or self.mergedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1140
            or self.removedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1141
            or self.unresolvedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1142
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1143
37128
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37115
diff changeset
  1144
41042
54c3b4bd01f2 merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 39823
diff changeset
  1145
def emptyactions():
54c3b4bd01f2 merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 39823
diff changeset
  1146
    """create an actions dict, to be populated and passed to applyupdates()"""
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44430
diff changeset
  1147
    return {
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44430
diff changeset
  1148
        m: []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1149
        for m in (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1150
            mergestatemod.ACTION_ADD,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1151
            mergestatemod.ACTION_ADD_MODIFIED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1152
            mergestatemod.ACTION_FORGET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1153
            mergestatemod.ACTION_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1154
            mergestatemod.ACTION_CHANGED_DELETED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1155
            mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1156
            mergestatemod.ACTION_REMOVE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1157
            mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1158
            mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1159
            mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1160
            mergestatemod.ACTION_EXEC,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1161
            mergestatemod.ACTION_KEEP,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1162
            mergestatemod.ACTION_PATH_CONFLICT,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1163
            mergestatemod.ACTION_PATH_CONFLICT_RESOLVE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1164
            mergestatemod.ACTION_GET_OTHER_AND_STORE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1165
        )
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44430
diff changeset
  1166
    }
41042
54c3b4bd01f2 merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 39823
diff changeset
  1167
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1168
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1169
def applyupdates(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1170
    repo, actions, wctx, mctx, overwrite, wantfiledata, labels=None
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1171
):
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1172
    """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
  1173
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1174
    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
  1175
    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
  1176
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1177
    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: 42431
diff changeset
  1178
    (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: 42431
diff changeset
  1179
    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: 42431
diff changeset
  1180
    batchget.
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1181
    """
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1182
36180
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36080
diff changeset
  1183
    _prefetchfiles(repo, mctx, actions)
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36080
diff changeset
  1184
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1185
    updated, merged, removed = 0, 0, 0
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1186
    ms = mergestatemod.mergestate.clean(
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1187
        repo, wctx.p1().node(), mctx.node(), labels
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1188
    )
44688
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
  1189
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
  1190
    # add ACTION_GET_OTHER_AND_STORE to mergestate
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1191
    for e in actions[mergestatemod.ACTION_GET_OTHER_AND_STORE]:
44688
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
  1192
        ms.addmergedother(e[0])
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
  1193
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1194
    moves = []
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
  1195
    for m, l in actions.items():
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
  1196
        l.sort()
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1197
27137
25e4b2f000c5 merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents: 27132
diff changeset
  1198
    # 'cd' and 'dc' actions are treated like other merge conflicts
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1199
    mergeactions = sorted(actions[mergestatemod.ACTION_CHANGED_DELETED])
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1200
    mergeactions.extend(sorted(actions[mergestatemod.ACTION_DELETED_CHANGED]))
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1201
    mergeactions.extend(actions[mergestatemod.ACTION_MERGE])
27137
25e4b2f000c5 merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents: 27132
diff changeset
  1202
    for f, args, msg in mergeactions:
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1203
        f1, f2, fa, move, anc = args
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1204
        if f == b'.hgsubstate':  # merged internally
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1205
            continue
27091
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1206
        if f1 is None:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1207
            fcl = filemerge.absentfilectx(wctx, fa)
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1208
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1209
            repo.ui.debug(b" preserving %s for resolve of %s\n" % (f1, f))
27091
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1210
            fcl = wctx[f1]
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1211
        if f2 is None:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1212
            fco = filemerge.absentfilectx(mctx, fa)
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1213
        else:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1214
            fco = mctx[f2]
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1215
        actx = repo[anc]
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1216
        if fa in actx:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1217
            fca = actx[fa]
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1218
        else:
27091
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1219
            # TODO: move to absentfilectx
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1220
            fca = repo.filectx(f1, fileid=nullrev)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1221
        ms.add(fcl, fco, fca, f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1222
        if f1 != f and move:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1223
            moves.append(f1)
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1224
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1225
    # remove renamed files after safely stored
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1226
    for f in moves:
33283
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33152
diff changeset
  1227
        if wctx[f].lexists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1228
            repo.ui.debug(b"removing %s\n" % f)
33098
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
  1229
            wctx[f].audit()
33094
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33093
diff changeset
  1230
            wctx[f].remove()
5042
f191bc3916f7 merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents: 4997
diff changeset
  1231
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1232
    numupdates = sum(
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1233
        len(l) for m, l in actions.items() if m != mergestatemod.ACTION_KEEP
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1234
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1235
    progress = repo.ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1236
        _(b'updating'), unit=_(b'files'), total=numupdates
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1237
    )
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1238
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1239
    if [
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1240
        a
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1241
        for a in actions[mergestatemod.ACTION_REMOVE]
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1242
        if a[0] == b'.hgsubstate'
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1243
    ]:
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  1244
        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
  1245
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1246
    # record path conflicts
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1247
    for f, args, msg in actions[mergestatemod.ACTION_PATH_CONFLICT]:
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1248
        f1, fo = args
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1249
        s = repo.ui.status
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1250
        s(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1251
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1252
                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
  1253
                b"directory\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1254
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1255
            % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1256
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1257
        if fo == b'l':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1258
            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
  1259
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1260
            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
  1261
        s(_(b"resolve manually then use 'hg resolve --mark %s'\n") % f)
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1262
        ms.addpath(f, f1, fo)
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
  1263
        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
  1264
34786
9c899660700a merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents: 34680
diff changeset
  1265
    # 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
  1266
    # 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
  1267
    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
  1268
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1269
    # remove in parallel (must come before resolving path conflicts and getting)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1270
    prog = worker.worker(
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1271
        repo.ui,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1272
        cost,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1273
        batchremove,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1274
        (repo, wctx),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1275
        actions[mergestatemod.ACTION_REMOVE],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1276
    )
19095
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
  1277
    for i, item in prog:
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
  1278
        progress.increment(step=i, item=item)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1279
    removed = len(actions[mergestatemod.ACTION_REMOVE])
21390
26b84128c54d merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents: 21389
diff changeset
  1280
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1281
    # resolve path conflicts (must come before getting)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1282
    for f, args, msg in actions[mergestatemod.ACTION_PATH_CONFLICT_RESOLVE]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1283
        repo.ui.debug(b" %s: %s -> pr\n" % (f, msg))
44980
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44915
diff changeset
  1284
        (f0, origf0) = args
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1285
        if wctx[f0].lexists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1286
            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
  1287
            wctx[f].audit()
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1288
            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
  1289
            wctx[f0].remove()
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
  1290
        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
  1291
38732
be4984261611 merge: mark file gets as not thread safe (issue5933)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38498
diff changeset
  1292
    # get in parallel.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1293
    threadsafe = repo.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1294
        b'experimental', b'worker.wdir-get-thread-safe'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1295
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1296
    prog = worker.worker(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1297
        repo.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1298
        cost,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1299
        batchget,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1300
        (repo, mctx, wctx, wantfiledata),
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1301
        actions[mergestatemod.ACTION_GET],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1302
        threadsafe=threadsafe,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1303
        hasretval=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1304
    )
42529
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42472
diff changeset
  1305
    getfiledata = {}
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1306
    for final, res in prog:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1307
        if final:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1308
            getfiledata = res
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1309
        else:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1310
            i, item = res
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1311
            progress.increment(step=i, item=item)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1312
    updated = len(actions[mergestatemod.ACTION_GET])
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1313
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1314
    if [a for a in actions[mergestatemod.ACTION_GET] if a[0] == b'.hgsubstate']:
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  1315
        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
  1316
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1317
    # forget (manifest only, just log it) (must come first)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1318
    for f, args, msg in actions[mergestatemod.ACTION_FORGET]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1319
        repo.ui.debug(b" %s: %s -> f\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
  1320
        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
  1321
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1322
    # re-add (manifest only, just log it)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1323
    for f, args, msg in actions[mergestatemod.ACTION_ADD]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1324
        repo.ui.debug(b" %s: %s -> a\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
  1325
        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
  1326
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1327
    # re-add/mark as modified (manifest only, just log it)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1328
    for f, args, msg in actions[mergestatemod.ACTION_ADD_MODIFIED]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1329
        repo.ui.debug(b" %s: %s -> am\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
  1330
        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
  1331
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1332
    # keep (noop, just log it)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1333
    for f, args, msg in actions[mergestatemod.ACTION_KEEP]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1334
        repo.ui.debug(b" %s: %s -> k\n" % (f, msg))
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1335
        # no progress
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1336
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1337
    # directory rename, move local
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1338
    for f, args, msg in actions[mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1339
        repo.ui.debug(b" %s: %s -> dm\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
  1340
        progress.increment(item=f)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1341
        f0, flags = args
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1342
        repo.ui.note(_(b"moving %s to %s\n") % (f0, f))
33098
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
  1343
        wctx[f].audit()
33095
05c680ebf512 merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com>
parents: 33094
diff changeset
  1344
        wctx[f].write(wctx.filectx(f0).data(), flags)
33094
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33093
diff changeset
  1345
        wctx[f0].remove()
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1346
        updated += 1
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1347
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1348
    # local directory rename, get
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1349
    for f, args, msg in actions[mergestatemod.ACTION_LOCAL_DIR_RENAME_GET]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1350
        repo.ui.debug(b" %s: %s -> dg\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
  1351
        progress.increment(item=f)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1352
        f0, flags = args
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1353
        repo.ui.note(_(b"getting %s to %s\n") % (f0, f))
33095
05c680ebf512 merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com>
parents: 33094
diff changeset
  1354
        wctx[f].write(mctx.filectx(f0).data(), flags)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1355
        updated += 1
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1356
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1357
    # exec
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1358
    for f, args, msg in actions[mergestatemod.ACTION_EXEC]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1359
        repo.ui.debug(b" %s: %s -> e\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
  1360
        progress.increment(item=f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1361
        (flags,) = args
33098
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
  1362
        wctx[f].audit()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1363
        wctx[f].setflags(b'l' in flags, b'x' in flags)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1364
        updated += 1
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1365
26786
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1366
    # the ordering is important here -- ms.mergedriver will raise if the merge
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1367
    # driver has changed, and we want to be able to bypass it when overwrite is
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1368
    # True
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1369
    usemergedriver = not overwrite and mergeactions and ms.mergedriver
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1370
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1371
    if usemergedriver:
35504
87918218da70 merge: raise before running mergedriver if using IMM
Phil Cohen <phillco@fb.com>
parents: 35297
diff changeset
  1372
        if wctx.isinmemory():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1373
            raise error.InMemoryMergeConflictsError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
  1374
                b"in-memory merge does not support mergedriver"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1375
            )
26786
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1376
        ms.commit()
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1377
        proceed = driverpreprocess(repo, ms, wctx, labels=labels)
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1378
        # the driver might leave some files unresolved
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1379
        unresolvedf = set(ms.unresolved())
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1380
        if not proceed:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1381
            # XXX setting unresolved to at least 1 is a hack to make sure we
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1382
            # error out
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1383
            return updateresult(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1384
                updated, merged, removed, max(len(unresolvedf), 1)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1385
            )
26786
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1386
        newactions = []
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1387
        for f, args, msg in mergeactions:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1388
            if f in unresolvedf:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1389
                newactions.append((f, args, msg))
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1390
        mergeactions = newactions
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1391
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1392
    try:
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1393
        # premerge
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1394
        tocomplete = []
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1395
        for f, args, msg in mergeactions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1396
            repo.ui.debug(b" %s: %s -> m (premerge)\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
  1397
            progress.increment(item=f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1398
            if f == b'.hgsubstate':  # subrepo states need updating
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1399
                subrepoutil.submerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1400
                    repo, wctx, mctx, wctx.ancestor(mctx), overwrite, labels
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1401
                )
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1402
                continue
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1403
            wctx[f].audit()
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1404
            complete, r = ms.preresolve(f, wctx)
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1405
            if not complete:
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1406
                numupdates += 1
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1407
                tocomplete.append((f, args, msg))
26618
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
  1408
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1409
        # merge
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1410
        for f, args, msg in tocomplete:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1411
            repo.ui.debug(b" %s: %s -> m (merge)\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
  1412
            progress.increment(item=f, total=numupdates)
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1413
            ms.resolve(f, wctx)
26292
007ac1acfcac merge: move merge step to the end
Siddharth Agarwal <sid0@fb.com>
parents: 25959
diff changeset
  1414
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1415
    finally:
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1416
        ms.commit()
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1417
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1418
    unresolved = ms.unresolvedcount()
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1419
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1420
    if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1421
        usemergedriver
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1422
        and not unresolved
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1423
        and ms.mdstate() != mergestatemod.MERGE_DRIVER_STATE_SUCCESS
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1424
    ):
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1425
        if not driverconclude(repo, ms, wctx, labels=labels):
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1426
            # XXX setting unresolved to at least 1 is a hack to make sure we
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1427
            # error out
26975
6618dfd3ea1c merge.applyupdates: don't return early if merge driver's conclude failed
Siddharth Agarwal <sid0@fb.com>
parents: 26962
diff changeset
  1428
            unresolved = max(unresolved, 1)
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1429
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1430
        ms.commit()
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1431
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1432
    msupdated, msmerged, msremoved = ms.counts()
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1433
    updated += msupdated
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1434
    merged += msmerged
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1435
    removed += msremoved
27080
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
  1436
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
  1437
    extraactions = ms.actions()
29842
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
  1438
    if extraactions:
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1439
        mfiles = {a[0] for a in actions[mergestatemod.ACTION_MERGE]}
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
  1440
        for k, acts in pycompat.iteritems(extraactions):
29842
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
  1441
            actions[k].extend(acts)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1442
            if k == mergestatemod.ACTION_GET and wantfiledata:
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1443
                # no filedata until mergestate is updated to provide it
42529
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42472
diff changeset
  1444
                for a in acts:
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42472
diff changeset
  1445
                    getfiledata[a[0]] = None
37115
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
  1446
            # Remove these files from actions[ACTION_MERGE] as well. This is
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
  1447
            # important because in recordupdates, files in actions[ACTION_MERGE]
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
  1448
            # are processed after files in other actions, and the merge driver
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
  1449
            # might add files to those actions via extraactions above. This can
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
  1450
            # lead to a file being recorded twice, with poor results. This is
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
  1451
            # especially problematic for actions[ACTION_REMOVE] (currently only
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
  1452
            # possible with the merge driver in the initial merge process;
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
  1453
            # interrupted merges don't go through this flow).
29842
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
  1454
            #
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
  1455
            # The real fix here is to have indexes by both file and action so
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
  1456
            # that when the action for a file is changed it is automatically
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
  1457
            # reflected in the other action lists. But that involves a more
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
  1458
            # complex data structure, so this will do for now.
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
  1459
            #
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
  1460
            # We don't need to do the same operation for 'dc' and 'cd' because
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
  1461
            # those lists aren't consulted again.
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
  1462
            mfiles.difference_update(a[0] for a in acts)
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
  1463
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1464
        actions[mergestatemod.ACTION_MERGE] = [
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1465
            a for a in actions[mergestatemod.ACTION_MERGE] if a[0] in mfiles
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1466
        ]
27080
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
  1467
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38351
diff changeset
  1468
    progress.complete()
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1469
    assert len(getfiledata) == (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1470
        len(actions[mergestatemod.ACTION_GET]) if wantfiledata else 0
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1471
    )
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1472
    return updateresult(updated, merged, removed, unresolved), getfiledata
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
  1473
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1474
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1475
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
  1476
UPDATECHECK_NONE = b'none'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1477
UPDATECHECK_LINEAR = b'linear'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1478
UPDATECHECK_NO_CONFLICT = b'noconflict'
42972
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42961
diff changeset
  1479
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1480
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1481
def update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1482
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1483
    node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1484
    branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1485
    force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1486
    ancestor=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1487
    mergeancestor=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1488
    labels=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1489
    matcher=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1490
    mergeforce=False,
44318
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1491
    updatedirstate=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1492
    updatecheck=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1493
    wc=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1494
):
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1495
    """
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1496
    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
  1497
30931
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30930
diff changeset
  1498
    node = the node to update to
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1499
    branchmerge = whether to merge between branches
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1500
    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
  1501
    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
  1502
    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
  1503
      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
  1504
      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
  1505
      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
  1506
      as a temporary fix and should be avoided in general.
28019
e81d11794036 merge: add missing doc for 'labels' parameter
Siddharth Agarwal <sid0@fb.com>
parents: 28018
diff changeset
  1507
    labels = labels to use for base, local and other
28020
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
  1508
    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
  1509
      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
  1510
34919
1856de4d1297 update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents: 34885
diff changeset
  1511
    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
  1512
    -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
  1513
    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
  1514
    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
  1515
    option doesn't exist on the command line, but represents the
31178
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1516
    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
  1517
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 12032
diff changeset
  1518
    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
  1519
31178
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1520
    -c  -C  -n  -m  dirty  rev  linear  |  result
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1521
     y   y   *   *    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1522
     y   *   y   *    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1523
     y   *   *   y    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1524
     *   y   y   *    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1525
     *   y   *   y    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1526
     *   *   y   y    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1527
     *   *   *   *    *     n     n     |     x
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1528
     *   *   *   *    n     *     *     |    ok
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1529
     n   n   n   n    y     *     y     |   merge
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1530
     n   n   n   n    y     y     n     |    (2)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1531
     n   n   n   y    y     *     *     |   merge
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1532
     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: 31176
diff changeset
  1533
     n   y   n   n    y     *     *     |  discard
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1534
     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
  1535
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
  1536
    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
  1537
    * = don't-care
31171
351207bfdde9 merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents: 31170
diff changeset
  1538
    1 = incompatible options (checked in commands.py)
351207bfdde9 merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents: 31170
diff changeset
  1539
    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: 31170
diff changeset
  1540
    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
  1541
34309
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34157
diff changeset
  1542
    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: 34157
diff changeset
  1543
    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: 34157
diff changeset
  1544
13162
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
  1545
    Return the same tuple as applyupdates().
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1546
    """
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1547
    # Avoid cycle.
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1548
    from . import sparse
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
  1549
31176
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31175
diff changeset
  1550
    # This function used to find the default destination if node was None, but
30931
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30930
diff changeset
  1551
    # that's now in destutil.py.
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30930
diff changeset
  1552
    assert node is not None
31176
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31175
diff changeset
  1553
    if not branchmerge and not force:
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31175
diff changeset
  1554
        # 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: 31175
diff changeset
  1555
        # 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: 31175
diff changeset
  1556
        # 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: 31175
diff changeset
  1557
        if updatecheck is None:
42972
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42961
diff changeset
  1558
            updatecheck = UPDATECHECK_LINEAR
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1559
        if updatecheck not in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1560
            UPDATECHECK_NONE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1561
            UPDATECHECK_LINEAR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1562
            UPDATECHECK_NO_CONFLICT,
42974
71bb9363818c merge: check argument value with if/raise instead of an assert
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1563
        ):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1564
            raise ValueError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1565
                r'Invalid updatecheck %r (can accept %r)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1566
                % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1567
                    updatecheck,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1568
                    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1569
                        UPDATECHECK_NONE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1570
                        UPDATECHECK_LINEAR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1571
                        UPDATECHECK_NO_CONFLICT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1572
                    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1573
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1574
            )
45019
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44980
diff changeset
  1575
    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: 44980
diff changeset
  1576
        maybe_wlock = util.nullcontextmanager()
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44980
diff changeset
  1577
    else:
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44980
diff changeset
  1578
        maybe_wlock = repo.wlock()
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44980
diff changeset
  1579
    with maybe_wlock:
34309
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34157
diff changeset
  1580
        if wc is None:
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34157
diff changeset
  1581
            wc = repo[None]
20279
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
  1582
        pl = wc.parents()
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
  1583
        p1 = pl[0]
42428
72522fe7fb95 merge: reorder some initialization to make more sense
Martin von Zweigbergk <martinvonz@google.com>
parents: 42205
diff changeset
  1584
        p2 = repo[node]
23405
2a038deeac9a merge: 0 is a valid ancestor different from None
Mads Kiilerich <madski@unity3d.com>
parents: 23398
diff changeset
  1585
        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
  1586
            pas = [repo[ancestor]]
42429
a5b5ecff5f37 merge: simplify initialization of "pas"
Martin von Zweigbergk <martinvonz@google.com>
parents: 42428
diff changeset
  1587
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1588
            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
  1589
                cahs = repo.changelog.commonancestorsheads(p1.node(), p2.node())
f4014f646f71 merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21082
diff changeset
  1590
                pas = [repo[anc] for anc in (sorted(cahs) or [nullid])]
f4014f646f71 merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21082
diff changeset
  1591
            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
  1592
                pas = [p1.ancestor(p2, warn=branchmerge)]
13874
9d67277c9204 merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents: 13728
diff changeset
  1593
36215
187f2474bc11 merge: coerce nodes to bytes, not str
Augie Fackler <augie@google.com>
parents: 36180
diff changeset
  1594
        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
  1595
42428
72522fe7fb95 merge: reorder some initialization to make more sense
Martin von Zweigbergk <martinvonz@google.com>
parents: 42205
diff changeset
  1596
        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
  1597
        ### check phase
27316
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1598
        if not overwrite:
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1599
            if len(pl) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1600
                raise error.Abort(_(b"outstanding uncommitted merge"))
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1601
            ms = mergestatemod.mergestate.read(repo)
27316
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1602
            if list(ms.unresolved()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1603
                raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1604
                    _(b"outstanding merge conflicts"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1605
                    hint=_(b"use 'hg resolve' to resolve"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1606
                )
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
  1607
        if branchmerge:
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
  1608
            if pas == [p2]:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1609
                raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1610
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1611
                        b"merging with a working directory ancestor"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1612
                        b" has no effect"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1613
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1614
                )
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
  1615
            elif pas == [p1]:
31388
b6a6df38a802 merge: check current wc branch for 'nothing to merge', not its p1
Mads Kiilerich <mads@kiilerich.com>
parents: 31332
diff changeset
  1616
                if not mergeancestor and wc.branch() == p2.branch():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1617
                    raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1618
                        _(b"nothing to merge"),
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
  1619
                        hint=_(b"use 'hg update' or check 'hg heads'"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1620
                    )
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
  1621
            if not force and (wc.files() or wc.deleted()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1622
                raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1623
                    _(b"uncommitted changes"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1624
                    hint=_(b"use 'hg status' to list changes"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1625
                )
35293
1b03407e808d merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents: 35292
diff changeset
  1626
            if not wc.isinmemory():
1b03407e808d merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents: 35292
diff changeset
  1627
                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: 35292
diff changeset
  1628
                    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
  1629
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
  1630
        elif not overwrite:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1631
            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
  1632
                # 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
  1633
                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
  1634
                repo.hook(b'update', parent1=xp2, parent2=b'', error=0)
37110
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
  1635
                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
  1636
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1637
            if updatecheck == UPDATECHECK_LINEAR and pas not in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1638
                [p1],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1639
                [p2],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1640
            ):  # nonlinear
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1641
                dirty = wc.dirty(missing=True)
30931
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30930
diff changeset
  1642
                if dirty:
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1643
                    # Branching is a bit strange to ensure we do the minimal
33152
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33107
diff changeset
  1644
                    # amount of call to obsutil.foreground.
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33107
diff changeset
  1645
                    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
  1646
                    # 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
  1647
                    if repo[node].node() in foreground:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1648
                        pass  # allow updating to successors
30931
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30930
diff changeset
  1649
                    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1650
                        msg = _(b"uncommitted changes")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1651
                        hint = _(b"commit or update --clean to discard changes")
30981
330fbd515512 destutil: remove duplicate check and leave it to merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30932
diff changeset
  1652
                        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
  1653
                else:
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1654
                    # Allow jumping branches if clean and specific rev given
30930
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1655
                    pass
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1656
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1657
        if overwrite:
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1658
            pas = [wc]
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1659
        elif not branchmerge:
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1660
            pas = [p1]
2814
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
  1661
25843
bf9ea348b487 merge: mark ancient debugging option
Matt Mackall <mpm@selenic.com>
parents: 25754
diff changeset
  1662
        # deprecated config: merge.followcopies
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1663
        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
  1664
        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
  1665
            followcopies = False
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
  1666
        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
  1667
            followcopies = False
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
  1668
        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
  1669
            followcopies = False
21080
04540a8499a3 merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents: 21024
diff changeset
  1670
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
  1671
        ### calculate phase
23641
a7a0f32a383f merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23640
diff changeset
  1672
        actionbyfile, diverge, renamedelete = calculateupdates(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1673
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1674
            wc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1675
            p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1676
            pas,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1677
            branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1678
            force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1679
            mergeancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1680
            followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1681
            matcher=matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1682
            mergeforce=mergeforce,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1683
        )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1684
42972
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42961
diff changeset
  1685
        if updatecheck == UPDATECHECK_NO_CONFLICT:
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
  1686
            for f, (m, args, msg) in pycompat.iteritems(actionbyfile):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1687
                if m not in (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1688
                    mergestatemod.ACTION_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1689
                    mergestatemod.ACTION_KEEP,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1690
                    mergestatemod.ACTION_EXEC,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1691
                    mergestatemod.ACTION_REMOVE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1692
                    mergestatemod.ACTION_PATH_CONFLICT_RESOLVE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1693
                    mergestatemod.ACTION_GET_OTHER_AND_STORE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1694
                ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1695
                    msg = _(b"conflicting changes")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1696
                    hint = _(b"commit or update --clean to discard changes")
31178
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1697
                    raise error.Abort(msg, hint=hint)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
  1698
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1699
        # 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
  1700
        # already, but we can't handle .hgsubstate in filemerge or
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  1701
        # subrepoutil.submerge yet so we have to keep prompting for it.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1702
        if b'.hgsubstate' in actionbyfile:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1703
            f = b'.hgsubstate'
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1704
            m, args, msg = actionbyfile[f]
29785
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29629
diff changeset
  1705
            prompts = filemerge.partextras(labels)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1706
            prompts[b'f'] = f
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1707
            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
  1708
                if repo.ui.promptchoice(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1709
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1710
                        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
  1711
                        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
  1712
                        b"$$ &Changed $$ &Delete"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1713
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1714
                    % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1715
                    0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1716
                ):
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1717
                    actionbyfile[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1718
                        mergestatemod.ACTION_REMOVE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1719
                        None,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1720
                        b'prompt delete',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1721
                    )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1722
                elif f in p1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1723
                    actionbyfile[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1724
                        mergestatemod.ACTION_ADD_MODIFIED,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1725
                        None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1726
                        b'prompt keep',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1727
                    )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1728
                else:
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1729
                    actionbyfile[f] = (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1730
                        mergestatemod.ACTION_ADD,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1731
                        None,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1732
                        b'prompt keep',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1733
                    )
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1734
            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
  1735
                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
  1736
                flags = p2[f2].flags()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1737
                if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1738
                    repo.ui.promptchoice(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1739
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1740
                            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
  1741
                            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
  1742
                            b"$$ &Changed $$ &Deleted"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1743
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1744
                        % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1745
                        0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1746
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1747
                    == 0
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1748
                ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1749
                    actionbyfile[f] = (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1750
                        mergestatemod.ACTION_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1751
                        (flags, False),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1752
                        b'prompt recreating',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1753
                    )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1754
                else:
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1755
                    del actionbyfile[f]
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1756
23641
a7a0f32a383f merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23640
diff changeset
  1757
        # Convert to dictionary-of-lists format
41042
54c3b4bd01f2 merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 39823
diff changeset
  1758
        actions = emptyactions()
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
  1759
        for f, (m, args, msg) in pycompat.iteritems(actionbyfile):
23641
a7a0f32a383f merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23640
diff changeset
  1760
            if m not in actions:
a7a0f32a383f merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23640
diff changeset
  1761
                actions[m] = []
a7a0f32a383f merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23640
diff changeset
  1762
            actions[m].append((f, args, msg))
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1763
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1764
        # ACTION_GET_OTHER_AND_STORE is a mergestatemod.ACTION_GET + store in mergestate
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1765
        for e in actions[mergestatemod.ACTION_GET_OTHER_AND_STORE]:
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1766
            actions[mergestatemod.ACTION_GET].append(e)
44688
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
  1767
29893
6f447b9ec263 util: rename checkcase() to fscasesensitive() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 29842
diff changeset
  1768
        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
  1769
            # check collision between files only in p2 for clean update
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1770
            if not branchmerge and (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1771
                force or not wc.dirty(missing=True, branch=False)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1772
            ):
23544
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  1773
                _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
  1774
            else:
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  1775
                _checkcollision(repo, wc.manifest(), actions)
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  1776
23525
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1777
        # divergent renames
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
  1778
        for f, fl in sorted(pycompat.iteritems(diverge)):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1779
            repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1780
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1781
                    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
  1782
                    b"multiple times to:\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1783
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1784
                % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1785
            )
42110
3a7efcbdf288 copies: print list of divergent renames in sorted order
Martin von Zweigbergk <martinvonz@google.com>
parents: 42057
diff changeset
  1786
            for nf in sorted(fl):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1787
                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
  1788
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1789
        # rename and delete
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
  1790
        for f, fl in sorted(pycompat.iteritems(renamedelete)):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1791
            repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1792
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1793
                    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
  1794
                    b"and renamed to:\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1795
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1796
                % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1797
            )
42110
3a7efcbdf288 copies: print list of divergent renames in sorted order
Martin von Zweigbergk <martinvonz@google.com>
parents: 42057
diff changeset
  1798
            for nf in sorted(fl):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1799
                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
  1800
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  1801
        ### apply phase
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1802
        if not branchmerge:  # just jump to the new rev
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1803
            fp1, fp2, xp1, xp2 = fp2, nullid, xp2, b''
44245
ae9310709c13 merge: move definition of `partial` closer to where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 44236
diff changeset
  1804
        # If we're doing a partial update, we need to skip updating
44246
faec51c76b7b merge: avoid a negation in the definition of updatedirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44245
diff changeset
  1805
        # the dirstate.
faec51c76b7b merge: avoid a negation in the definition of updatedirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44245
diff changeset
  1806
        always = matcher is None or matcher.always()
44318
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1807
        updatedirstate = updatedirstate and always and not wc.isinmemory()
44236
d1c0f239193f merge: define updatedirstate a little earlier and reuse it
Martin von Zweigbergk <martinvonz@google.com>
parents: 44235
diff changeset
  1808
        if updatedirstate:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1809
            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
  1810
            # 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
  1811
            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
  1812
34885
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1813
        # Advertise fsmonitor when its presence could be useful.
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1814
        #
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1815
        # We only advertise when performing an update from an empty working
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1816
        # directory. This typically only occurs during initial clone.
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1817
        #
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1818
        # We give users a mechanism to disable the warning in case it is
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1819
        # annoying.
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1820
        #
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1821
        # We only allow on Linux and MacOS because that's where fsmonitor is
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1822
        # considered stable.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1823
        fsmonitorwarning = repo.ui.configbool(b'fsmonitor', b'warn_when_unused')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1824
        fsmonitorthreshold = repo.ui.configint(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1825
            b'fsmonitor', b'warn_update_file_count'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1826
        )
34885
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1827
        try:
36048
46a54de96a54 merge: cut import cycle at merge -> extensions
Yuya Nishihara <yuya@tcha.org>
parents: 36047
diff changeset
  1828
            # avoid cycle: extensions -> cmdutil -> merge
46a54de96a54 merge: cut import cycle at merge -> extensions
Yuya Nishihara <yuya@tcha.org>
parents: 36047
diff changeset
  1829
            from . import extensions
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1830
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1831
            extensions.find(b'fsmonitor')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1832
            fsmonitorenabled = repo.ui.config(b'fsmonitor', b'mode') != b'off'
34885
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1833
            # We intentionally don't look at whether fsmonitor has disabled
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1834
            # itself because a) fsmonitor may have already printed a warning
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1835
            # b) we only care about the config state here.
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1836
        except KeyError:
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1837
            fsmonitorenabled = False
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1838
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1839
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1840
            fsmonitorwarning
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1841
            and not fsmonitorenabled
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1842
            and p1.node() == nullid
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1843
            and len(actions[mergestatemod.ACTION_GET]) >= fsmonitorthreshold
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1844
            and pycompat.sysplatform.startswith((b'linux', b'darwin'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1845
        ):
34885
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1846
            repo.ui.warn(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1847
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1848
                    b'(warning: large working directory being used without '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1849
                    b'fsmonitor enabled; enable fsmonitor to improve performance; '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1850
                    b'see "hg help -e fsmonitor")\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1851
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1852
            )
34885
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  1853
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1854
        wantfiledata = updatedirstate and not branchmerge
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1855
        stats, getfiledata = applyupdates(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1856
            repo, actions, wc, p2, overwrite, wantfiledata, labels=labels
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1857
        )
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  1858
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
  1859
        if updatedirstate:
32390
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32286
diff changeset
  1860
            with repo.dirstate.parentchange():
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32286
diff changeset
  1861
                repo.setparents(fp1, fp2)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1862
                mergestatemod.recordupdates(
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1863
                    repo, actions, branchmerge, getfiledata
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
  1864
                )
32390
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32286
diff changeset
  1865
                # update completed, clear state
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1866
                util.unlink(repo.vfs.join(b'updatestate'))
19482
499fc471296b update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents: 19285
diff changeset
  1867
32390
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32286
diff changeset
  1868
                if not branchmerge:
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32286
diff changeset
  1869
                    repo.dirstate.setbranch(p2.branch())
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10431
diff changeset
  1870
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1871
    # If we're updating to a location, clean up any stale temporary includes
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1872
    # (ex: this happens during hg rebase --abort).
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1873
    if not branchmerge:
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1874
        sparse.prunetemporaryincludes(repo)
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1875
44235
ff22c76825b9 merge: don't call update hook when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 44092
diff changeset
  1876
    if updatedirstate:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1877
        repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1878
            b'update', parent1=xp1, parent2=xp2, error=stats.unresolvedcount
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1879
        )
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10431
diff changeset
  1880
    return stats
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1881
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1882
44430
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1883
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: 44425
diff changeset
  1884
    """Merge another topological branch into the working copy.
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1885
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1886
    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: 44425
diff changeset
  1887
    """
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1888
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1889
    return update(
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1890
        ctx.repo(),
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1891
        ctx.rev(),
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1892
        labels=labels,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1893
        branchmerge=True,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1894
        force=force,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1895
        mergeforce=force,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1896
        wc=wc,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1897
    )
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1898
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
  1899
44317
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
  1900
def clean_update(ctx, wc=None):
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
  1901
    """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: 44289
diff changeset
  1902
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
  1903
    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: 44289
diff changeset
  1904
    working copy.
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
  1905
    """
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
  1906
    return update(ctx.repo(), ctx.rev(), branchmerge=False, force=True, wc=wc)
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
  1907
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
  1908
44318
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1909
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: 44317
diff changeset
  1910
    """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: 44317
diff changeset
  1911
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1912
    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: 44317
diff changeset
  1913
    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: 44317
diff changeset
  1914
    """
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1915
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1916
    return update(
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1917
        ctx.repo(),
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1918
        ctx.rev(),
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1919
        branchmerge=False,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1920
        force=True,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1921
        updatedirstate=False,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1922
        matcher=matcher,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1923
        wc=wc,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1924
    )
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1925
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
  1926
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1927
def graft(
44285
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1928
    repo,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1929
    ctx,
44286
cb8b67016110 graft: default `base` argument to common case of `ctx.p1()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44285
diff changeset
  1930
    base=None,
44285
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1931
    labels=None,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1932
    keepparent=False,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1933
    keepconflictparent=False,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1934
    wctx=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1935
):
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1936
    """Do a graft-like merge.
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1937
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1938
    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
  1939
    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
  1940
    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
  1941
    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
  1942
    renames/copies appropriately.
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1943
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1944
    ctx - changeset to rebase
44286
cb8b67016110 graft: default `base` argument to common case of `ctx.p1()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44285
diff changeset
  1945
    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
  1946
    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
  1947
    keepparent - keep second parent if any
42431
127937874395 merge: correct argument name in docstring
Anton Shestakov <av6@dwimlabs.net>
parents: 42429
diff changeset
  1948
    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
  1949
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1950
    """
24643
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
  1951
    # 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
  1952
    # 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
  1953
    # 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
  1954
    # 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
  1955
    # 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
  1956
    # which local deleted".
44414
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44335
diff changeset
  1957
    # 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: 44335
diff changeset
  1958
    # doesn't matter as there can't possibly be conflicts, but 1) is necessary.
44285
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1959
    wctx = wctx or repo[None]
44089
bd22e90c54b3 graft: extract repo[None] to a variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 44060
diff changeset
  1960
    pctx = wctx.p1()
44286
cb8b67016110 graft: default `base` argument to common case of `ctx.p1()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44285
diff changeset
  1961
    base = base or ctx.p1()
44414
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44335
diff changeset
  1962
    mergeancestor = (
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44335
diff changeset
  1963
        repo.changelog.isancestor(pctx.node(), ctx.node())
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44335
diff changeset
  1964
        or pctx.rev() == base.rev()
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44335
diff changeset
  1965
    )
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1966
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1967
    stats = update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1968
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1969
        ctx.node(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1970
        True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1971
        True,
43814
ebfd349eac46 graft: rename `pctx` argument to `base` since that's what it is
Martin von Zweigbergk <martinvonz@google.com>
parents: 43807
diff changeset
  1972
        base.node(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1973
        mergeancestor=mergeancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1974
        labels=labels,
44285
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1975
        wc=wctx,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  1976
    )
38498
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
  1977
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
  1978
    if keepconflictparent and stats.unresolvedcount:
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
  1979
        pother = ctx.node()
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
  1980
    else:
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
  1981
        pother = nullid
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
  1982
        parents = ctx.parents()
43814
ebfd349eac46 graft: rename `pctx` argument to `base` since that's what it is
Martin von Zweigbergk <martinvonz@google.com>
parents: 43807
diff changeset
  1983
        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: 43807
diff changeset
  1984
            parents.remove(base)
38498
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
  1985
            pother = parents[0].node()
43816
32d11a23c9cf graft: never set both parents equal in the dirstate (issue6098)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43815
diff changeset
  1986
    # 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: 43815
diff changeset
  1987
    if pother == pctx.node():
32d11a23c9cf graft: never set both parents equal in the dirstate (issue6098)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43815
diff changeset
  1988
        pother = nullid
27267
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  1989
44285
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1990
    if wctx.isinmemory():
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1991
        wctx.setparents(pctx.node(), pother)
32390
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32286
diff changeset
  1992
        # 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
  1993
        copies.graftcopies(wctx, ctx, base)
44285
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1994
    else:
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1995
        with repo.dirstate.parentchange():
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1996
            repo.setparents(pctx.node(), pother)
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1997
            repo.dirstate.write(repo.currenttransaction())
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1998
            # fix up dirstate for copies and renames
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
  1999
            copies.graftcopies(wctx, ctx, base)
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2000
    return stats
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2001
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  2002
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  2003
def purge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  2004
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  2005
    matcher,
44335
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44333
diff changeset
  2006
    unknown=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  2007
    ignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  2008
    removeemptydirs=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  2009
    removefiles=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  2010
    abortonerror=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  2011
    noop=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
  2012
):
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2013
    """Purge the working directory of untracked files.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2014
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2015
    ``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
  2016
    potentially a subset.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2017
44335
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44333
diff changeset
  2018
    ``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: 44333
diff changeset
  2019
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44333
diff changeset
  2020
    ``ignored`` controls whether ignored files should be purged.
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2021
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2022
    ``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
  2023
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2024
    ``removefiles`` controls whether files are removed.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2025
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2026
    ``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
  2027
    deleting a file or directory.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2028
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2029
    ``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
  2030
    will be taken.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2031
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2032
    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
  2033
    or would be removed.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2034
    """
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2035
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2036
    def remove(removefn, path):
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2037
        try:
39481
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39480
diff changeset
  2038
            removefn(path)
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2039
        except OSError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2040
            m = _(b'%s cannot be removed') % path
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2041
            if abortonerror:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2042
                raise error.Abort(m)
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2043
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2044
                repo.ui.warn(_(b'warning: %s\n') % m)
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2045
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2046
    # 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
  2047
    # restore it when we're done.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2048
    oldtraversedir = matcher.traversedir
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2049
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2050
    res = []
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2051
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2052
    try:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2053
        if removeemptydirs:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2054
            directories = []
43752
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43677
diff changeset
  2055
            matcher.traversedir = directories.append
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2056
44335
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44333
diff changeset
  2057
        status = repo.status(match=matcher, ignored=ignored, unknown=unknown)
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2058
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2059
        if removefiles:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2060
            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
  2061
                if not noop:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2062
                    repo.ui.note(_(b'removing file %s\n') % f)
39481
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39480
diff changeset
  2063
                    remove(repo.wvfs.unlink, f)
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2064
                res.append(f)
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2065
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2066
        if removeemptydirs:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2067
            for f in sorted(directories, reverse=True):
39481
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39480
diff changeset
  2068
                if matcher(f) and not repo.wvfs.listdir(f):
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2069
                    if not noop:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2070
                        repo.ui.note(_(b'removing directory %s\n') % f)
39481
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39480
diff changeset
  2071
                        remove(repo.wvfs.rmdir, f)
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2072
                    res.append(f)
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2073
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2074
        return res
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2075
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2076
    finally:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2077
        matcher.traversedir = oldtraversedir