mercurial/merge.py
author Pulkit Goyal <7895pulkit@gmail.com>
Tue, 01 Sep 2020 17:08:26 +0530
changeset 45467 bb9888d32601
parent 45466 14b3dbfa4eeb
child 45468 09edbff6ae8d
permissions -rw-r--r--
merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent There are files which were deleted/not present in working copy parent but were present on other side of merge. On merge, we might decide to keep them deleted. We want to track such cases more closely, rather all kind of cases which results from some kind of merging logic. We do have `ACTION_KEEP` but having a dedicated action for the absent case is more cleaner. Initially I named the action as `ACTION_KEEP_DELETED` but later realized that file can be not-present because of other reasons than deletion like rename, hence decided to use more generic name `ACTION_KEEP_ABSENT`. Differential Revision: https://phab.mercurial-scm.org/D8974
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
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
    10
import collections
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    11
import errno
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
    12
import stat
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    13
import struct
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    14
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    15
from .i18n import _
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    16
from .node import (
30361
1070df141718 dirstate: change added/modified placeholder hash length to 20 bytes
Durham Goode <durham@fb.com>
parents: 30332
diff changeset
    17
    addednodeid,
30362
3c6893ba2d36 merge: change modified indicator to be 20 bytes
Durham Goode <durham@fb.com>
parents: 30361
diff changeset
    18
    modifiednodeid,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    19
    nullid,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    20
    nullrev,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    21
)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    22
from .thirdparty import attr
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    23
from . import (
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    24
    copies,
39818
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39464
diff changeset
    25
    encoding,
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26570
diff changeset
    26
    error,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    27
    filemerge,
31257
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31175
diff changeset
    28
    match as matchmod,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
    29
    mergestate as mergestatemod,
33146
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33095
diff changeset
    30
    obsutil,
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
    31
    pathutil,
30519
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30486
diff changeset
    32
    pycompat,
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
    33
    scmutil,
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
    34
    subrepoutil,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    35
    util,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    36
    worker,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    37
)
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
    38
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    39
_pack = struct.pack
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    40
_unpack = struct.unpack
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    41
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    42
27740
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
    43
def _getcheckunknownconfig(repo, section, name):
34522
bed1d2eaa108 configitems: register 'merge.checkunknown' and 'merge.checkignored'
Boris Feld <boris.feld@octobus.net>
parents: 34486
diff changeset
    44
    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
    45
    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
    46
    if config not in valid:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    47
        validstr = b', '.join([b"'" + v + b"'" for v in valid])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    48
        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
    49
            _(b"%s.%s not valid ('%s' is none of %s)")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    50
            % (section, name, config, validstr)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    51
        )
27740
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
    52
    return config
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
    53
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    54
23653
0297d8469350 merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents: 23652
diff changeset
    55
def _checkunknownfile(repo, wctx, mctx, f, f2=None):
35288
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    56
    if wctx.isinmemory():
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    57
        # Nothing to do in IMM because nothing in the "working copy" can be an
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    58
        # unknown file.
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    59
        #
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    60
        # Note that we should bail out here, not in ``_checkunknownfiles()``,
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    61
        # because that function does other useful work.
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    62
        return False
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    63
23653
0297d8469350 merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents: 23652
diff changeset
    64
    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
    65
        f2 = f
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    66
    return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    67
        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
    68
        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
    69
        and repo.dirstate.normalize(f) not in repo.dirstate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    70
        and mctx[f2].cmp(wctx[f])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    71
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    72
16093
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16092
diff changeset
    73
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    74
class _unknowndirschecker(object):
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    75
    """
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    76
    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
    77
    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
    78
    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
    79
    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
    80
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    81
    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
    82
    no conflict.
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    83
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
    84
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    85
    def __init__(self):
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    86
        # 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
    87
        # 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
    88
        # to be safe.
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    89
        self._unknowndircache = set()
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    90
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
    91
        # 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
    92
        # 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
    93
        # 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
    94
        self._missingdircache = set()
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
    95
35288
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    96
    def __call__(self, repo, wctx, f):
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    97
        if wctx.isinmemory():
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    98
            # Nothing to do in IMM for the same reason as ``_checkunknownfile``.
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
    99
            return False
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35284
diff changeset
   100
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   101
        # Check for path prefixes that exist as unknown files.
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
   102
        for p in reversed(list(pathutil.finddirs(f))):
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   103
            if p in self._missingdircache:
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   104
                return
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   105
            if p in self._unknowndircache:
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   106
                continue
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   107
            if repo.wvfs.audit.check(p):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   108
                if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   109
                    repo.wvfs.isfileorlink(p)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   110
                    and repo.dirstate.normalize(p) not in repo.dirstate
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   111
                ):
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   112
                    return p
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   113
                if not repo.wvfs.lexists(p):
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   114
                    self._missingdircache.add(p)
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   115
                    return
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   116
                self._unknowndircache.add(p)
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   117
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   118
        # 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
   119
        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
   120
            # 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
   121
            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
   122
                for fn in files:
37086
658b1d28813c merge: pconvert paths in _unknowndirschecker before dirstate-normalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 36537
diff changeset
   123
                    relf = util.pconvert(repo.wvfs.reljoin(p, fn))
37087
e4640ec346ac merge: add 'isknown=True' to a dirstate.normalize() in _unknowndirschecker
Matt Harbison <matt_harbison@yahoo.com>
parents: 37086
diff changeset
   124
                    relf = repo.dirstate.normalize(relf, isknown=True)
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   125
                    if relf not in repo.dirstate:
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   126
                        return f
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   127
        return None
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
   128
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   129
45287
4ad6c4e9e35f merge: pass mergeresult instead of actions in _checkunknownfiles() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45286
diff changeset
   130
def _checkunknownfiles(repo, wctx, mctx, force, mresult, mergeforce):
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   131
    """
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   132
    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
   133
    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
   134
    choose a different action.
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   135
    """
34551
1609a5afc4f5 merge: rename conflicts to fileconflicts in _checkunknownfiles
Mark Thomas <mbthomas@fb.com>
parents: 34550
diff changeset
   136
    fileconflicts = set()
34552
33c8a6837181 merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34551
diff changeset
   137
    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
   138
    warnconflicts = set()
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   139
    abortconflicts = set()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   140
    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
   141
    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
   142
    pathconfig = repo.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   143
        b'experimental', b'merge.checkpathconflicts'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   144
    )
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   145
    if not force:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   146
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   147
        def collectconflicts(conflicts, config):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   148
            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
   149
                abortconflicts.update(conflicts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   150
            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
   151
                warnconflicts.update(conflicts)
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   152
35171
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
   153
        checkunknowndirs = _unknowndirschecker()
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   154
        for f in mresult.files(
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   155
            (
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   156
                mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   157
                mergestatemod.ACTION_DELETED_CHANGED,
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   158
            )
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   159
        ):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   160
            if _checkunknownfile(repo, wctx, mctx, f):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   161
                fileconflicts.add(f)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   162
            elif pathconfig and f not in wctx:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   163
                path = checkunknowndirs(repo, wctx, f)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   164
                if path is not None:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   165
                    pathconflicts.add(path)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   166
        for f, args, msg in mresult.getactions(
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   167
            [mergestatemod.ACTION_LOCAL_DIR_RENAME_GET]
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   168
        ):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   169
            if _checkunknownfile(repo, wctx, mctx, f, args[0]):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   170
                fileconflicts.add(f)
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   171
34552
33c8a6837181 merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34551
diff changeset
   172
        allconflicts = fileconflicts | pathconflicts
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   173
        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
   174
        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
   175
        collectconflicts(ignoredconflicts, ignoredconfig)
6b639caa1652 merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents: 27741
diff changeset
   176
        collectconflicts(unknownconflicts, unknownconfig)
28022
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   177
    else:
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
   178
        for f, args, msg in list(
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
   179
            mresult.getactions([mergestatemod.ACTION_CREATED_MERGE])
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   180
        ):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   181
            fl2, anc = args
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   182
            different = _checkunknownfile(repo, wctx, mctx, f)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   183
            if repo.dirstate._ignore(f):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   184
                config = ignoredconfig
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   185
            else:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   186
                config = unknownconfig
28022
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   187
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   188
            # The behavior when force is True is described by this table:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   189
            #  config  different  mergeforce  |    action    backup
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   190
            #    *         n          *       |      get        n
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   191
            #    *         y          y       |     merge       -
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   192
            #   abort      y          n       |     merge       -   (1)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   193
            #   warn       y          n       |  warn + get     y
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   194
            #  ignore      y          n       |      get        y
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   195
            #
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   196
            # (1) this is probably the wrong behavior here -- we should
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   197
            #     probably abort, but some actions like rebases currently
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   198
            #     don't like an abort happening in the middle of
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   199
            #     merge.update.
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   200
            if not different:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   201
                mresult.addfile(
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   202
                    f,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   203
                    mergestatemod.ACTION_GET,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   204
                    (fl2, False),
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   205
                    b'remote created',
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   206
                )
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   207
            elif mergeforce or config == b'abort':
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   208
                mresult.addfile(
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   209
                    f,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   210
                    mergestatemod.ACTION_MERGE,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   211
                    (f, f, None, False, anc),
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   212
                    b'remote differs from untracked local',
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   213
                )
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   214
            elif config == b'abort':
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   215
                abortconflicts.add(f)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   216
            else:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   217
                if config == b'warn':
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   218
                    warnconflicts.add(f)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   219
                mresult.addfile(
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   220
                    f, mergestatemod.ACTION_GET, (fl2, True), b'remote created',
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   221
                )
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   222
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   223
    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
   224
        warn = repo.ui.warn
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
   225
        if f in pathconflicts:
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
   226
            if repo.wvfs.isfileorlink(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   227
                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
   228
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   229
                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
   230
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   231
            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
   232
    if abortconflicts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   233
        raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   234
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   235
                b"untracked files in working directory "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   236
                b"differ from files in requested revision"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   237
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   238
        )
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   239
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   240
    for f in sorted(warnconflicts):
34553
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
   241
        if repo.wvfs.isfileorlink(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   242
            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
   243
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   244
            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
   245
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
   246
    for f, args, msg in list(
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
   247
        mresult.getactions([mergestatemod.ACTION_CREATED])
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
   248
    ):
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   249
        backup = (
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   250
            f in fileconflicts
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   251
            or f in pathconflicts
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   252
            or any(p in pathconflicts for p in pathutil.finddirs(f))
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   253
        )
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   254
        (flags,) = args
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   255
        mresult.addfile(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
   256
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   257
45347
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45346
diff changeset
   258
def _forgetremoved(wctx, mctx, branchmerge, mresult):
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   259
    """
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   260
    Forget removed files
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   261
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   262
    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
   263
    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
   264
    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
   265
    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
   266
    manifest.
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   267
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   268
    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
   269
    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
   270
    as removed.
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   271
    """
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   272
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   273
    m = mergestatemod.ACTION_FORGET
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   274
    if branchmerge:
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   275
        m = mergestatemod.ACTION_REMOVE
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   276
    for f in wctx.deleted():
6272
dd9bd227ae9a merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents: 6271
diff changeset
   277
        if f not in mctx:
45347
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45346
diff changeset
   278
            mresult.addfile(f, m, None, b"forget deleted")
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   279
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   280
    if not branchmerge:
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   281
        for f in wctx.removed():
6272
dd9bd227ae9a merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents: 6271
diff changeset
   282
            if f not in mctx:
45347
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45346
diff changeset
   283
                mresult.addfile(
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45346
diff changeset
   284
                    f, mergestatemod.ACTION_FORGET, None, b"forget removed",
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   285
                )
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   286
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   287
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   288
def _checkcollision(repo, wmf, mresult):
38045
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38044
diff changeset
   289
    """
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38044
diff changeset
   290
    Check for case-folding collisions.
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38044
diff changeset
   291
    """
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38044
diff changeset
   292
    # If the repo is narrowed, filter out files outside the narrowspec.
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38044
diff changeset
   293
    narrowmatch = repo.narrowmatch()
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38044
diff changeset
   294
    if not narrowmatch.always():
44287
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44271
diff changeset
   295
        pmmf = set(wmf.walk(narrowmatch))
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   296
        if mresult:
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   297
            for f in list(mresult.files()):
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   298
                if not narrowmatch(f):
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   299
                    mresult.removefile(f)
44287
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44271
diff changeset
   300
    else:
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44271
diff changeset
   301
        # build provisional merged manifest up
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44271
diff changeset
   302
        pmmf = set(wmf)
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   303
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   304
    if mresult:
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
   305
        # KEEP and EXEC are no-op
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   306
        for f in mresult.files(
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   307
            (
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   308
                mergestatemod.ACTION_ADD,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   309
                mergestatemod.ACTION_ADD_MODIFIED,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   310
                mergestatemod.ACTION_FORGET,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   311
                mergestatemod.ACTION_GET,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   312
                mergestatemod.ACTION_CHANGED_DELETED,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   313
                mergestatemod.ACTION_DELETED_CHANGED,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   314
            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   315
        ):
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   316
            pmmf.add(f)
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   317
        for f in mresult.files((mergestatemod.ACTION_REMOVE,)):
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   318
            pmmf.discard(f)
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   319
        for f, args, msg in mresult.getactions(
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   320
            [mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL]
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   321
        ):
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)
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   325
        for f in mresult.files((mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,)):
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   326
            pmmf.add(f)
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
   327
        for f, args, msg in mresult.getactions([mergestatemod.ACTION_MERGE]):
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   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 = {}
33808
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: 42972
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: 42972
diff changeset
   340
                % (f, foldmap[fold])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
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: 42972
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: 42972
diff changeset
   351
                % (lastfull, f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
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: 42972
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: 42972
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: 42972
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:
43633
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: 42972
diff changeset
   384
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   385
def checkpathconflicts(repo, wctx, mctx, mresult):
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   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
35172
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
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: 35171
diff changeset
   405
    createdfiledirs = set()
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
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
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   410
    for f in mresult.files(
45342
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   411
        (
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   412
            mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
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: 44687
diff changeset
   414
            mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   415
            mergestatemod.ACTION_CREATED_MERGE,
45342
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   416
        )
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   417
    ):
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   418
        # This action may create a new local file.
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   419
        createdfiledirs.update(pathutil.finddirs(f))
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   420
        if mf.hasdir(f):
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   421
            # The file aliases a local directory.  This might be ok if all
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   422
            # the files in the local directory are being deleted.  This
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   423
            # will be checked once we know what all the deleted files are.
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   424
            remoteconflicts.add(f)
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   425
    # Track the names of all deleted files.
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   426
    for f in mresult.files((mergestatemod.ACTION_REMOVE,)):
45342
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   427
        deletedfiles.add(f)
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   428
    for (f, args, msg) in mresult.getactions((mergestatemod.ACTION_MERGE,)):
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   429
        f1, f2, fa, move, anc = args
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   430
        if move:
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   431
            deletedfiles.add(f1)
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   432
    for (f, args, msg) in mresult.getactions(
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   433
        (mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,)
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   434
    ):
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   435
        f2, flags = args
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45341
diff changeset
   436
        deletedfiles.add(f2)
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   437
35172
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   438
    # Check all directories that contain created files for path conflicts.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   439
    for p in createdfiledirs:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   440
        if p in mf:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   441
            if p in mctx:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   442
                # A file is in a directory which aliases both a local
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   443
                # and a remote file.  This is an internal inconsistency
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   444
                # within the remote manifest.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   445
                invalidconflicts.add(p)
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   446
            else:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   447
                # A file is in a directory which aliases a local file.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   448
                # We will need to rename the local file.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   449
                localconflicts.add(p)
45344
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   450
        pd = mresult.getfile(p)
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   451
        if pd and pd[0] in (
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   452
            mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   453
            mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   454
            mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   455
            mergestatemod.ACTION_CREATED_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   456
        ):
35172
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   457
            # The file is in a directory which aliases a remote file.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   458
            # This is an internal inconsistency within the remote
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   459
            # manifest.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   460
            invalidconflicts.add(p)
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 35171
diff changeset
   461
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   462
    # 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
   463
    for p in localconflicts:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   464
        if p not in deletedfiles:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   465
            ctxname = bytes(wctx).rstrip(b'+')
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   466
            pnew = util.safename(p, ctxname, wctx, set(mresult.files()))
44939
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44856
diff changeset
   467
            porig = wctx[p].copysource() or p
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   468
            mresult.addfile(
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   469
                pnew,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   470
                mergestatemod.ACTION_PATH_CONFLICT_RESOLVE,
44939
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44856
diff changeset
   471
                (p, porig),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   472
                b'local path conflict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   473
            )
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   474
            mresult.addfile(
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   475
                p,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   476
                mergestatemod.ACTION_PATH_CONFLICT,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   477
                (pnew, b'l'),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   478
                b'path conflict',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   479
            )
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   480
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   481
    if remoteconflicts:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   482
        # 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
   483
        ctxname = bytes(mctx).rstrip(b'+')
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   484
        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
   485
            if f not in deletedfiles:
45344
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   486
                m, args, msg = mresult.getfile(p)
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   487
                pnew = util.safename(p, ctxname, wctx, set(mresult.files()))
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   488
                if m in (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   489
                    mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   490
                    mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   491
                ):
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   492
                    # Action was merge, just update target.
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   493
                    mresult.addfile(pnew, m, args, msg)
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   494
                else:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   495
                    # 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
   496
                    fl = args[0]
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   497
                    mresult.addfile(
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   498
                        pnew,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   499
                        mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   500
                        (p, fl),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   501
                        b'remote path conflict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   502
                    )
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   503
                mresult.addfile(
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
   504
                    p,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   505
                    mergestatemod.ACTION_PATH_CONFLICT,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   506
                    (pnew, mergestatemod.ACTION_REMOVE),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   507
                    b'path conflict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   508
                )
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   509
                remoteconflicts.remove(p)
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   510
                break
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   511
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   512
    if invalidconflicts:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
   513
        for p in invalidconflicts:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   514
            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
   515
        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
   516
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   517
45285
e7196f1da2b1 merge: pass mergeresult obj instead of actions in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45284
diff changeset
   518
def _filternarrowactions(narrowmatch, branchmerge, mresult):
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   519
    """
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   520
    Filters out actions that can ignored because the repo is narrowed.
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   521
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   522
    Raise an exception if the merge cannot be completed because the repo is
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   523
    narrowed.
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   524
    """
45343
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45342
diff changeset
   525
    # TODO: handle with nonconflicttypes
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45342
diff changeset
   526
    nonconflicttypes = {
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45342
diff changeset
   527
        mergestatemod.ACTION_ADD,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45342
diff changeset
   528
        mergestatemod.ACTION_ADD_MODIFIED,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45342
diff changeset
   529
        mergestatemod.ACTION_CREATED,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45342
diff changeset
   530
        mergestatemod.ACTION_CREATED_MERGE,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45342
diff changeset
   531
        mergestatemod.ACTION_FORGET,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45342
diff changeset
   532
        mergestatemod.ACTION_GET,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45342
diff changeset
   533
        mergestatemod.ACTION_REMOVE,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45342
diff changeset
   534
        mergestatemod.ACTION_EXEC,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45342
diff changeset
   535
    }
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   536
    # We mutate the items in the dict during iteration, so iterate
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   537
    # over a copy.
45346
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45345
diff changeset
   538
    for f, action in mresult.filemap():
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   539
        if narrowmatch(f):
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   540
            pass
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   541
        elif not branchmerge:
45285
e7196f1da2b1 merge: pass mergeresult obj instead of actions in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45284
diff changeset
   542
            mresult.removefile(f)  # just updating, ignore changes outside clone
45466
14b3dbfa4eeb mergeresult: introduce dedicated tuple for no-op actions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45462
diff changeset
   543
        elif action[0] in mergeresult.NO_OP_ACTIONS:
45285
e7196f1da2b1 merge: pass mergeresult obj instead of actions in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45284
diff changeset
   544
            mresult.removefile(f)  # merge does not affect file
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   545
        elif action[0] in nonconflicttypes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   546
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   547
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   548
                    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
   549
                    b'which is not yet supported'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   550
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   551
                % f,
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   552
                hint=_(b'merging in the other direction may work'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   553
            )
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   554
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   555
            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
   556
                _(b'conflict in file \'%s\' is outside narrow clone') % f
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   557
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   558
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
   559
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   560
class mergeresult(object):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   561
    ''''An object representing result of merging manifests.
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   562
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   563
    It has information about what actions need to be performed on dirstate
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   564
    mapping of divergent renames and other such cases. '''
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   565
45467
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
   566
    NO_OP_ACTIONS = (
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
   567
        mergestatemod.ACTION_KEEP,
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
   568
        mergestatemod.ACTION_KEEP_ABSENT,
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
   569
    )
45466
14b3dbfa4eeb mergeresult: introduce dedicated tuple for no-op actions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45462
diff changeset
   570
45281
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45280
diff changeset
   571
    def __init__(self):
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   572
        """
45291
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45290
diff changeset
   573
        filemapping: dict of filename as keys and action related info as values
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   574
        diverge: mapping of source name -> list of dest name for
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   575
                 divergent renames
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   576
        renamedelete: mapping of source name -> list of destinations for files
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   577
                      deleted on one side and renamed on other.
45275
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   578
        commitinfo: dict containing data which should be used on commit
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   579
                    contains a filename -> info mapping
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   580
        actionmapping: dict of action names as keys and values are dict of
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   581
                       filename as key and related data as values
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   582
        """
45291
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45290
diff changeset
   583
        self._filemapping = {}
45281
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45280
diff changeset
   584
        self._diverge = {}
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45280
diff changeset
   585
        self._renamedelete = {}
45383
f970cca30989 merge: use collections.defaultdict() for mergeresult.commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45349
diff changeset
   586
        self._commitinfo = collections.defaultdict(dict)
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   587
        self._actionmapping = collections.defaultdict(dict)
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   588
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   589
    def updatevalues(self, diverge, renamedelete):
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   590
        self._diverge = diverge
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   591
        self._renamedelete = renamedelete
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   592
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   593
    def addfile(self, filename, action, data, message):
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   594
        """ adds a new file to the mergeresult object
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   595
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   596
        filename: file which we are adding
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   597
        action: one of mergestatemod.ACTION_*
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   598
        data: a tuple of information like fctx and ctx related to this merge
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   599
        message: a message about the merge
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   600
        """
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   601
        # if the file already existed, we need to delete it's old
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   602
        # entry form _actionmapping too
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   603
        if filename in self._filemapping:
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   604
            a, d, m = self._filemapping[filename]
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   605
            del self._actionmapping[a][filename]
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   606
45291
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45290
diff changeset
   607
        self._filemapping[filename] = (action, data, message)
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   608
        self._actionmapping[action][filename] = (data, message)
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   609
45344
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   610
    def getfile(self, filename, default_return=None):
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   611
        """ returns (action, args, msg) about this file
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   612
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   613
        returns default_return if the file is not present """
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   614
        if filename in self._filemapping:
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   615
            return self._filemapping[filename]
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   616
        return default_return
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
   617
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   618
    def files(self, actions=None):
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   619
        """ returns files on which provided action needs to perfromed
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   620
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   621
        If actions is None, all files are returned
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   622
        """
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   623
        # TODO: think whether we should return renamedelete and
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   624
        # diverge filenames also
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   625
        if actions is None:
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   626
            for f in self._filemapping:
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   627
                yield f
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   628
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   629
        else:
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   630
            for a in actions:
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   631
                for f in self._actionmapping[a]:
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   632
                    yield f
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
   633
45283
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45282
diff changeset
   634
    def removefile(self, filename):
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45282
diff changeset
   635
        """ removes a file from the mergeresult object as the file might
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45282
diff changeset
   636
        not merging anymore """
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   637
        action, data, message = self._filemapping[filename]
45291
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45290
diff changeset
   638
        del self._filemapping[filename]
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   639
        del self._actionmapping[action][filename]
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   640
45336
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   641
    def getactions(self, actions, sort=False):
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   642
        """ get list of files which are marked with these actions
45336
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   643
        if sort is true, files for each action is sorted and then added
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   644
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   645
        Returns a list of tuple of form (filename, data, message)
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   646
        """
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   647
        for a in actions:
45336
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   648
            if sort:
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   649
                for f in sorted(self._actionmapping[a]):
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   650
                    args, msg = self._actionmapping[a][f]
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
   651
                    yield f, args, msg
45336
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   652
            else:
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   653
                for f, (args, msg) in pycompat.iteritems(
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   654
                    self._actionmapping[a]
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45335
diff changeset
   655
                ):
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
   656
                    yield f, args, msg
45283
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45282
diff changeset
   657
45338
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   658
    def len(self, actions=None):
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   659
        """ returns number of files which needs actions
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   660
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   661
        if actions is passed, total of number of files in that action
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   662
        only is returned """
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   663
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   664
        if actions is None:
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   665
            return len(self._filemapping)
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   666
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   667
        return sum(len(self._actionmapping[a]) for a in actions)
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
   668
45346
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45345
diff changeset
   669
    def filemap(self, sort=False):
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45345
diff changeset
   670
        if sorted:
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45345
diff changeset
   671
            for key, val in sorted(pycompat.iteritems(self._filemapping)):
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45345
diff changeset
   672
                yield key, val
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45345
diff changeset
   673
        else:
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45345
diff changeset
   674
            for key, val in pycompat.iteritems(self._filemapping):
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45345
diff changeset
   675
                yield key, val
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   676
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   677
    def addcommitinfo(self, filename, key, value):
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   678
        """ adds key-value information about filename which will be required
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   679
        while committing this merge """
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   680
        self._commitinfo[filename][key] = value
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   681
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   682
    @property
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   683
    def diverge(self):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   684
        return self._diverge
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   685
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   686
    @property
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   687
    def renamedelete(self):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   688
        return self._renamedelete
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   689
45275
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   690
    @property
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   691
    def commitinfo(self):
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   692
        return self._commitinfo
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   693
45279
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45278
diff changeset
   694
    @property
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45278
diff changeset
   695
    def actionsdict(self):
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45278
diff changeset
   696
        """ returns a dictionary of actions to be perfomed with action as key
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45278
diff changeset
   697
        and a list of files and related arguments as values """
45348
490607efc992 merge: remove emptyactions() and use collections.defaultdict(list) instead
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45347
diff changeset
   698
        res = collections.defaultdict(list)
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   699
        for a, d in pycompat.iteritems(self._actionmapping):
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   700
            for f, (args, msg) in pycompat.iteritems(d):
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   701
                res[a].append((f, args, msg))
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   702
        return res
45279
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45278
diff changeset
   703
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   704
    def setactions(self, actions):
45291
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45290
diff changeset
   705
        self._filemapping = actions
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   706
        self._actionmapping = collections.defaultdict(dict)
45292
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45291
diff changeset
   707
        for f, (act, data, msg) in pycompat.iteritems(self._filemapping):
45299
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
   708
            self._actionmapping[act][f] = data, msg
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   709
45278
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   710
    def hasconflicts(self):
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   711
        """ tells whether this merge resulted in some actions which can
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   712
        result in conflicts or not """
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   713
        for a in self._actionmapping.keys():
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   714
            if (
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   715
                a
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   716
                not in (
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   717
                    mergestatemod.ACTION_GET,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   718
                    mergestatemod.ACTION_EXEC,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   719
                    mergestatemod.ACTION_REMOVE,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   720
                    mergestatemod.ACTION_PATH_CONFLICT_RESOLVE,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   721
                )
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
   722
                and self._actionmapping[a]
45466
14b3dbfa4eeb mergeresult: introduce dedicated tuple for no-op actions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45462
diff changeset
   723
                and a not in self.NO_OP_ACTIONS
45278
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   724
            ):
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   725
                return True
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   726
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   727
        return False
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
   728
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   729
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   730
def manifestmerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   731
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   732
    wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   733
    p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   734
    pa,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   735
    branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   736
    force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   737
    matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   738
    acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   739
    followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   740
    forcefulldiff=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   741
):
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   742
    """
30096
98d3d8108db0 merge: update doc of manifestmerge() per 18c2184c27dc
Yuya Nishihara <yuya@tcha.org>
parents: 30060
diff changeset
   743
    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
   744
18605
bcf29565d89f manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents: 18544
diff changeset
   745
    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
   746
    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
   747
    acceptremote = accept the incoming changes without prompting
45168
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
   748
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
   749
    Returns an object of mergeresult class
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   750
    """
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   751
    mresult = mergeresult()
27346
ba0da4b7397d merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents: 27345
diff changeset
   752
    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
   753
        matcher = None
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   754
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   755
    # manifests fetched in order are going to be faster, so prime the caches
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   756
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   757
        x.manifest()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   758
        for x in sorted(wctx.parents() + [p2, pa], key=scmutil.intrev)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   759
    ]
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   760
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   761
    branch_copies1 = copies.branch_copies()
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   762
    branch_copies2 = copies.branch_copies()
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   763
    diverge = {}
45275
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   764
    # information from merge which is needed at commit time
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   765
    # for example choosing filelog of which parent to commit
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   766
    # TODO: use specific constants in future for this mapping
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   767
    if followcopies:
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   768
        branch_copies1, branch_copies2, diverge = copies.mergecopies(
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   769
            repo, wctx, p2, pa
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   770
        )
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
   771
32641
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32612
diff changeset
   772
    boolbm = pycompat.bytestr(bool(branchmerge))
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32612
diff changeset
   773
    boolf = pycompat.bytestr(bool(force))
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32612
diff changeset
   774
    boolm = pycompat.bytestr(bool(matcher))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   775
    repo.ui.note(_(b"resolving manifests\n"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   776
    repo.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   777
        b" branchmerge: %s, force: %s, partial: %s\n" % (boolbm, boolf, boolm)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   778
    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   779
    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
   780
18611
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
   781
    m1, m2, ma = wctx.manifest(), p2.manifest(), pa.manifest()
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   782
    copied1 = set(branch_copies1.copy.values())
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   783
    copied1.update(branch_copies1.movewithdir.values())
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   784
    copied2 = set(branch_copies2.copy.values())
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   785
    copied2.update(branch_copies2.movewithdir.values())
3295
72d1e521da77 merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents: 3292
diff changeset
   786
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   787
    if b'.hgsubstate' in m1 and wctx.rev() is None:
38425
1322ae04d3d7 merge: do not fill manifest of committed revision with pseudo node (issue5526)
Yuya Nishihara <yuya@tcha.org>
parents: 37762
diff changeset
   788
        # 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
   789
        # 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
   790
        # 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
   791
        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
   792
            m1[b'.hgsubstate'] = modifiednodeid
9783
ee00ef6f9be7 submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
   793
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   794
    # Don't use m2-vs-ma optimization if:
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   795
    # - ma is the same as m1 or m2, which we're just going to diff again later
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   796
    # - The caller specifically asks for a full diff, which is useful during bid
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   797
    #   merge.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   798
    if pa not in ([wctx, p2] + wctx.parents()) and not forcefulldiff:
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   799
        # Identify which files are relevant to the merge, so we can limit the
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   800
        # total m1-vs-m2 diff to just those files. This has significant
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   801
        # performance benefits in large repositories.
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   802
        relevantfiles = set(ma.diff(m2).keys())
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   803
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   804
        # For copied and moved files, we need to add the source file too.
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   805
        for copykey, copyvalue in pycompat.iteritems(branch_copies1.copy):
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   806
            if copyvalue in relevantfiles:
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   807
                relevantfiles.add(copykey)
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   808
        for movedirkey in branch_copies1.movewithdir:
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   809
            relevantfiles.add(movedirkey)
32498
bd56bea5ecf8 merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32351
diff changeset
   810
        filesmatcher = scmutil.matchfiles(repo, relevantfiles)
bd56bea5ecf8 merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32351
diff changeset
   811
        matcher = matchmod.intersectmatchers(matcher, filesmatcher)
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   812
31257
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31175
diff changeset
   813
    diff = m1.diff(m2, match=matcher)
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31175
diff changeset
   814
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
   815
    for f, ((n1, fl1), (n2, fl2)) in pycompat.iteritems(diff):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   816
        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
   817
            if f not in ma:
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   818
                # TODO: what if they're renamed from different sources?
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   819
                fa = branch_copies1.copy.get(
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   820
                    f, None
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   821
                ) or branch_copies2.copy.get(f, None)
45296
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   822
                args, msg = None, None
23397
c7c95838be9a merge: break out "both renamed a -> b" case
Martin von Zweigbergk <martinvonz@google.com>
parents: 23396
diff changeset
   823
                if fa is not None:
45296
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   824
                    args = (f, f, fa, False, pa.node())
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   825
                    msg = b'both renamed from %s' % fa
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
   826
                else:
45296
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   827
                    args = (f, f, None, False, pa.node())
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   828
                    msg = b'both created'
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   829
                mresult.addfile(f, mergestatemod.ACTION_MERGE, args, msg)
16094
0776a6cababe merge: don't use unknown()
Matt Mackall <mpm@selenic.com>
parents: 16093
diff changeset
   830
            else:
23396
6a254a2dd37c merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23395
diff changeset
   831
                a = ma[f]
6a254a2dd37c merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23395
diff changeset
   832
                fla = ma.flags(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   833
                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
   834
                if n2 == a and fl2 == fla:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   835
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   836
                        f, mergestatemod.ACTION_KEEP, (), b'remote unchanged',
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   837
                    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   838
                elif n1 == a and fl1 == fla:  # local unchanged - use remote
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   839
                    if n1 == n2:  # optimization: keep local content
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   840
                        mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   841
                            f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   842
                            mergestatemod.ACTION_EXEC,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   843
                            (fl2,),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   844
                            b'update permissions',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   845
                        )
23395
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
   846
                    else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   847
                        mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   848
                            f,
45277
c515c54f6530 merge: remove no longer required ACTION_GET_OTHER_AND_STORE
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45276
diff changeset
   849
                            mergestatemod.ACTION_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   850
                            (fl2, False),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   851
                            b'remote is newer',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   852
                        )
45275
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   853
                        if branchmerge:
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   854
                            mresult.addcommitinfo(
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   855
                                f, b'filenode-source', b'other'
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   856
                            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   857
                elif nol and n2 == a:  # remote only changed 'x'
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   858
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   859
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   860
                        mergestatemod.ACTION_EXEC,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   861
                        (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   862
                        b'update permissions',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   863
                    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   864
                elif nol and n1 == a:  # local only changed 'x'
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   865
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   866
                        f,
45277
c515c54f6530 merge: remove no longer required ACTION_GET_OTHER_AND_STORE
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45276
diff changeset
   867
                        mergestatemod.ACTION_GET,
44687
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
   868
                        (fl1, False),
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
   869
                        b'remote is newer',
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
   870
                    )
45275
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45274
diff changeset
   871
                    if branchmerge:
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
   872
                        mresult.addcommitinfo(f, b'filenode-source', b'other')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   873
                else:  # both changed something
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   874
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   875
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   876
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   877
                        (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
   878
                        b'versions differ',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   879
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   880
        elif n1:  # file exists only on local side
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   881
            if f in copied2:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   882
                pass  # we'll deal with it on m2 side
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   883
            elif (
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   884
                f in branch_copies1.movewithdir
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   885
            ):  # directory rename, move local
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   886
                f2 = branch_copies1.movewithdir[f]
31515
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31475
diff changeset
   887
                if f2 in m2:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   888
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   889
                        f2,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   890
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   891
                        (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
   892
                        b'remote directory rename, both created',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   893
                    )
23475
67f1d68861fb merge: don't ignore conflicting file in remote renamed directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 23474
diff changeset
   894
                else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   895
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   896
                        f2,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   897
                        mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   898
                        (f, fl1),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   899
                        b'remote directory rename - move from %s' % f,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   900
                    )
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   901
            elif f in branch_copies1.copy:
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   902
                f2 = branch_copies1.copy[f]
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   903
                mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   904
                    f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   905
                    mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   906
                    (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
   907
                    b'local copied/moved from %s' % f2,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   908
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   909
            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
   910
                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
   911
                    if acceptremote:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   912
                        mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   913
                            f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   914
                            mergestatemod.ACTION_REMOVE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   915
                            None,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   916
                            b'remote delete',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   917
                        )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   918
                    else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   919
                        mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   920
                            f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   921
                            mergestatemod.ACTION_CHANGED_DELETED,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   922
                            (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
   923
                            b'prompt changed/deleted',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   924
                        )
30361
1070df141718 dirstate: change added/modified placeholder hash length to 20 bytes
Durham Goode <durham@fb.com>
parents: 30332
diff changeset
   925
                elif n1 == addednodeid:
45118
d0ef8c1dddd4 manifest: tigher manifest parsing and flag use
Joerg Sonnenberger <joerg@bec.de>
parents: 45072
diff changeset
   926
                    # This file was locally added. We should forget it instead of
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   927
                    # deleting it.
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   928
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   929
                        f, mergestatemod.ACTION_FORGET, None, b'remote deleted',
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   930
                    )
20639
1df033640a8e merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents: 20620
diff changeset
   931
                else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   932
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   933
                        f, mergestatemod.ACTION_REMOVE, None, b'other deleted',
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   934
                    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   935
        elif n2:  # file exists only on remote side
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   936
            if f in copied1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   937
                pass  # we'll deal with it on m1 side
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   938
            elif f in branch_copies2.movewithdir:
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   939
                f2 = branch_copies2.movewithdir[f]
31515
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31475
diff changeset
   940
                if f2 in m1:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   941
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   942
                        f2,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   943
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   944
                        (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
   945
                        b'local directory rename, both created',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   946
                    )
23476
39a12719ec65 merge: don't overwrite conflicting file in locally renamed directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 23475
diff changeset
   947
                else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   948
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   949
                        f2,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   950
                        mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   951
                        (f, fl2),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   952
                        b'local directory rename - get from %s' % f,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   953
                    )
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   954
            elif f in branch_copies2.copy:
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   955
                f2 = branch_copies2.copy[f]
45296
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   956
                msg, args = None, None
31515
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31475
diff changeset
   957
                if f2 in m2:
45296
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   958
                    args = (f2, f, f2, False, pa.node())
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   959
                    msg = b'remote copied from %s' % f2
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   960
                else:
45296
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   961
                    args = (f2, f, f2, True, pa.node())
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   962
                    msg = b'remote moved from %s' % f2
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45293
diff changeset
   963
                mresult.addfile(f, mergestatemod.ACTION_MERGE, args, msg)
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   964
            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
   965
                # 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
   966
                # 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
   967
                #
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   968
                # 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
   969
                #   n         *           *      |   create
23650
b85c548ab14d merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents: 23649
diff changeset
   970
                #   y         n           *      |   create
b85c548ab14d merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents: 23649
diff changeset
   971
                #   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
   972
                #   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
   973
                #
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   974
                # 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
   975
                # 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
   976
                if not force:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   977
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   978
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   979
                        mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   980
                        (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   981
                        b'remote created',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   982
                    )
23649
18ab5e5955df merge: structure 'remote created' code to match table
Martin von Zweigbergk <martinvonz@google.com>
parents: 23641
diff changeset
   983
                elif not branchmerge:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   984
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   985
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   986
                        mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   987
                        (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   988
                        b'remote created',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   989
                    )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   990
                else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   991
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
   992
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
   993
                        mergestatemod.ACTION_CREATED_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   994
                        (fl2, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   995
                        b'remote created, get or merge',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
   996
                    )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   997
            elif n2 != ma[f]:
30581
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
   998
                df = None
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
   999
                for d in branch_copies1.dirmove:
30581
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
  1000
                    if f.startswith(d):
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
  1001
                        # new file added in a directory that was moved
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
  1002
                        df = branch_copies1.dirmove[d] + f[len(d) :]
30581
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
  1003
                        break
31515
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31475
diff changeset
  1004
                if df is not None and df in m1:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1005
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1006
                        df,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1007
                        mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1008
                        (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
  1009
                        b'local directory rename - respect move '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1010
                        b'from %s' % f,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1011
                    )
30581
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
  1012
                elif acceptremote:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1013
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1014
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1015
                        mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1016
                        (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1017
                        b'remote recreating',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1018
                    )
18606
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
  1019
                else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1020
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1021
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1022
                        mergestatemod.ACTION_DELETED_CHANGED,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1023
                        (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
  1024
                        b'prompt deleted/changed',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1025
                    )
23651
72da02d7f126 merge: collect checking for unknown files at end of manifestmerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23650
diff changeset
  1026
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1027
    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
  1028
        # If we are merging, look for path conflicts.
45284
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45283
diff changeset
  1029
        checkpathconflicts(repo, wctx, p2, mresult)
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
  1030
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
  1031
    narrowmatch = repo.narrowmatch()
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
  1032
    if not narrowmatch.always():
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
  1033
        # Updates "actions" in place
45285
e7196f1da2b1 merge: pass mergeresult obj instead of actions in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45284
diff changeset
  1034
        _filternarrowactions(narrowmatch, branchmerge, mresult)
38044
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 37959
diff changeset
  1035
44200
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
  1036
    renamedelete = branch_copies1.renamedelete
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
  1037
    renamedelete.update(branch_copies2.renamedelete)
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44199
diff changeset
  1038
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
  1039
    mresult.updatevalues(diverge, renamedelete)
45281
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45280
diff changeset
  1040
    return mresult
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
  1041
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1042
45286
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45285
diff changeset
  1043
def _resolvetrivial(repo, wctx, mctx, ancestor, mresult):
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
  1044
    """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
  1045
       remained the same."""
36316
759579bac31d merge: make a copy of dict.items() before mutating the dict during iteration
Augie Fackler <augie@google.com>
parents: 36177
diff changeset
  1046
    # We force a copy of actions.items() because we're going to mutate
759579bac31d merge: make a copy of dict.items() before mutating the dict during iteration
Augie Fackler <augie@google.com>
parents: 36177
diff changeset
  1047
    # actions as we resolve trivial conflicts.
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
  1048
    for f in list(mresult.files((mergestatemod.ACTION_CHANGED_DELETED,))):
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
  1049
        if f in ancestor and not wctx[f].cmp(ancestor[f]):
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
  1050
            # local did change but ended up with same content
45286
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45285
diff changeset
  1051
            mresult.addfile(
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45285
diff changeset
  1052
                f, mergestatemod.ACTION_REMOVE, None, b'prompt same'
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45285
diff changeset
  1053
            )
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
  1054
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
  1055
    for f in list(mresult.files((mergestatemod.ACTION_DELETED_CHANGED,))):
45293
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45292
diff changeset
  1056
        if f in ancestor and not mctx[f].cmp(ancestor[f]):
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
  1057
            # remote did change but ended up with same content
45286
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45285
diff changeset
  1058
            mresult.removefile(f)  # don't get = keep local deleted
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1059
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
  1060
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1061
def calculateupdates(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1062
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1063
    wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1064
    mctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1065
    ancestors,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1066
    branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1067
    force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1068
    acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1069
    followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1070
    matcher=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1071
    mergeforce=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1072
):
45168
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1073
    """
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1074
    Calculate the actions needed to merge mctx into wctx using ancestors
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1075
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1076
    Uses manifestmerge() to merge manifest and get list of actions required to
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1077
    perform for merging two manifests. If there are multiple ancestors, uses bid
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1078
    merge if enabled.
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1079
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1080
    Also filters out actions which are unrequired if repository is sparse.
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1081
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1082
    Returns mergeresult object same as manifestmerge().
45168
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
  1083
    """
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1084
    # Avoid cycle.
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1085
    from . import sparse
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1086
45281
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45280
diff changeset
  1087
    mresult = None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1088
    if len(ancestors) == 1:  # default
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1089
        mresult = manifestmerge(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1090
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1091
            wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1092
            mctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1093
            ancestors[0],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1094
            branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1095
            force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1096
            matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1097
            acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1098
            followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1099
        )
45287
4ad6c4e9e35f merge: pass mergeresult instead of actions in _checkunknownfiles() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45286
diff changeset
  1100
        _checkunknownfiles(repo, wctx, mctx, force, mresult, mergeforce)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1101
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1102
    else:  # only when merge.preferancestor=* - the default
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1103
        repo.ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1104
            _(b"note: merging %s and %s using bids from ancestors %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1105
            % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1106
                wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1107
                mctx,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1108
                _(b' and ').join(pycompat.bytestr(anc) for anc in ancestors),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1109
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1110
        )
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1111
45280
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1112
        # mapping filename to bids (action method to list af actions)
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1113
        # {FILENAME1 : BID1, FILENAME2 : BID2}
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1114
        # BID is another dictionary which contains
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1115
        # mapping of following form:
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1116
        # {ACTION_X : [info, ..], ACTION_Y : [info, ..]}
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1117
        fbids = {}
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
  1118
        diverge, renamedelete = None, None
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1119
        for ancestor in ancestors:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1120
            repo.ui.note(_(b'\ncalculating bids for ancestor %s\n') % ancestor)
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1121
            mresult1 = manifestmerge(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1122
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1123
                wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1124
                mctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1125
                ancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1126
                branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1127
                force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1128
                matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1129
                acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1130
                followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1131
                forcefulldiff=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1132
            )
45287
4ad6c4e9e35f merge: pass mergeresult instead of actions in _checkunknownfiles() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45286
diff changeset
  1133
            _checkunknownfiles(repo, wctx, mctx, force, mresult1, mergeforce)
26318
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
  1134
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
  1135
            # 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
  1136
            # merge will correctly incorporate more information
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1137
            if diverge is None or len(mresult1.diverge) < len(diverge):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1138
                diverge = mresult1.diverge
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1139
            if renamedelete is None or len(renamedelete) < len(
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1140
                mresult1.renamedelete
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1141
            ):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1142
                renamedelete = mresult1.renamedelete
26318
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
  1143
45346
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45345
diff changeset
  1144
            for f, a in mresult1.filemap(sort=True):
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1145
                m, args, msg = a
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1146
                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
  1147
                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
  1148
                    d = fbids[f]
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1149
                    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
  1150
                        d[m].append(a)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1151
                    else:
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1152
                        d[m] = [a]
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1153
                else:
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1154
                    fbids[f] = {m: [a]}
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1155
45280
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45279
diff changeset
  1156
        # Call for bids
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1157
        # Pick the best bid for each file
45447
e7c8a5030a90 merge: show number of ancestors in bid merge debug notes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
  1158
        repo.ui.note(
e7c8a5030a90 merge: show number of ancestors in bid merge debug notes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
  1159
            _(b'\nauction for merging merge bids (%d ancestors)\n')
e7c8a5030a90 merge: show number of ancestors in bid merge debug notes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
  1160
            % len(ancestors)
e7c8a5030a90 merge: show number of ancestors in bid merge debug notes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
  1161
        )
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1162
        mresult = mergeresult()
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1163
        for f, bids in sorted(fbids.items()):
45459
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45447
diff changeset
  1164
            if repo.ui.debugflag:
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45447
diff changeset
  1165
                repo.ui.debug(b" list of bids for %s:\n" % f)
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45447
diff changeset
  1166
                for m, l in sorted(bids.items()):
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45447
diff changeset
  1167
                    for _f, args, msg in l:
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45447
diff changeset
  1168
                        repo.ui.debug(b'   %s -> %s\n' % (msg, m))
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1169
            # 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
  1170
            # Consensus?
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1171
            if len(bids) == 1:  # all bids are the same kind of method
34348
1a5abc45e2fa py3: explicitly convert dict.keys() and dict.items() into a list
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34302
diff changeset
  1172
                m, l = list(bids.items())[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1173
                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
  1174
                    repo.ui.note(_(b" %s: consensus for %s\n") % (f, m))
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1175
                    mresult.addfile(f, *l[0])
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1176
                    continue
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1177
            # If keep is an option, just do it.
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1178
            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
  1179
                repo.ui.note(_(b" %s: picking 'keep' action\n") % f)
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1180
                mresult.addfile(f, *bids[mergestatemod.ACTION_KEEP][0])
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1181
                continue
45467
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1182
            # If keep absent is an option, just do that
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1183
            if mergestatemod.ACTION_KEEP_ABSENT in bids:
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1184
                repo.ui.note(_(b" %s: picking 'keep absent' action\n") % f)
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1185
                mresult.addfile(f, *bids[mergestatemod.ACTION_KEEP_ABSENT][0])
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1186
                continue
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1187
            # If there are gets and they all agree [how could they not?], do it.
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1188
            if mergestatemod.ACTION_GET in bids:
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1189
                ga0 = bids[mergestatemod.ACTION_GET][0]
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1190
                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
  1191
                    repo.ui.note(_(b" %s: picking 'get' action\n") % f)
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1192
                    mresult.addfile(f, *ga0)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1193
                    continue
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1194
            # 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
  1195
            # Handle inefficient democrazy.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1196
            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
  1197
            for m, l in sorted(bids.items()):
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1198
                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
  1199
                    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
  1200
            # Pick random action. TODO: Instead, prompt user when resolving
34348
1a5abc45e2fa py3: explicitly convert dict.keys() and dict.items() into a list
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34302
diff changeset
  1201
            m, l = list(bids.items())[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1202
            repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1203
                _(b' %s: ambiguous merge - picked %s action\n') % (f, m)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1204
            )
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1205
            mresult.addfile(f, *l[0])
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1206
            continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1207
        repo.ui.note(_(b'end of auction\n\n'))
45384
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45383
diff changeset
  1208
        mresult.updatevalues(diverge, renamedelete)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1209
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
  1210
    if wctx.rev() is None:
45347
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45346
diff changeset
  1211
        _forgetremoved(wctx, mctx, branchmerge, mresult)
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
  1212
45290
d70c972cec74 sparse: pass mergeresult obj in sparse.filterupdatesactions() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45289
diff changeset
  1213
    sparse.filterupdatesactions(repo, wctx, mctx, branchmerge, mresult)
45286
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45285
diff changeset
  1214
    _resolvetrivial(repo, wctx, mctx, ancestors[0], mresult)
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1215
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1216
    return mresult
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1217
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1218
34142
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1219
def _getcwd():
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1220
    try:
39818
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39464
diff changeset
  1221
        return encoding.getcwd()
34142
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1222
    except OSError as err:
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1223
        if err.errno == errno.ENOENT:
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1224
            return None
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1225
        raise
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1226
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1227
33081
6582dc01aca3 merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com>
parents: 32863
diff changeset
  1228
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
  1229
    """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
  1230
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1231
    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
  1232
    """
18640
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
  1233
    verbose = repo.ui.verbose
34142
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1234
    cwd = _getcwd()
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
  1235
    i = 0
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
  1236
    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
  1237
        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
  1238
        if verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1239
            repo.ui.note(_(b"removing %s\n") % f)
33086
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  1240
        wctx[f].audit()
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1241
        try:
33082
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33081
diff changeset
  1242
            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
  1243
        except OSError as inst:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1244
            repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1245
                _(b"update failed to remove %s: %s!\n") % (f, inst.strerror)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1246
            )
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1247
        if i == 100:
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1248
            yield i, f
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1249
            i = 0
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1250
        i += 1
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1251
    if i > 0:
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1252
        yield i, f
34142
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1253
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1254
    if cwd and not _getcwd():
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1255
        # cwd was removed in the course of removing files; print a helpful
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1256
        # warning.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1257
        repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1258
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1259
                b"current directory was removed\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1260
                b"(consider changing to repo root: %s)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1261
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1262
            % repo.root
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1263
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1264
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1265
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1266
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
  1267
    """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
  1268
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1269
    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
  1270
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1271
    Yields arbitrarily many (False, tuple) for progress updates, followed by
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1272
    exactly one (True, filedata). When wantfiledata is false, filedata is an
42522
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42456
diff changeset
  1273
    empty dict. When wantfiledata is true, filedata[f] is a triple (mode, size,
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42456
diff changeset
  1274
    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
  1275
    """
42522
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42456
diff changeset
  1276
    filedata = {}
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1277
    verbose = repo.ui.verbose
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1278
    fctx = mctx.filectx
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
  1279
    ui = repo.ui
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1280
    i = 0
28200
588695ccbb22 merge: perform background file closing in batchget
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28199
diff changeset
  1281
    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
  1282
        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
  1283
            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
  1284
            if verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1285
                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
  1286
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1287
            if backup:
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1288
                # 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
  1289
                # 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
  1290
                # with a directory this file is in, and if so, back that up.
41570
1f2714052d7e merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents: 41569
diff changeset
  1291
                conflicting = f
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1292
                if not repo.wvfs.lexists(f):
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
  1293
                    for p in pathutil.finddirs(f):
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1294
                        if repo.wvfs.isfileorlink(p):
41570
1f2714052d7e merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents: 41569
diff changeset
  1295
                            conflicting = p
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
  1296
                            break
41570
1f2714052d7e merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents: 41569
diff changeset
  1297
                if repo.wvfs.lexists(conflicting):
41601
ac8cf125d8d5 merge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41570
diff changeset
  1298
                    orig = scmutil.backuppath(ui, repo, conflicting)
ac8cf125d8d5 merge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41570
diff changeset
  1299
                    util.rename(repo.wjoin(conflicting), orig)
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1300
            wfctx = wctx[f]
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1301
            wfctx.clearunknown()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1302
            atomictemp = ui.configbool(b"experimental", b"update.atomic-file")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1303
            size = wfctx.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1304
                fctx(f).data(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1305
                flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1306
                backgroundclose=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1307
                atomictemp=atomictemp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1308
            )
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1309
            if wantfiledata:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1310
                s = wfctx.lstat()
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1311
                mode = s.st_mode
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1312
                mtime = s[stat.ST_MTIME]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1313
                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
  1314
            if i == 100:
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1315
                yield False, (i, f)
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1316
                i = 0
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1317
            i += 1
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
  1318
    if i > 0:
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1319
        yield False, (i, f)
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1320
    yield True, filedata
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1321
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1322
45335
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45334
diff changeset
  1323
def _prefetchfiles(repo, ctx, mresult):
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37172
diff changeset
  1324
    """Invoke ``scmutil.prefetchfiles()`` for the files relevant to the dict
36142
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36042
diff changeset
  1325
    of merge actions.  ``ctx`` is the context being merged in."""
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36042
diff changeset
  1326
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36042
diff changeset
  1327
    # Skipping 'a', 'am', 'f', 'r', 'dm', 'e', 'k', 'p' and 'pr', because they
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36042
diff changeset
  1328
    # don't touch the context to be merged in.  'cd' is skipped, because
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36042
diff changeset
  1329
    # changed/deleted never resolves to something from the remote side.
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
  1330
    files = mresult.files(
45335
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45334
diff changeset
  1331
        [
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1332
            mergestatemod.ACTION_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1333
            mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1334
            mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1335
            mergestatemod.ACTION_MERGE,
45335
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45334
diff changeset
  1336
        ]
45345
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45344
diff changeset
  1337
    )
45335
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45334
diff changeset
  1338
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37172
diff changeset
  1339
    prefetch = scmutil.prefetchfiles
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37172
diff changeset
  1340
    matchfiles = scmutil.matchfiles
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1341
    prefetch(
45335
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45334
diff changeset
  1342
        repo, [(ctx.rev(), matchfiles(repo, files),)],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1343
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1344
34124
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1345
37107
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1346
@attr.s(frozen=True)
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1347
class updateresult(object):
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1348
    updatedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1349
    mergedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1350
    removedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1351
    unresolvedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1352
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37112
diff changeset
  1353
    def isempty(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1354
        return not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1355
            self.updatedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1356
            or self.mergedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1357
            or self.removedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1358
            or self.unresolvedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1359
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1360
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37112
diff changeset
  1361
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1362
def applyupdates(
45349
442823f66889 merge: drop commitinfo argument to applyupdates (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45348
diff changeset
  1363
    repo, mresult, wctx, mctx, overwrite, wantfiledata, labels=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1364
):
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1365
    """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
  1366
45334
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45333
diff changeset
  1367
    mresult is a mergeresult object representing result of the merge
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1368
    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
  1369
    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
  1370
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1371
    Return a tuple of (counts, filedata), where counts is a tuple
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1372
    (updated, merged, removed, unresolved) that describes how many
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1373
    files were affected by the update, and filedata is as described in
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1374
    batchget.
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1375
    """
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1376
45335
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45334
diff changeset
  1377
    _prefetchfiles(repo, mctx, mresult)
36142
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36042
diff changeset
  1378
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1379
    updated, merged, removed = 0, 0, 0
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1380
    ms = mergestatemod.mergestate.clean(
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1381
        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: 44687
diff changeset
  1382
    )
44687
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  1383
45349
442823f66889 merge: drop commitinfo argument to applyupdates (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45348
diff changeset
  1384
    for f, op in pycompat.iteritems(mresult.commitinfo):
45276
cb6a72dc0511 merge: pass commitinfo to applyupdates() and get it stored in mergestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45275
diff changeset
  1385
        # the other side of filenode was choosen while merging, store this in
cb6a72dc0511 merge: pass commitinfo to applyupdates() and get it stored in mergestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45275
diff changeset
  1386
        # mergestate so that it can be reused on commit
45385
05d19ca33b33 mergestate: replace `addmergedother()` with generic `addcommitinfo()` (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45384
diff changeset
  1387
        ms.addcommitinfo(f, op)
45276
cb6a72dc0511 merge: pass commitinfo to applyupdates() and get it stored in mergestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45275
diff changeset
  1388
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1389
    moves = []
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1390
27137
25e4b2f000c5 merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents: 27132
diff changeset
  1391
    # 'cd' and 'dc' actions are treated like other merge conflicts
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1392
    mergeactions = list(
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1393
        mresult.getactions(
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1394
            [
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1395
                mergestatemod.ACTION_CHANGED_DELETED,
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1396
                mergestatemod.ACTION_DELETED_CHANGED,
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1397
                mergestatemod.ACTION_MERGE,
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1398
            ],
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1399
            sort=True,
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1400
        )
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1401
    )
27137
25e4b2f000c5 merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents: 27132
diff changeset
  1402
    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
  1403
        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
  1404
        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
  1405
            continue
27091
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1406
        if f1 is None:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1407
            fcl = filemerge.absentfilectx(wctx, fa)
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1408
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1409
            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
  1410
            fcl = wctx[f1]
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1411
        if f2 is None:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1412
            fco = filemerge.absentfilectx(mctx, fa)
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1413
        else:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1414
            fco = mctx[f2]
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1415
        actx = repo[anc]
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1416
        if fa in actx:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1417
            fca = actx[fa]
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1418
        else:
27091
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1419
            # TODO: move to absentfilectx
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1420
            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
  1421
        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
  1422
        if f1 != f and move:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1423
            moves.append(f1)
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1424
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1425
    # remove renamed files after safely stored
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1426
    for f in moves:
33283
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33146
diff changeset
  1427
        if wctx[f].lexists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1428
            repo.ui.debug(b"removing %s\n" % f)
33086
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  1429
            wctx[f].audit()
33082
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33081
diff changeset
  1430
            wctx[f].remove()
5042
f191bc3916f7 merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents: 4997
diff changeset
  1431
45466
14b3dbfa4eeb mergeresult: introduce dedicated tuple for no-op actions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45462
diff changeset
  1432
    numupdates = mresult.len() - mresult.len(mergeresult.NO_OP_ACTIONS)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1433
    progress = repo.ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1434
        _(b'updating'), unit=_(b'files'), total=numupdates
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1435
    )
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1436
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1437
    if b'.hgsubstate' in mresult._actionmapping[mergestatemod.ACTION_REMOVE]:
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  1438
        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
  1439
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1440
    # record path conflicts
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1441
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1442
        [mergestatemod.ACTION_PATH_CONFLICT], sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1443
    ):
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1444
        f1, fo = args
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1445
        s = repo.ui.status
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1446
        s(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1447
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1448
                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
  1449
                b"directory\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1450
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1451
            % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1452
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1453
        if fo == b'l':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1454
            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
  1455
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1456
            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
  1457
        s(_(b"resolve manually then use 'hg resolve --mark %s'\n") % f)
45159
e05a488cbed0 mergestate: rename addpath() -> addpathonflict() to prevent confusion
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45118
diff changeset
  1458
        ms.addpathconflict(f, f1, fo)
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1459
        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
  1460
34786
9c899660700a merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents: 34680
diff changeset
  1461
    # 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
  1462
    # 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
  1463
    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
  1464
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1465
    # remove in parallel (must come before resolving path conflicts and getting)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1466
    prog = worker.worker(
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1467
        repo.ui,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1468
        cost,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1469
        batchremove,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1470
        (repo, wctx),
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1471
        list(mresult.getactions([mergestatemod.ACTION_REMOVE], sort=True)),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1472
    )
19095
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
  1473
    for i, item in prog:
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1474
        progress.increment(step=i, item=item)
45338
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
  1475
    removed = mresult.len((mergestatemod.ACTION_REMOVE,))
21390
26b84128c54d merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents: 21389
diff changeset
  1476
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1477
    # resolve path conflicts (must come before getting)
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1478
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1479
        [mergestatemod.ACTION_PATH_CONFLICT_RESOLVE], sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1480
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1481
        repo.ui.debug(b" %s: %s -> pr\n" % (f, msg))
44939
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44856
diff changeset
  1482
        (f0, origf0) = args
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1483
        if wctx[f0].lexists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1484
            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
  1485
            wctx[f].audit()
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1486
            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
  1487
            wctx[f0].remove()
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1488
        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
  1489
38732
be4984261611 merge: mark file gets as not thread safe (issue5933)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38494
diff changeset
  1490
    # get in parallel.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1491
    threadsafe = repo.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1492
        b'experimental', b'worker.wdir-get-thread-safe'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1493
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1494
    prog = worker.worker(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1495
        repo.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1496
        cost,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1497
        batchget,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1498
        (repo, mctx, wctx, wantfiledata),
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1499
        list(mresult.getactions([mergestatemod.ACTION_GET], sort=True)),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1500
        threadsafe=threadsafe,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1501
        hasretval=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1502
    )
42522
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42456
diff changeset
  1503
    getfiledata = {}
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1504
    for final, res in prog:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1505
        if final:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1506
            getfiledata = res
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1507
        else:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1508
            i, item = res
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1509
            progress.increment(step=i, item=item)
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1510
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1511
    if b'.hgsubstate' in mresult._actionmapping[mergestatemod.ACTION_GET]:
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  1512
        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
  1513
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1514
    # forget (manifest only, just log it) (must come first)
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1515
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1516
        (mergestatemod.ACTION_FORGET,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1517
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1518
        repo.ui.debug(b" %s: %s -> f\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1519
        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
  1520
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1521
    # re-add (manifest only, just log it)
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1522
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1523
        (mergestatemod.ACTION_ADD,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1524
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1525
        repo.ui.debug(b" %s: %s -> a\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1526
        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
  1527
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1528
    # re-add/mark as modified (manifest only, just log it)
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1529
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1530
        (mergestatemod.ACTION_ADD_MODIFIED,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1531
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1532
        repo.ui.debug(b" %s: %s -> am\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1533
        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
  1534
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1535
    # keep (noop, just log it)
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1536
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1537
        (mergestatemod.ACTION_KEEP,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1538
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1539
        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
  1540
        # no progress
45467
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1541
    for f, args, msg in mresult.getactions(
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1542
        (mergestatemod.ACTION_KEEP_ABSENT,), sort=True
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1543
    ):
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1544
        repo.ui.debug(b" %s: %s -> ka\n" % (f, msg))
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45466
diff changeset
  1545
        # no progress
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1546
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1547
    # directory rename, move local
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1548
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1549
        (mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1550
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1551
        repo.ui.debug(b" %s: %s -> dm\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1552
        progress.increment(item=f)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1553
        f0, flags = args
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1554
        repo.ui.note(_(b"moving %s to %s\n") % (f0, f))
33086
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  1555
        wctx[f].audit()
33083
05c680ebf512 merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com>
parents: 33082
diff changeset
  1556
        wctx[f].write(wctx.filectx(f0).data(), flags)
33082
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33081
diff changeset
  1557
        wctx[f0].remove()
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1558
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1559
    # local directory rename, get
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1560
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1561
        (mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1562
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1563
        repo.ui.debug(b" %s: %s -> dg\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1564
        progress.increment(item=f)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1565
        f0, flags = args
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1566
        repo.ui.note(_(b"getting %s to %s\n") % (f0, f))
33083
05c680ebf512 merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com>
parents: 33082
diff changeset
  1567
        wctx[f].write(mctx.filectx(f0).data(), flags)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1568
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1569
    # exec
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1570
    for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1571
        (mergestatemod.ACTION_EXEC,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1572
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1573
        repo.ui.debug(b" %s: %s -> e\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1574
        progress.increment(item=f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1575
        (flags,) = args
33086
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  1576
        wctx[f].audit()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1577
        wctx[f].setflags(b'l' in flags, b'x' in flags)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1578
45341
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1579
    # these actions updates the file
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1580
    updated = mresult.len(
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1581
        (
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1582
            mergestatemod.ACTION_GET,
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1583
            mergestatemod.ACTION_EXEC,
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1584
            mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1585
            mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1586
        )
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45340
diff changeset
  1587
    )
26786
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1588
    # 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
  1589
    # 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
  1590
    # True
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1591
    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
  1592
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1593
    if usemergedriver:
35500
87918218da70 merge: raise before running mergedriver if using IMM
Phil Cohen <phillco@fb.com>
parents: 35288
diff changeset
  1594
        if wctx.isinmemory():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1595
            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
  1596
                b"in-memory merge does not support mergedriver"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1597
            )
26786
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1598
        ms.commit()
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1599
        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
  1600
        # 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
  1601
        unresolvedf = set(ms.unresolved())
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1602
        if not proceed:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1603
            # 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
  1604
            # error out
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1605
            return updateresult(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1606
                updated, merged, removed, max(len(unresolvedf), 1)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1607
            )
26786
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1608
        newactions = []
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1609
        for f, args, msg in mergeactions:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1610
            if f in unresolvedf:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1611
                newactions.append((f, args, msg))
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1612
        mergeactions = newactions
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1613
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1614
    try:
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1615
        # premerge
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1616
        tocomplete = []
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1617
        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
  1618
            repo.ui.debug(b" %s: %s -> m (premerge)\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1619
            progress.increment(item=f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1620
            if f == b'.hgsubstate':  # subrepo states need updating
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1621
                subrepoutil.submerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1622
                    repo, wctx, mctx, wctx.ancestor(mctx), overwrite, labels
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1623
                )
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1624
                continue
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1625
            wctx[f].audit()
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1626
            complete, r = ms.preresolve(f, wctx)
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1627
            if not complete:
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1628
                numupdates += 1
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1629
                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
  1630
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1631
        # merge
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1632
        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
  1633
            repo.ui.debug(b" %s: %s -> m (merge)\n" % (f, msg))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38045
diff changeset
  1634
            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
  1635
            ms.resolve(f, wctx)
26292
007ac1acfcac merge: move merge step to the end
Siddharth Agarwal <sid0@fb.com>
parents: 25959
diff changeset
  1636
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1637
    finally:
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
  1638
        ms.commit()
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1639
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1640
    unresolved = ms.unresolvedcount()
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1641
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1642
    if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1643
        usemergedriver
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1644
        and not unresolved
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1645
        and ms.mdstate() != mergestatemod.MERGE_DRIVER_STATE_SUCCESS
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1646
    ):
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1647
        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
  1648
            # 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
  1649
            # 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
  1650
            unresolved = max(unresolved, 1)
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1651
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1652
        ms.commit()
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1653
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1654
    msupdated, msmerged, msremoved = ms.counts()
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1655
    updated += msupdated
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1656
    merged += msmerged
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1657
    removed += msremoved
27080
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
  1658
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
  1659
    extraactions = ms.actions()
29831
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1660
    if extraactions:
45337
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1661
        mfiles = {
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1662
            a[0] for a in mresult.getactions((mergestatemod.ACTION_MERGE,))
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45336
diff changeset
  1663
        }
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
  1664
        for k, acts in pycompat.iteritems(extraactions):
45334
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45333
diff changeset
  1665
            for a in acts:
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45333
diff changeset
  1666
                mresult.addfile(a[0], k, *a[1:])
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1667
            if k == mergestatemod.ACTION_GET and wantfiledata:
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1668
                # no filedata until mergestate is updated to provide it
42522
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42456
diff changeset
  1669
                for a in acts:
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42456
diff changeset
  1670
                    getfiledata[a[0]] = None
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
  1671
            # Remove these files from actions[ACTION_MERGE] as well. This is
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
  1672
            # important because in recordupdates, files in actions[ACTION_MERGE]
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
  1673
            # are processed after files in other actions, and the merge driver
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
  1674
            # might add files to those actions via extraactions above. This can
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
  1675
            # 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: 37111
diff changeset
  1676
            # especially problematic for actions[ACTION_REMOVE] (currently only
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
  1677
            # possible with the merge driver in the initial merge process;
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
  1678
            # interrupted merges don't go through this flow).
29831
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1679
            #
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1680
            # 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: 29775
diff changeset
  1681
            # 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: 29775
diff changeset
  1682
            # 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: 29775
diff changeset
  1683
            # 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: 29775
diff changeset
  1684
            #
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1685
            # 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: 29775
diff changeset
  1686
            # those lists aren't consulted again.
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1687
            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: 29775
diff changeset
  1688
45340
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45338
diff changeset
  1689
        for a in list(mresult.getactions((mergestatemod.ACTION_MERGE,))):
45334
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45333
diff changeset
  1690
            if a[0] not in mfiles:
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45333
diff changeset
  1691
                mresult.removefile(a[0])
27080
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
  1692
38373
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38345
diff changeset
  1693
    progress.complete()
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1694
    assert len(getfiledata) == (
45338
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
  1695
        mresult.len((mergestatemod.ACTION_GET,)) if wantfiledata else 0
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1696
    )
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  1697
    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
  1698
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1699
45167
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1700
def _advertisefsmonitor(repo, num_gets, p1node):
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1701
    # Advertise fsmonitor when its presence could be useful.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1702
    #
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1703
    # We only advertise when performing an update from an empty working
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1704
    # directory. This typically only occurs during initial clone.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1705
    #
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1706
    # We give users a mechanism to disable the warning in case it is
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1707
    # annoying.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1708
    #
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1709
    # We only allow on Linux and MacOS because that's where fsmonitor is
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1710
    # considered stable.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1711
    fsmonitorwarning = repo.ui.configbool(b'fsmonitor', b'warn_when_unused')
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1712
    fsmonitorthreshold = repo.ui.configint(
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1713
        b'fsmonitor', b'warn_update_file_count'
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1714
    )
45462
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1715
    # avoid cycle dirstate -> sparse -> merge -> dirstate
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1716
    from . import dirstate
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1717
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1718
    if dirstate.rustmod is not None:
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1719
        # When using rust status, fsmonitor becomes necessary at higher sizes
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1720
        fsmonitorthreshold = repo.ui.configint(
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1721
            b'fsmonitor', b'warn_update_file_count_rust',
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1722
        )
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45459
diff changeset
  1723
45167
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1724
    try:
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1725
        # avoid cycle: extensions -> cmdutil -> merge
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1726
        from . import extensions
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1727
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1728
        extensions.find(b'fsmonitor')
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1729
        fsmonitorenabled = repo.ui.config(b'fsmonitor', b'mode') != b'off'
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1730
        # We intentionally don't look at whether fsmonitor has disabled
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1731
        # itself because a) fsmonitor may have already printed a warning
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1732
        # b) we only care about the config state here.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1733
    except KeyError:
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1734
        fsmonitorenabled = False
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1735
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1736
    if (
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1737
        fsmonitorwarning
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1738
        and not fsmonitorenabled
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1739
        and p1node == nullid
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1740
        and num_gets >= fsmonitorthreshold
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1741
        and pycompat.sysplatform.startswith((b'linux', b'darwin'))
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1742
    ):
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1743
        repo.ui.warn(
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1744
            _(
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1745
                b'(warning: large working directory being used without '
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1746
                b'fsmonitor enabled; enable fsmonitor to improve performance; '
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1747
                b'see "hg help -e fsmonitor")\n'
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1748
            )
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1749
        )
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1750
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  1751
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1752
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
  1753
UPDATECHECK_NONE = b'none'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1754
UPDATECHECK_LINEAR = b'linear'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1755
UPDATECHECK_NO_CONFLICT = b'noconflict'
42970
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42959
diff changeset
  1756
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1757
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1758
def update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1759
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1760
    node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1761
    branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1762
    force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1763
    ancestor=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1764
    mergeancestor=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1765
    labels=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1766
    matcher=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1767
    mergeforce=False,
44271
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1768
    updatedirstate=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1769
    updatecheck=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1770
    wc=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1771
):
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1772
    """
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1773
    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
  1774
30902
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30901
diff changeset
  1775
    node = the node to update to
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1776
    branchmerge = whether to merge between branches
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1777
    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
  1778
    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
  1779
    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
  1780
      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
  1781
      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
  1782
      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
  1783
      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
  1784
    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
  1785
    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
  1786
      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
  1787
34919
1856de4d1297 update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents: 34885
diff changeset
  1788
    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
  1789
    -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
  1790
    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
  1791
    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
  1792
    option doesn't exist on the command line, but represents the
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1793
    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
  1794
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 12032
diff changeset
  1795
    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
  1796
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1797
    -c  -C  -n  -m  dirty  rev  linear  |  result
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1798
     y   y   *   *    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1799
     y   *   y   *    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1800
     y   *   *   y    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1801
     *   y   y   *    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1802
     *   y   *   y    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1803
     *   *   y   y    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1804
     *   *   *   *    *     n     n     |     x
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1805
     *   *   *   *    n     *     *     |    ok
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1806
     n   n   n   n    y     *     y     |   merge
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1807
     n   n   n   n    y     y     n     |    (2)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1808
     n   n   n   y    y     *     *     |   merge
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1809
     n   n   y   n    y     *     *     |  merge if no conflict
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1810
     n   y   n   n    y     *     *     |  discard
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1811
     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
  1812
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
  1813
    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
  1814
    * = don't-care
31161
351207bfdde9 merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents: 31160
diff changeset
  1815
    1 = incompatible options (checked in commands.py)
351207bfdde9 merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents: 31160
diff changeset
  1816
    2 = abort: uncommitted changes (commit or update --clean to discard changes)
351207bfdde9 merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents: 31160
diff changeset
  1817
    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
  1818
34302
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1819
    The merge is performed inside ``wc``, a workingctx-like objects. It defaults
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1820
    to repo[None] if None is passed.
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1821
13162
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
  1822
    Return the same tuple as applyupdates().
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1823
    """
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1824
    # Avoid cycle.
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1825
    from . import sparse
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
  1826
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1827
    # This function used to find the default destination if node was None, but
30902
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30901
diff changeset
  1828
    # that's now in destutil.py.
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30901
diff changeset
  1829
    assert node is not None
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1830
    if not branchmerge and not force:
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1831
        # TODO: remove the default once all callers that pass branchmerge=False
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1832
        # and force=False pass a value for updatecheck. We may want to allow
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1833
        # updatecheck='abort' to better suppport some of these callers.
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1834
        if updatecheck is None:
42970
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42959
diff changeset
  1835
            updatecheck = UPDATECHECK_LINEAR
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1836
        if updatecheck not in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1837
            UPDATECHECK_NONE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1838
            UPDATECHECK_LINEAR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1839
            UPDATECHECK_NO_CONFLICT,
42972
71bb9363818c merge: check argument value with if/raise instead of an assert
Augie Fackler <augie@google.com>
parents: 42970
diff changeset
  1840
        ):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1841
            raise ValueError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1842
                r'Invalid updatecheck %r (can accept %r)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1843
                % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1844
                    updatecheck,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1845
                    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1846
                        UPDATECHECK_NONE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1847
                        UPDATECHECK_LINEAR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1848
                        UPDATECHECK_NO_CONFLICT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1849
                    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1850
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1851
            )
44999
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44939
diff changeset
  1852
    if wc is not None and wc.isinmemory():
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44939
diff changeset
  1853
        maybe_wlock = util.nullcontextmanager()
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44939
diff changeset
  1854
    else:
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44939
diff changeset
  1855
        maybe_wlock = repo.wlock()
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44939
diff changeset
  1856
    with maybe_wlock:
34302
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1857
        if wc is None:
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1858
            wc = repo[None]
20279
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
  1859
        pl = wc.parents()
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
  1860
        p1 = pl[0]
42409
72522fe7fb95 merge: reorder some initialization to make more sense
Martin von Zweigbergk <martinvonz@google.com>
parents: 42163
diff changeset
  1861
        p2 = repo[node]
23405
2a038deeac9a merge: 0 is a valid ancestor different from None
Mads Kiilerich <madski@unity3d.com>
parents: 23398
diff changeset
  1862
        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
  1863
            pas = [repo[ancestor]]
42410
a5b5ecff5f37 merge: simplify initialization of "pas"
Martin von Zweigbergk <martinvonz@google.com>
parents: 42409
diff changeset
  1864
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1865
            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
  1866
                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
  1867
                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
  1868
            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
  1869
                pas = [p1.ancestor(p2, warn=branchmerge)]
13874
9d67277c9204 merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents: 13728
diff changeset
  1870
36177
187f2474bc11 merge: coerce nodes to bytes, not str
Augie Fackler <augie@google.com>
parents: 36142
diff changeset
  1871
        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
  1872
42409
72522fe7fb95 merge: reorder some initialization to make more sense
Martin von Zweigbergk <martinvonz@google.com>
parents: 42163
diff changeset
  1873
        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
  1874
        ### check phase
27316
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1875
        if not overwrite:
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1876
            if len(pl) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1877
                raise error.Abort(_(b"outstanding uncommitted merge"))
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1878
            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
  1879
            if list(ms.unresolved()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1880
                raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1881
                    _(b"outstanding merge conflicts"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1882
                    hint=_(b"use 'hg resolve' to resolve"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1883
                )
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
  1884
        if branchmerge:
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
  1885
            if pas == [p2]:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1886
                raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1887
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1888
                        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
  1889
                        b" has no effect"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1890
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1891
                )
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
  1892
            elif pas == [p1]:
31379
b6a6df38a802 merge: check current wc branch for 'nothing to merge', not its p1
Mads Kiilerich <mads@kiilerich.com>
parents: 31323
diff changeset
  1893
                if not mergeancestor and wc.branch() == p2.branch():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1894
                    raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1895
                        _(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
  1896
                        hint=_(b"use 'hg update' or check 'hg heads'"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1897
                    )
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
  1898
            if not force and (wc.files() or wc.deleted()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1899
                raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1900
                    _(b"uncommitted changes"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1901
                    hint=_(b"use 'hg status' to list changes"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1902
                )
35284
1b03407e808d merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents: 35283
diff changeset
  1903
            if not wc.isinmemory():
1b03407e808d merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents: 35283
diff changeset
  1904
                for s in sorted(wc.substate):
1b03407e808d merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents: 35283
diff changeset
  1905
                    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
  1906
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
  1907
        elif not overwrite:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1908
            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
  1909
                # 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
  1910
                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
  1911
                repo.hook(b'update', parent1=xp2, parent2=b'', error=0)
37107
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37087
diff changeset
  1912
                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
  1913
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1914
            if updatecheck == UPDATECHECK_LINEAR and pas not in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1915
                [p1],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1916
                [p2],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1917
            ):  # nonlinear
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1918
                dirty = wc.dirty(missing=True)
30902
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30901
diff changeset
  1919
                if dirty:
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1920
                    # Branching is a bit strange to ensure we do the minimal
33146
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33095
diff changeset
  1921
                    # amount of call to obsutil.foreground.
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33095
diff changeset
  1922
                    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
  1923
                    # 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
  1924
                    if repo[node].node() in foreground:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1925
                        pass  # allow updating to successors
30902
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30901
diff changeset
  1926
                    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1927
                        msg = _(b"uncommitted changes")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1928
                        hint = _(b"commit or update --clean to discard changes")
30961
330fbd515512 destutil: remove duplicate check and leave it to merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30903
diff changeset
  1929
                        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
  1930
                else:
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1931
                    # Allow jumping branches if clean and specific rev given
30901
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1932
                    pass
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1933
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1934
        if overwrite:
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1935
            pas = [wc]
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1936
        elif not branchmerge:
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1937
            pas = [p1]
2814
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
  1938
25843
bf9ea348b487 merge: mark ancient debugging option
Matt Mackall <mpm@selenic.com>
parents: 25754
diff changeset
  1939
        # deprecated config: merge.followcopies
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1940
        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
  1941
        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
  1942
            followcopies = False
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
  1943
        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
  1944
            followcopies = False
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
  1945
        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
  1946
            followcopies = False
21080
04540a8499a3 merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents: 21024
diff changeset
  1947
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
  1948
        ### calculate phase
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  1949
        mresult = calculateupdates(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1950
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1951
            wc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1952
            p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1953
            pas,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1954
            branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1955
            force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1956
            mergeancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1957
            followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1958
            matcher=matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1959
            mergeforce=mergeforce,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1960
        )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1961
42970
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42959
diff changeset
  1962
        if updatecheck == UPDATECHECK_NO_CONFLICT:
45278
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
  1963
            if mresult.hasconflicts():
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
  1964
                msg = _(b"conflicting changes")
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
  1965
                hint = _(b"commit or update --clean to discard changes")
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45277
diff changeset
  1966
                raise error.Abort(msg, hint=hint)
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1967
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1968
        # 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
  1969
        # already, but we can't handle .hgsubstate in filemerge or
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  1970
        # subrepoutil.submerge yet so we have to keep prompting for it.
45344
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
  1971
        vals = mresult.getfile(b'.hgsubstate')
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
  1972
        if vals:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1973
            f = b'.hgsubstate'
45344
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45343
diff changeset
  1974
            m, args, msg = vals
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29629
diff changeset
  1975
            prompts = filemerge.partextras(labels)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1976
            prompts[b'f'] = f
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1977
            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
  1978
                if repo.ui.promptchoice(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1979
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1980
                        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
  1981
                        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
  1982
                        b"$$ &Changed $$ &Delete"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1983
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1984
                    % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1985
                    0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  1986
                ):
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1987
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1988
                        f, mergestatemod.ACTION_REMOVE, None, b'prompt delete',
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1989
                    )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1990
                elif f in p1:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1991
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1992
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  1993
                        mergestatemod.ACTION_ADD_MODIFIED,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1994
                        None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1995
                        b'prompt keep',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1996
                    )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1997
                else:
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1998
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  1999
                        f, mergestatemod.ACTION_ADD, None, b'prompt keep',
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2000
                    )
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2001
            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
  2002
                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
  2003
                flags = p2[f2].flags()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2004
                if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2005
                    repo.ui.promptchoice(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2006
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2007
                            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
  2008
                            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
  2009
                            b"$$ &Changed $$ &Deleted"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2010
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2011
                        % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2012
                        0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2013
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2014
                    == 0
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2015
                ):
45282
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  2016
                    mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45281
diff changeset
  2017
                        f,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2018
                        mergestatemod.ACTION_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2019
                        (flags, False),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2020
                        b'prompt recreating',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2021
                    )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  2022
                else:
45283
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45282
diff changeset
  2023
                    mresult.removefile(f)
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  2024
29889
6f447b9ec263 util: rename checkcase() to fscasesensitive() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 29831
diff changeset
  2025
        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
  2026
            # check collision between files only in p2 for clean update
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2027
            if not branchmerge and (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2028
                force or not wc.dirty(missing=True, branch=False)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2029
            ):
23544
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  2030
                _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
  2031
            else:
45333
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
  2032
                _checkcollision(repo, wc.manifest(), mresult)
23544
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  2033
23525
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  2034
        # divergent renames
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  2035
        for f, fl in sorted(pycompat.iteritems(mresult.diverge)):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2036
            repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2037
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2038
                    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
  2039
                    b"multiple times to:\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2040
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2041
                % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2042
            )
42110
3a7efcbdf288 copies: print list of divergent renames in sorted order
Martin von Zweigbergk <martinvonz@google.com>
parents: 42057
diff changeset
  2043
            for nf in sorted(fl):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2044
                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
  2045
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  2046
        # rename and delete
45274
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
  2047
        for f, fl in sorted(pycompat.iteritems(mresult.renamedelete)):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2048
            repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2049
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2050
                    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
  2051
                    b"and renamed to:\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2052
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2053
                % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2054
            )
42110
3a7efcbdf288 copies: print list of divergent renames in sorted order
Martin von Zweigbergk <martinvonz@google.com>
parents: 42057
diff changeset
  2055
            for nf in sorted(fl):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2056
                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
  2057
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  2058
        ### apply phase
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2059
        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
  2060
            fp1, fp2, xp1, xp2 = fp2, nullid, xp2, b''
44165
ae9310709c13 merge: move definition of `partial` closer to where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 44151
diff changeset
  2061
        # If we're doing a partial update, we need to skip updating
44166
faec51c76b7b merge: avoid a negation in the definition of updatedirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44165
diff changeset
  2062
        # the dirstate.
faec51c76b7b merge: avoid a negation in the definition of updatedirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44165
diff changeset
  2063
        always = matcher is None or matcher.always()
44271
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2064
        updatedirstate = updatedirstate and always and not wc.isinmemory()
44151
d1c0f239193f merge: define updatedirstate a little earlier and reuse it
Martin von Zweigbergk <martinvonz@google.com>
parents: 44150
diff changeset
  2065
        if updatedirstate:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2066
            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
  2067
            # 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
  2068
            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
  2069
45167
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
  2070
        _advertisefsmonitor(
45338
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45337
diff changeset
  2071
            repo, mresult.len((mergestatemod.ACTION_GET,)), p1.node()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2072
        )
34885
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
  2073
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  2074
        wantfiledata = updatedirstate and not branchmerge
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2075
        stats, getfiledata = applyupdates(
45349
442823f66889 merge: drop commitinfo argument to applyupdates (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45348
diff changeset
  2076
            repo, mresult, wc, p2, overwrite, wantfiledata, labels=labels,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2077
        )
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  2078
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
  2079
        if updatedirstate:
32351
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  2080
            with repo.dirstate.parentchange():
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  2081
                repo.setparents(fp1, fp2)
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2082
                mergestatemod.recordupdates(
45334
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45333
diff changeset
  2083
                    repo, mresult.actionsdict, branchmerge, getfiledata
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44687
diff changeset
  2084
                )
32351
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  2085
                # update completed, clear state
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2086
                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
  2087
32351
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  2088
                if not branchmerge:
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  2089
                    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
  2090
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  2091
    # 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
  2092
    # (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
  2093
    if not branchmerge:
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  2094
        sparse.prunetemporaryincludes(repo)
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  2095
44150
ff22c76825b9 merge: don't call update hook when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 44092
diff changeset
  2096
    if updatedirstate:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2097
        repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2098
            b'update', parent1=xp1, parent2=xp2, error=stats.unresolvedcount
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2099
        )
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10431
diff changeset
  2100
    return stats
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2101
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2102
44399
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2103
def merge(ctx, labels=None, force=False, wc=None):
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2104
    """Merge another topological branch into the working copy.
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2105
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2106
    force = whether the merge was run with 'merge --force' (deprecated)
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2107
    """
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2108
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2109
    return update(
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2110
        ctx.repo(),
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2111
        ctx.rev(),
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2112
        labels=labels,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2113
        branchmerge=True,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2114
        force=force,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2115
        mergeforce=force,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2116
        wc=wc,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2117
    )
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2118
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44394
diff changeset
  2119
44270
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2120
def clean_update(ctx, wc=None):
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2121
    """Do a clean update to the given commit.
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2122
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2123
    This involves updating to the commit and discarding any changes in the
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2124
    working copy.
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2125
    """
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2126
    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: 44215
diff changeset
  2127
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44215
diff changeset
  2128
44271
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2129
def revert_to(ctx, matcher=None, wc=None):
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2130
    """Revert the working copy to the given commit.
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2131
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2132
    The working copy will keep its current parent(s) but its content will
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2133
    be the same as in the given commit.
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2134
    """
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2135
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2136
    return update(
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2137
        ctx.repo(),
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2138
        ctx.rev(),
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2139
        branchmerge=False,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2140
        force=True,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2141
        updatedirstate=False,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2142
        matcher=matcher,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2143
        wc=wc,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2144
    )
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2145
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  2146
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2147
def graft(
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2148
    repo,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2149
    ctx,
44212
cb8b67016110 graft: default `base` argument to common case of `ctx.p1()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44211
diff changeset
  2150
    base=None,
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2151
    labels=None,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2152
    keepparent=False,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2153
    keepconflictparent=False,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2154
    wctx=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2155
):
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2156
    """Do a graft-like merge.
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2157
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2158
    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
  2159
    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
  2160
    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
  2161
    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
  2162
    renames/copies appropriately.
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2163
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2164
    ctx - changeset to rebase
44212
cb8b67016110 graft: default `base` argument to common case of `ctx.p1()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44211
diff changeset
  2165
    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
  2166
    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
  2167
    keepparent - keep second parent if any
42412
127937874395 merge: correct argument name in docstring
Anton Shestakov <av6@dwimlabs.net>
parents: 42410
diff changeset
  2168
    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
  2169
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2170
    """
24643
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
  2171
    # 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
  2172
    # 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
  2173
    # 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
  2174
    # 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
  2175
    # 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
  2176
    # which local deleted".
44383
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44289
diff changeset
  2177
    # We also pass mergeancestor=True when base is the same revision as p1. 2)
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44289
diff changeset
  2178
    # doesn't matter as there can't possibly be conflicts, but 1) is necessary.
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2179
    wctx = wctx or repo[None]
44089
bd22e90c54b3 graft: extract repo[None] to a variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 44060
diff changeset
  2180
    pctx = wctx.p1()
44212
cb8b67016110 graft: default `base` argument to common case of `ctx.p1()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44211
diff changeset
  2181
    base = base or ctx.p1()
44383
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44289
diff changeset
  2182
    mergeancestor = (
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44289
diff changeset
  2183
        repo.changelog.isancestor(pctx.node(), ctx.node())
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44289
diff changeset
  2184
        or pctx.rev() == base.rev()
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44289
diff changeset
  2185
    )
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2186
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2187
    stats = update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2188
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2189
        ctx.node(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2190
        True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2191
        True,
43796
ebfd349eac46 graft: rename `pctx` argument to `base` since that's what it is
Martin von Zweigbergk <martinvonz@google.com>
parents: 43787
diff changeset
  2192
        base.node(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2193
        mergeancestor=mergeancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2194
        labels=labels,
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2195
        wc=wctx,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2196
    )
38494
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2197
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2198
    if keepconflictparent and stats.unresolvedcount:
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2199
        pother = ctx.node()
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2200
    else:
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2201
        pother = nullid
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2202
        parents = ctx.parents()
43796
ebfd349eac46 graft: rename `pctx` argument to `base` since that's what it is
Martin von Zweigbergk <martinvonz@google.com>
parents: 43787
diff changeset
  2203
        if keepparent and len(parents) == 2 and base in parents:
ebfd349eac46 graft: rename `pctx` argument to `base` since that's what it is
Martin von Zweigbergk <martinvonz@google.com>
parents: 43787
diff changeset
  2204
            parents.remove(base)
38494
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38426
diff changeset
  2205
            pother = parents[0].node()
43798
32d11a23c9cf graft: never set both parents equal in the dirstate (issue6098)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43797
diff changeset
  2206
    # Never set both parents equal to each other
32d11a23c9cf graft: never set both parents equal in the dirstate (issue6098)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43797
diff changeset
  2207
    if pother == pctx.node():
32d11a23c9cf graft: never set both parents equal in the dirstate (issue6098)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43797
diff changeset
  2208
        pother = nullid
27267
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  2209
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2210
    if wctx.isinmemory():
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2211
        wctx.setparents(pctx.node(), pother)
32351
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  2212
        # 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
  2213
        copies.graftcopies(wctx, ctx, base)
44211
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2214
    else:
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2215
        with repo.dirstate.parentchange():
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2216
            repo.setparents(pctx.node(), pother)
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2217
            repo.dirstate.write(repo.currenttransaction())
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2218
            # fix up dirstate for copies and renames
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44200
diff changeset
  2219
            copies.graftcopies(wctx, ctx, base)
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  2220
    return stats
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2221
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2222
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2223
def purge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2224
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2225
    matcher,
44289
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44287
diff changeset
  2226
    unknown=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2227
    ignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2228
    removeemptydirs=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2229
    removefiles=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2230
    abortonerror=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2231
    noop=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
  2232
):
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2233
    """Purge the working directory of untracked files.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2234
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2235
    ``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
  2236
    potentially a subset.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2237
44289
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44287
diff changeset
  2238
    ``unknown`` controls whether unknown files should be purged.
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44287
diff changeset
  2239
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44287
diff changeset
  2240
    ``ignored`` controls whether ignored files should be purged.
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2241
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2242
    ``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
  2243
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2244
    ``removefiles`` controls whether files are removed.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2245
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2246
    ``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
  2247
    deleting a file or directory.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2248
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2249
    ``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
  2250
    will be taken.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2251
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2252
    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
  2253
    or would be removed.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2254
    """
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2255
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2256
    def remove(removefn, path):
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2257
        try:
39464
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39463
diff changeset
  2258
            removefn(path)
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2259
        except OSError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2260
            m = _(b'%s cannot be removed') % path
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2261
            if abortonerror:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2262
                raise error.Abort(m)
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2263
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2264
                repo.ui.warn(_(b'warning: %s\n') % m)
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2265
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2266
    # 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
  2267
    # restore it when we're done.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2268
    oldtraversedir = matcher.traversedir
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2269
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2270
    res = []
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2271
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2272
    try:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2273
        if removeemptydirs:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2274
            directories = []
43713
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43633
diff changeset
  2275
            matcher.traversedir = directories.append
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2276
44289
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44287
diff changeset
  2277
        status = repo.status(match=matcher, ignored=ignored, unknown=unknown)
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2278
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2279
        if removefiles:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2280
            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
  2281
                if not noop:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2282
                    repo.ui.note(_(b'removing file %s\n') % f)
39464
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39463
diff changeset
  2283
                    remove(repo.wvfs.unlink, f)
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2284
                res.append(f)
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2285
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2286
        if removeemptydirs:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2287
            for f in sorted(directories, reverse=True):
39464
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39463
diff changeset
  2288
                if matcher(f) and not repo.wvfs.listdir(f):
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2289
                    if not noop:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2290
                        repo.ui.note(_(b'removing directory %s\n') % f)
39464
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39463
diff changeset
  2291
                        remove(repo.wvfs.rmdir, f)
39463
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2292
                    res.append(f)
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2293
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2294
        return res
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2295
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2296
    finally:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
  2297
        matcher.traversedir = oldtraversedir