mercurial/merge.py
author Mark Thomas <mbthomas@fb.com>
Mon, 02 Oct 2017 14:05:30 -0700
changeset 34548 b4955650eb57
parent 34547 81aebcc73beb
child 34549 a991e1d6bc82
permissions -rw-r--r--
merge: add merge action 'pr' to rename files during update Add a new merge action to handle a path conflict by renaming the conflicting file to a safe name. The rename is just to avoid problems on the filesystem. The conflict is still considered unresolved until the user marks the original path as resolved. Differential Revision: https://phab.mercurial-scm.org/D777
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     1
# merge.py - directory-level update/merge handling for Mercurial
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     2
#
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
     3
# Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8152
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9783
diff changeset
     6
# GNU General Public License version 2 or any later version.
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     7
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
     8
from __future__ import absolute_import
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
     9
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    10
import errno
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29242
diff changeset
    11
import hashlib
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    12
import shutil
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,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    18
    bin,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    19
    hex,
30362
3c6893ba2d36 merge: change modified indicator to be 20 bytes
Durham Goode <durham@fb.com>
parents: 30361
diff changeset
    20
    modifiednodeid,
27031
8be0af32e513 mergestate: allow storing and retrieving change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27027
diff changeset
    21
    nullhex,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    22
    nullid,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    23
    nullrev,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    24
)
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    25
from . import (
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    26
    copies,
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26570
diff changeset
    27
    error,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    28
    filemerge,
31257
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31175
diff changeset
    29
    match as matchmod,
33146
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33095
diff changeset
    30
    obsutil,
30519
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30486
diff changeset
    31
    pycompat,
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
    32
    scmutil,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    33
    subrepo,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    34
    util,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    35
    worker,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
    36
)
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
    37
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    38
_pack = struct.pack
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    39
_unpack = struct.unpack
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    40
20593
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
    41
def _droponode(data):
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
    42
    # used for compatibility for v1
23380
90cc552ceed5 merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents: 23362
diff changeset
    43
    bits = data.split('\0')
20593
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
    44
    bits = bits[:-2] + bits[-1:]
23380
90cc552ceed5 merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents: 23362
diff changeset
    45
    return '\0'.join(bits)
20593
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
    46
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
    47
class mergestate(object):
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    48
    '''track 3-way merge state of individual files
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    49
27022
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
    50
    The merge state is stored on disk when needed. Two files are used: one with
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
    51
    an old format (version 1), and one with a new format (version 2). Version 2
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
    52
    stores a superset of the data in version 1, including new kinds of records
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
    53
    in the future. For more about the new format, see the documentation for
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
    54
    `_readrecordsv2`.
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    55
27022
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
    56
    Each record can contain arbitrary content, and has an associated type. This
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
    57
    `type` should be a letter. If `type` is uppercase, the record is mandatory:
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
    58
    versions of Mercurial that don't support it should abort. If `type` is
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
    59
    lowercase, the record can be safely ignored.
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    60
27022
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
    61
    Currently known records:
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    62
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    63
    L: the node of the "local" part of the merge (hexified version)
20591
02c60e380fd0 merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20590
diff changeset
    64
    O: the node of the "other" part of the merge (hexified version)
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    65
    F: a file to be merged entry
27031
8be0af32e513 mergestate: allow storing and retrieving change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27027
diff changeset
    66
    C: a change/delete or delete/change conflict
26650
6ff5534c8afc merge.mergestate: add support for persisting driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents: 26649
diff changeset
    67
    D: a file that the external merge driver will merge internally
6ff5534c8afc merge.mergestate: add support for persisting driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents: 26649
diff changeset
    68
       (experimental)
34545
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
    69
    P: a path conflict (file vs directory)
26649
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
    70
    m: the external merge driver defined for this merge plus its run state
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
    71
       (experimental)
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30200
diff changeset
    72
    f: a (filename, dictionary) tuple of optional values for a given file
27027
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
    73
    X: unsupported mandatory record type (used in tests)
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
    74
    x: unsupported advisory record type (used in tests)
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
    75
    l: the labels for the parts of the merge.
26649
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
    76
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
    77
    Merge driver run states (experimental):
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
    78
    u: driver-resolved files unmarked -- needs to be run next time we're about
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
    79
       to resolve or commit
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
    80
    m: driver-resolved files marked -- only needs to be run before commit
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
    81
    s: success/skipped -- does not need to be run any more
27022
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
    82
34545
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
    83
    Merge record states (stored in self._state, indexed by filename):
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
    84
    u: unresolved conflict
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
    85
    r: resolved conflict
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
    86
    pu: unresolved path conflict (file conflicts with directory)
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
    87
    pr: resolved path conflict
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
    88
    d: driver-resolved conflict
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
    89
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
    90
    The resolve command transitions between 'u' and 'r' for conflicts and
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
    91
    'pu' and 'pr' for path conflicts.
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
    92
    '''
23380
90cc552ceed5 merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents: 23362
diff changeset
    93
    statepathv1 = 'merge/state'
90cc552ceed5 merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents: 23362
diff changeset
    94
    statepathv2 = 'merge/state2'
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
    95
26987
416b2b7d3068 mergestate: add a constructor that sets up a clean merge state
Siddharth Agarwal <sid0@fb.com>
parents: 26986
diff changeset
    96
    @staticmethod
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
    97
    def clean(repo, node=None, other=None, labels=None):
26987
416b2b7d3068 mergestate: add a constructor that sets up a clean merge state
Siddharth Agarwal <sid0@fb.com>
parents: 26986
diff changeset
    98
        """Initialize a brand new merge state, removing any existing state on
416b2b7d3068 mergestate: add a constructor that sets up a clean merge state
Siddharth Agarwal <sid0@fb.com>
parents: 26986
diff changeset
    99
        disk."""
416b2b7d3068 mergestate: add a constructor that sets up a clean merge state
Siddharth Agarwal <sid0@fb.com>
parents: 26986
diff changeset
   100
        ms = mergestate(repo)
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   101
        ms.reset(node, other, labels)
26987
416b2b7d3068 mergestate: add a constructor that sets up a clean merge state
Siddharth Agarwal <sid0@fb.com>
parents: 26986
diff changeset
   102
        return ms
416b2b7d3068 mergestate: add a constructor that sets up a clean merge state
Siddharth Agarwal <sid0@fb.com>
parents: 26986
diff changeset
   103
26991
2ddc92bae4a7 mergestate: add a constructor that reads state from disk
Siddharth Agarwal <sid0@fb.com>
parents: 26990
diff changeset
   104
    @staticmethod
2ddc92bae4a7 mergestate: add a constructor that reads state from disk
Siddharth Agarwal <sid0@fb.com>
parents: 26990
diff changeset
   105
    def read(repo):
2ddc92bae4a7 mergestate: add a constructor that reads state from disk
Siddharth Agarwal <sid0@fb.com>
parents: 26990
diff changeset
   106
        """Initialize the merge state, reading it from disk."""
2ddc92bae4a7 mergestate: add a constructor that reads state from disk
Siddharth Agarwal <sid0@fb.com>
parents: 26990
diff changeset
   107
        ms = mergestate(repo)
27005
3185c01c551c mergestate: move _read() call to read constructor
Siddharth Agarwal <sid0@fb.com>
parents: 26991
diff changeset
   108
        ms._read()
26991
2ddc92bae4a7 mergestate: add a constructor that reads state from disk
Siddharth Agarwal <sid0@fb.com>
parents: 26990
diff changeset
   109
        return ms
2ddc92bae4a7 mergestate: add a constructor that reads state from disk
Siddharth Agarwal <sid0@fb.com>
parents: 26990
diff changeset
   110
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
   111
    def __init__(self, repo):
27005
3185c01c551c mergestate: move _read() call to read constructor
Siddharth Agarwal <sid0@fb.com>
parents: 26991
diff changeset
   112
        """Initialize the merge state.
3185c01c551c mergestate: move _read() call to read constructor
Siddharth Agarwal <sid0@fb.com>
parents: 26991
diff changeset
   113
3185c01c551c mergestate: move _read() call to read constructor
Siddharth Agarwal <sid0@fb.com>
parents: 26991
diff changeset
   114
        Do not use this directly! Instead call read() or clean()."""
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
   115
        self._repo = repo
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
   116
        self._dirty = False
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   117
        self._labels = None
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   118
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   119
    def reset(self, node=None, other=None, labels=None):
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
   120
        self._state = {}
28009
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   121
        self._stateextras = {}
21261
6ca05c46aa95 mergestate: consistently set variables to None
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21203
diff changeset
   122
        self._local = None
6ca05c46aa95 mergestate: consistently set variables to None
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21203
diff changeset
   123
        self._other = None
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   124
        self._labels = labels
27130
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
   125
        for var in ('localctx', 'otherctx'):
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
   126
            if var in vars(self):
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
   127
                delattr(self, var)
7848
89e05c02a4af resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents: 7768
diff changeset
   128
        if node:
89e05c02a4af resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents: 7768
diff changeset
   129
            self._local = node
20591
02c60e380fd0 merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20590
diff changeset
   130
            self._other = other
26768
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   131
        self._readmergedriver = None
26769
5b00ec4c05cb merge.mergestate: set merge driver state to 's' if there's none present
Siddharth Agarwal <sid0@fb.com>
parents: 26768
diff changeset
   132
        if self.mergedriver:
5b00ec4c05cb merge.mergestate: set merge driver state to 's' if there's none present
Siddharth Agarwal <sid0@fb.com>
parents: 26768
diff changeset
   133
            self._mdstate = 's'
5b00ec4c05cb merge.mergestate: set merge driver state to 's' if there's none present
Siddharth Agarwal <sid0@fb.com>
parents: 26768
diff changeset
   134
        else:
5b00ec4c05cb merge.mergestate: set merge driver state to 's' if there's none present
Siddharth Agarwal <sid0@fb.com>
parents: 26768
diff changeset
   135
            self._mdstate = 'u'
31323
102d3a30582c merge: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31310
diff changeset
   136
        shutil.rmtree(self._repo.vfs.join('merge'), True)
27074
78b0c88ab0db mergestate._resolve: store return code and action for each file
Siddharth Agarwal <sid0@fb.com>
parents: 27049
diff changeset
   137
        self._results = {}
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
   138
        self._dirty = False
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   139
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
   140
    def _read(self):
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   141
        """Analyse each record content to restore a serialized state from disk
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   142
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   143
        This function process "record" entry produced by the de-serialization
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   144
        of on disk file.
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   145
        """
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
   146
        self._state = {}
28009
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   147
        self._stateextras = {}
21261
6ca05c46aa95 mergestate: consistently set variables to None
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21203
diff changeset
   148
        self._local = None
6ca05c46aa95 mergestate: consistently set variables to None
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21203
diff changeset
   149
        self._other = None
27130
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
   150
        for var in ('localctx', 'otherctx'):
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
   151
            if var in vars(self):
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
   152
                delattr(self, var)
26768
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   153
        self._readmergedriver = None
26769
5b00ec4c05cb merge.mergestate: set merge driver state to 's' if there's none present
Siddharth Agarwal <sid0@fb.com>
parents: 26768
diff changeset
   154
        self._mdstate = 's'
26986
1ee5e48f09d4 mergestate: raise structured exception for unsupported merge records
Siddharth Agarwal <sid0@fb.com>
parents: 26975
diff changeset
   155
        unsupported = set()
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   156
        records = self._readrecords()
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   157
        for rtype, record in records:
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   158
            if rtype == 'L':
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   159
                self._local = bin(record)
20591
02c60e380fd0 merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20590
diff changeset
   160
            elif rtype == 'O':
02c60e380fd0 merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20590
diff changeset
   161
                self._other = bin(record)
26649
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
   162
            elif rtype == 'm':
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
   163
                bits = record.split('\0', 1)
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
   164
                mdstate = bits[1]
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
   165
                if len(mdstate) != 1 or mdstate not in 'ums':
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
   166
                    # the merge driver should be idempotent, so just rerun it
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
   167
                    mdstate = 'u'
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
   168
26768
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   169
                self._readmergedriver = bits[0]
26649
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
   170
                self._mdstate = mdstate
34545
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   171
            elif rtype in 'FDCP':
23380
90cc552ceed5 merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents: 23362
diff changeset
   172
                bits = record.split('\0')
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   173
                self._state[bits[0]] = bits[1:]
28009
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   174
            elif rtype == 'f':
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   175
                filename, rawextras = record.split('\0', 1)
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   176
                extraparts = rawextras.split('\0')
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   177
                extras = {}
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   178
                i = 0
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   179
                while i < len(extraparts):
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   180
                    extras[extraparts[i]] = extraparts[i + 1]
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   181
                    i += 2
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   182
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   183
                self._stateextras[filename] = extras
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   184
            elif rtype == 'l':
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   185
                labels = record.split('\0', 2)
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   186
                self._labels = [l for l in labels if len(l) > 0]
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   187
            elif not rtype.islower():
26986
1ee5e48f09d4 mergestate: raise structured exception for unsupported merge records
Siddharth Agarwal <sid0@fb.com>
parents: 26975
diff changeset
   188
                unsupported.add(rtype)
27074
78b0c88ab0db mergestate._resolve: store return code and action for each file
Siddharth Agarwal <sid0@fb.com>
parents: 27049
diff changeset
   189
        self._results = {}
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   190
        self._dirty = False
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   191
26986
1ee5e48f09d4 mergestate: raise structured exception for unsupported merge records
Siddharth Agarwal <sid0@fb.com>
parents: 26975
diff changeset
   192
        if unsupported:
1ee5e48f09d4 mergestate: raise structured exception for unsupported merge records
Siddharth Agarwal <sid0@fb.com>
parents: 26975
diff changeset
   193
            raise error.UnsupportedMergeRecords(unsupported)
1ee5e48f09d4 mergestate: raise structured exception for unsupported merge records
Siddharth Agarwal <sid0@fb.com>
parents: 26975
diff changeset
   194
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   195
    def _readrecords(self):
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   196
        """Read merge state from disk and return a list of record (TYPE, data)
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   197
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 20945
diff changeset
   198
        We read data from both v1 and v2 files and decide which one to use.
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   199
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 20945
diff changeset
   200
        V1 has been used by version prior to 2.9.1 and contains less data than
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 20945
diff changeset
   201
        v2. We read both versions and check if no data in v2 contradicts
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   202
        v1. If there is not contradiction we can safely assume that both v1
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   203
        and v2 were written at the same time and use the extract data in v2. If
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   204
        there is contradiction we ignore v2 content as we assume an old version
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 20945
diff changeset
   205
        of Mercurial has overwritten the mergestate file and left an old v2
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   206
        file around.
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   207
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   208
        returns list of record [(TYPE, data), ...]"""
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   209
        v1records = self._readrecordsv1()
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   210
        v2records = self._readrecordsv2()
26500
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   211
        if self._v1v2match(v1records, v2records):
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   212
            return v2records
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   213
        else:
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   214
            # v1 file is newer than v2 file, use it
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   215
            # we have to infer the "other" changeset of the merge
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   216
            # we cannot do better than that with v1 of the format
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   217
            mctx = self._repo[None].parents()[-1]
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   218
            v1records.append(('O', mctx.hex()))
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   219
            # add place holder "other" file node information
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   220
            # nobody is using it yet so we do no need to fetch the data
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   221
            # if mctx was wrong `mctx[bits[-2]]` may fails.
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   222
            for idx, r in enumerate(v1records):
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   223
                if r[0] == 'F':
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   224
                    bits = r[1].split('\0')
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   225
                    bits.insert(-2, '')
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   226
                    v1records[idx] = (r[0], '\0'.join(bits))
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   227
            return v1records
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   228
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   229
    def _v1v2match(self, v1records, v2records):
20593
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   230
        oldv2 = set() # old format version of v2 record
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   231
        for rec in v2records:
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   232
            if rec[0] == 'L':
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   233
                oldv2.add(rec)
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   234
            elif rec[0] == 'F':
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   235
                # drop the onode data (not contained in v1)
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   236
                oldv2.add(('F', _droponode(rec[1])))
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   237
        for rec in v1records:
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   238
            if rec not in oldv2:
26500
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   239
                return False
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   240
        else:
26500
5bd7c4c07f6d merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents: 26361
diff changeset
   241
            return True
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   242
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   243
    def _readrecordsv1(self):
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   244
        """read on disk merge state for version 1 file
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   245
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   246
        returns list of record [(TYPE, data), ...]
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   247
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   248
        Note: the "F" data from this file are one entry short
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   249
              (no "other file node" entry)
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   250
        """
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   251
        records = []
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
   252
        try:
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23656
diff changeset
   253
            f = self._repo.vfs(self.statepathv1)
6530
4b92591c69a7 merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents: 6518
diff changeset
   254
            for i, l in enumerate(f):
4b92591c69a7 merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents: 6518
diff changeset
   255
                if i == 0:
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   256
                    records.append(('L', l[:-1]))
6530
4b92591c69a7 merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents: 6518
diff changeset
   257
                else:
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   258
                    records.append(('F', l[:-1]))
13400
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13323
diff changeset
   259
            f.close()
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25151
diff changeset
   260
        except IOError as err:
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
   261
            if err.errno != errno.ENOENT:
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
   262
                raise
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   263
        return records
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   264
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   265
    def _readrecordsv2(self):
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   266
        """read on disk merge state for version 2 file
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   267
27022
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
   268
        This format is a list of arbitrary records of the form:
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
   269
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
   270
          [type][length][content]
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
   271
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
   272
        `type` is a single character, `length` is a 4 byte integer, and
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
   273
        `content` is an arbitrary byte sequence of length `length`.
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
   274
27027
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   275
        Mercurial versions prior to 3.7 have a bug where if there are
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   276
        unsupported mandatory merge records, attempting to clear out the merge
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   277
        state with hg update --clean or similar aborts. The 't' record type
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   278
        works around that by writing out what those versions treat as an
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   279
        advisory record, but later versions interpret as special: the first
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   280
        character is the 'real' record type and everything onwards is the data.
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   281
27022
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
   282
        Returns list of records [(TYPE, data), ...]."""
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   283
        records = []
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   284
        try:
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23656
diff changeset
   285
            f = self._repo.vfs(self.statepathv2)
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   286
            data = f.read()
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   287
            off = 0
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   288
            end = len(data)
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   289
            while off < end:
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   290
                rtype = data[off]
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   291
                off += 1
20607
abd448767465 merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents: 20594
diff changeset
   292
                length = _unpack('>I', data[off:(off + 4)])[0]
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   293
                off += 4
20607
abd448767465 merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents: 20594
diff changeset
   294
                record = data[off:(off + length)]
abd448767465 merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents: 20594
diff changeset
   295
                off += length
27027
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   296
                if rtype == 't':
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   297
                    rtype, record = record[0], record[1:]
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   298
                records.append((rtype, record))
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   299
            f.close()
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25151
diff changeset
   300
        except IOError as err:
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   301
            if err.errno != errno.ENOENT:
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   302
                raise
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   303
        return records
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   304
26649
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
   305
    @util.propertycache
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
   306
    def mergedriver(self):
26768
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   307
        # protect against the following:
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   308
        # - A configures a malicious merge driver in their hgrc, then
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   309
        #   pauses the merge
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   310
        # - A edits their hgrc to remove references to the merge driver
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   311
        # - A gives a copy of their entire repo, including .hg, to B
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   312
        # - B inspects .hgrc and finds it to be clean
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   313
        # - B then continues the merge and the malicious merge driver
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   314
        #  gets invoked
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   315
        configmergedriver = self._repo.ui.config('experimental', 'mergedriver')
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   316
        if (self._readmergedriver is not None
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   317
            and self._readmergedriver != configmergedriver):
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   318
            raise error.ConfigError(
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   319
                _("merge driver changed since merge started"),
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   320
                hint=_("revert merge driver change or abort merge"))
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   321
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   322
        return configmergedriver
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
   323
26765
45976219eb80 merge.mergestate: add a way to get the other side of the merge
Siddharth Agarwal <sid0@fb.com>
parents: 26752
diff changeset
   324
    @util.propertycache
27130
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
   325
    def localctx(self):
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
   326
        if self._local is None:
31646
e960eba3581c merge: use ProgrammingError
Jun Wu <quark@fb.com>
parents: 31515
diff changeset
   327
            msg = "localctx accessed but self._local isn't set"
e960eba3581c merge: use ProgrammingError
Jun Wu <quark@fb.com>
parents: 31515
diff changeset
   328
            raise error.ProgrammingError(msg)
27130
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
   329
        return self._repo[self._local]
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
   330
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
   331
    @util.propertycache
26765
45976219eb80 merge.mergestate: add a way to get the other side of the merge
Siddharth Agarwal <sid0@fb.com>
parents: 26752
diff changeset
   332
    def otherctx(self):
27129
1bf1a7c3df43 mergestate: raise exception if otherctx is accessed but _other isn't set
Siddharth Agarwal <sid0@fb.com>
parents: 27122
diff changeset
   333
        if self._other is None:
31646
e960eba3581c merge: use ProgrammingError
Jun Wu <quark@fb.com>
parents: 31515
diff changeset
   334
            msg = "otherctx accessed but self._other isn't set"
e960eba3581c merge: use ProgrammingError
Jun Wu <quark@fb.com>
parents: 31515
diff changeset
   335
            raise error.ProgrammingError(msg)
26765
45976219eb80 merge.mergestate: add a way to get the other side of the merge
Siddharth Agarwal <sid0@fb.com>
parents: 26752
diff changeset
   336
        return self._repo[self._other]
26649
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
   337
21264
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
   338
    def active(self):
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
   339
        """Whether mergestate is active.
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
   340
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
   341
        Returns True if there appears to be mergestate. This is a rough proxy
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
   342
        for "is a merge in progress."
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
   343
        """
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
   344
        # Check local variables before looking at filesystem for performance
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
   345
        # reasons.
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
   346
        return bool(self._local) or bool(self._state) or \
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23656
diff changeset
   347
               self._repo.vfs.exists(self.statepathv1) or \
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23656
diff changeset
   348
               self._repo.vfs.exists(self.statepathv2)
21264
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
   349
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
   350
    def commit(self):
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   351
        """Write current state on disk (if necessary)"""
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
   352
        if self._dirty:
27006
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   353
            records = self._makerecords()
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   354
            self._writerecords(records)
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
   355
            self._dirty = False
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   356
27006
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   357
    def _makerecords(self):
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   358
        records = []
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   359
        records.append(('L', hex(self._local)))
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   360
        records.append(('O', hex(self._other)))
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   361
        if self.mergedriver:
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   362
            records.append(('m', '\0'.join([
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   363
                self.mergedriver, self._mdstate])))
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   364
        for d, v in self._state.iteritems():
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   365
            if v[0] == 'd':
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   366
                records.append(('D', '\0'.join([d] + v)))
34545
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   367
            elif v[0] in ('pu', 'pr'):
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   368
                records.append(('P', '\0'.join([d] + v)))
27031
8be0af32e513 mergestate: allow storing and retrieving change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27027
diff changeset
   369
            # v[1] == local ('cd'), v[6] == other ('dc') -- not supported by
8be0af32e513 mergestate: allow storing and retrieving change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27027
diff changeset
   370
            # older versions of Mercurial
8be0af32e513 mergestate: allow storing and retrieving change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27027
diff changeset
   371
            elif v[1] == nullhex or v[6] == nullhex:
8be0af32e513 mergestate: allow storing and retrieving change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27027
diff changeset
   372
                records.append(('C', '\0'.join([d] + v)))
27006
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   373
            else:
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   374
                records.append(('F', '\0'.join([d] + v)))
28009
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   375
        for filename, extras in sorted(self._stateextras.iteritems()):
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   376
            rawextras = '\0'.join('%s\0%s' % (k, v) for k, v in
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   377
                                  extras.iteritems())
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   378
            records.append(('f', '%s\0%s' % (filename, rawextras)))
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   379
        if self._labels is not None:
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   380
            labels = '\0'.join(self._labels)
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   381
            records.append(('l', labels))
27006
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   382
        return records
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
   383
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   384
    def _writerecords(self, records):
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   385
        """Write current state on disk (both v1 and v2)"""
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   386
        self._writerecordsv1(records)
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   387
        self._writerecordsv2(records)
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   388
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   389
    def _writerecordsv1(self, records):
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   390
        """Write current state on disk in a version 1 file"""
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23656
diff changeset
   391
        f = self._repo.vfs(self.statepathv1, 'w')
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   392
        irecords = iter(records)
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 29148
diff changeset
   393
        lrecords = next(irecords)
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   394
        assert lrecords[0] == 'L'
23380
90cc552ceed5 merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents: 23362
diff changeset
   395
        f.write(hex(self._local) + '\n')
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   396
        for rtype, data in irecords:
23380
90cc552ceed5 merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents: 23362
diff changeset
   397
            if rtype == 'F':
90cc552ceed5 merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents: 23362
diff changeset
   398
                f.write('%s\n' % _droponode(data))
20589
31993cd23b11 merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20588
diff changeset
   399
        f.close()
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   400
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   401
    def _writerecordsv2(self, records):
27027
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   402
        """Write current state on disk in a version 2 file
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   403
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   404
        See the docstring for _readrecordsv2 for why we use 't'."""
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   405
        # these are the records that all version 2 clients can read
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   406
        whitelist = 'LOF'
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23656
diff changeset
   407
        f = self._repo.vfs(self.statepathv2, 'w')
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   408
        for key, data in records:
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   409
            assert len(key) == 1
27027
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   410
            if key not in whitelist:
a01ecbcfaf84 mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents: 27022
diff changeset
   411
                key, data = 't', '%s%s' % (key, data)
23380
90cc552ceed5 merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents: 23362
diff changeset
   412
            format = '>sI%is' % len(data)
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   413
            f.write(_pack(format, key, len(data), data))
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
   414
        f.close()
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   415
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
   416
    def add(self, fcl, fco, fca, fd):
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   417
        """add a new (potentially?) conflicting file the merge state
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   418
        fcl: file context for local,
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   419
        fco: file context for remote,
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   420
        fca: file context for ancestors,
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   421
        fd:  file path of the resulting merge.
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   422
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   423
        note: also write the local version to the `.hg/merge` directory.
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   424
        """
27049
0d61f7ec7f76 mergestate.add: store absentfilectxes as nullhex
Siddharth Agarwal <sid0@fb.com>
parents: 27048
diff changeset
   425
        if fcl.isabsent():
0d61f7ec7f76 mergestate.add: store absentfilectxes as nullhex
Siddharth Agarwal <sid0@fb.com>
parents: 27048
diff changeset
   426
            hash = nullhex
0d61f7ec7f76 mergestate.add: store absentfilectxes as nullhex
Siddharth Agarwal <sid0@fb.com>
parents: 27048
diff changeset
   427
        else:
33095
9fc880dff5f3 py3: use hex() to convert the hash to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33086
diff changeset
   428
            hash = hex(hashlib.sha1(fcl.path()).digest())
27049
0d61f7ec7f76 mergestate.add: store absentfilectxes as nullhex
Siddharth Agarwal <sid0@fb.com>
parents: 27048
diff changeset
   429
            self._repo.vfs.write('merge/' + hash, fcl.data())
20593
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   430
        self._state[fd] = ['u', hash, fcl.path(),
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   431
                           fca.path(), hex(fca.filenode()),
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   432
                           fco.path(), hex(fco.filenode()),
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   433
                           fcl.flags()]
34486
a57c938e7ac8 style: never use a space before a colon or comma
Alex Gaynor <agaynor@mozilla.com>
parents: 34479
diff changeset
   434
        self._stateextras[fd] = {'ancestorlinknode': hex(fca.node())}
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
   435
        self._dirty = True
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   436
34545
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   437
    def addpath(self, path, frename, forigin):
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   438
        """add a new conflicting path to the merge state
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   439
        path:    the path that conflicts
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   440
        frename: the filename the conflicting file was renamed to
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   441
        forigin: origin of the file ('l' or 'r' for local/remote)
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   442
        """
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   443
        self._state[path] = ['pu', frename, forigin]
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   444
        self._dirty = True
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   445
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
   446
    def __contains__(self, dfile):
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
   447
        return dfile in self._state
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   448
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
   449
    def __getitem__(self, dfile):
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
   450
        return self._state[dfile][0]
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   451
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
   452
    def __iter__(self):
21268
a0b8a912ec81 merge: simplify mergestate iter
Mads Kiilerich <mads@kiilerich.com>
parents: 21266
diff changeset
   453
        return iter(sorted(self._state))
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   454
19285
feaf5749d7a4 merge: add a files method to the mergestate class
Bryan O'Sullivan <bryano@fb.com>
parents: 19226
diff changeset
   455
    def files(self):
feaf5749d7a4 merge: add a files method to the mergestate class
Bryan O'Sullivan <bryano@fb.com>
parents: 19226
diff changeset
   456
        return self._state.keys()
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   457
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
   458
    def mark(self, dfile, state):
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
   459
        self._state[dfile][0] = state
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
   460
        self._dirty = True
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
   461
26766
a83110faece1 merge.mergestate: add a way to get the merge driver state
Siddharth Agarwal <sid0@fb.com>
parents: 26765
diff changeset
   462
    def mdstate(self):
a83110faece1 merge.mergestate: add a way to get the merge driver state
Siddharth Agarwal <sid0@fb.com>
parents: 26765
diff changeset
   463
        return self._mdstate
a83110faece1 merge.mergestate: add a way to get the merge driver state
Siddharth Agarwal <sid0@fb.com>
parents: 26765
diff changeset
   464
21266
19d6fec60b81 resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21264
diff changeset
   465
    def unresolved(self):
19d6fec60b81 resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21264
diff changeset
   466
        """Obtain the paths of unresolved files."""
19d6fec60b81 resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21264
diff changeset
   467
33310
b4d517d736a1 mergestate: make unresolved() use iteritems()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33283
diff changeset
   468
        for f, entry in self._state.iteritems():
34545
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
   469
            if entry[0] in ('u', 'pu'):
21266
19d6fec60b81 resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21264
diff changeset
   470
                yield f
19d6fec60b81 resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21264
diff changeset
   471
26740
f4a27c05c43f merge.mergestate: add a generator for driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents: 26682
diff changeset
   472
    def driverresolved(self):
f4a27c05c43f merge.mergestate: add a generator for driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents: 26682
diff changeset
   473
        """Obtain the paths of driver-resolved files."""
f4a27c05c43f merge.mergestate: add a generator for driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents: 26682
diff changeset
   474
f4a27c05c43f merge.mergestate: add a generator for driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents: 26682
diff changeset
   475
        for f, entry in self._state.items():
f4a27c05c43f merge.mergestate: add a generator for driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents: 26682
diff changeset
   476
            if entry[0] == 'd':
f4a27c05c43f merge.mergestate: add a generator for driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents: 26682
diff changeset
   477
                yield f
f4a27c05c43f merge.mergestate: add a generator for driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents: 26682
diff changeset
   478
28009
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   479
    def extras(self, filename):
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   480
        return self._stateextras.setdefault(filename, {})
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   481
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   482
    def _resolve(self, preresolve, dfile, wctx):
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
   483
        """rerun merge process for file path `dfile`"""
26651
d58f2f0e2b19 merge.mergedriver: don't try resolving files marked driver-resolved
Siddharth Agarwal <sid0@fb.com>
parents: 26650
diff changeset
   484
        if self[dfile] in 'rd':
26616
2f1fce0d4e86 merge.mergestate._resolve: also return completed status
Siddharth Agarwal <sid0@fb.com>
parents: 26615
diff changeset
   485
            return True, 0
20593
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   486
        stateentry = self._state[dfile]
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
   487
        state, hash, lfile, afile, anode, ofile, onode, flags = stateentry
20594
ba619c50a355 resolve: use "other" changeset from merge state (issue4163)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20593
diff changeset
   488
        octx = self._repo[self._other]
28011
8abd9f785030 merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents: 28009
diff changeset
   489
        extras = self.extras(dfile)
8abd9f785030 merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents: 28009
diff changeset
   490
        anccommitnode = extras.get('ancestorlinknode')
8abd9f785030 merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents: 28009
diff changeset
   491
        if anccommitnode:
8abd9f785030 merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents: 28009
diff changeset
   492
            actx = self._repo[anccommitnode]
8abd9f785030 merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents: 28009
diff changeset
   493
        else:
8abd9f785030 merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents: 28009
diff changeset
   494
            actx = None
27048
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   495
        fcd = self._filectxorabsent(hash, wctx, dfile)
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   496
        fco = self._filectxorabsent(onode, octx, ofile)
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   497
        # TODO: move this to filectxorabsent
28011
8abd9f785030 merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents: 28009
diff changeset
   498
        fca = self._repo.filectx(afile, fileid=anode, changeid=actx)
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
   499
        # "premerge" x flags
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
   500
        flo = fco.flags()
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
   501
        fla = fca.flags()
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
   502
        if 'x' in flags + flo + fla and 'l' not in flags + flo + fla:
30161
339f9d93daa6 merge: only show "cannot merge flags for %s" warning if flags are different
Mads Kiilerich <madski@unity3d.com>
parents: 30096
diff changeset
   503
            if fca.node() == nullid and flags != flo:
26617
dfd9811c5c9b merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents: 26616
diff changeset
   504
                if preresolve:
dfd9811c5c9b merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents: 26616
diff changeset
   505
                    self._repo.ui.warn(
30162
5cb830801855 merge: clarify warning for (not) merging flags without ancestor
Mads Kiilerich <madski@unity3d.com>
parents: 30161
diff changeset
   506
                        _('warning: cannot merge flags for %s '
5cb830801855 merge: clarify warning for (not) merging flags without ancestor
Mads Kiilerich <madski@unity3d.com>
parents: 30161
diff changeset
   507
                          'without common ancestor - keeping local flags\n')
5cb830801855 merge: clarify warning for (not) merging flags without ancestor
Mads Kiilerich <madski@unity3d.com>
parents: 30161
diff changeset
   508
                        % afile)
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
   509
            elif flags == fla:
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
   510
                flags = flo
26617
dfd9811c5c9b merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents: 26616
diff changeset
   511
        if preresolve:
dfd9811c5c9b merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents: 26616
diff changeset
   512
            # restore local
27048
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   513
            if hash != nullhex:
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   514
                f = self._repo.vfs('merge/' + hash)
33083
05c680ebf512 merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com>
parents: 33082
diff changeset
   515
                wctx[dfile].write(f.read(), flags)
27048
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   516
                f.close()
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   517
            else:
33082
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33081
diff changeset
   518
                wctx[dfile].remove(ignoremissing=True)
34122
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
   519
            complete, r, deleted = filemerge.premerge(self._repo, wctx,
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
   520
                                                      self._local, lfile, fcd,
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
   521
                                                      fco, fca,
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   522
                                                      labels=self._labels)
26617
dfd9811c5c9b merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents: 26616
diff changeset
   523
        else:
34122
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
   524
            complete, r, deleted = filemerge.filemerge(self._repo, wctx,
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
   525
                                                       self._local, lfile, fcd,
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
   526
                                                       fco, fca,
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   527
                                                       labels=self._labels)
13536
fac040b7e822 merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents: 13437
diff changeset
   528
        if r is None:
fac040b7e822 merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents: 13437
diff changeset
   529
            # no real conflict
fac040b7e822 merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents: 13437
diff changeset
   530
            del self._state[dfile]
28009
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
   531
            self._stateextras.pop(dfile, None)
20792
89059c450c56 merge: mark mergestate as dirty when resolve changes _state
Mads Kiilerich <madski@unity3d.com>
parents: 20652
diff changeset
   532
            self._dirty = True
13536
fac040b7e822 merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents: 13437
diff changeset
   533
        elif not r:
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
   534
            self.mark(dfile, 'r')
27035
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
   535
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
   536
        if complete:
27075
6373330155b2 mergestate._resolve: don't return the action any more
Siddharth Agarwal <sid0@fb.com>
parents: 27074
diff changeset
   537
            action = None
27035
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
   538
            if deleted:
27122
77d760ba8dcd mergestate: explicitly forget 'dc' conflicts where the deleted side is picked
Siddharth Agarwal <sid0@fb.com>
parents: 27121
diff changeset
   539
                if fcd.isabsent():
77d760ba8dcd mergestate: explicitly forget 'dc' conflicts where the deleted side is picked
Siddharth Agarwal <sid0@fb.com>
parents: 27121
diff changeset
   540
                    # dc: local picked. Need to drop if present, which may
77d760ba8dcd mergestate: explicitly forget 'dc' conflicts where the deleted side is picked
Siddharth Agarwal <sid0@fb.com>
parents: 27121
diff changeset
   541
                    # happen on re-resolves.
77d760ba8dcd mergestate: explicitly forget 'dc' conflicts where the deleted side is picked
Siddharth Agarwal <sid0@fb.com>
parents: 27121
diff changeset
   542
                    action = 'f'
77d760ba8dcd mergestate: explicitly forget 'dc' conflicts where the deleted side is picked
Siddharth Agarwal <sid0@fb.com>
parents: 27121
diff changeset
   543
                else:
27035
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
   544
                    # cd: remote picked (or otherwise deleted)
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
   545
                    action = 'r'
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
   546
            else:
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
   547
                if fcd.isabsent(): # dc: remote picked
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
   548
                    action = 'g'
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
   549
                elif fco.isabsent(): # cd: local picked
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
   550
                    if dfile in self.localctx:
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
   551
                        action = 'am'
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
   552
                    else:
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
   553
                        action = 'a'
27035
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
   554
                # else: regular merges (no action necessary)
27074
78b0c88ab0db mergestate._resolve: store return code and action for each file
Siddharth Agarwal <sid0@fb.com>
parents: 27049
diff changeset
   555
            self._results[dfile] = r, action
27035
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
   556
26616
2f1fce0d4e86 merge.mergestate._resolve: also return completed status
Siddharth Agarwal <sid0@fb.com>
parents: 26615
diff changeset
   557
        return complete, r
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   558
27048
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   559
    def _filectxorabsent(self, hexnode, ctx, f):
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   560
        if hexnode == nullhex:
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   561
            return filemerge.absentfilectx(ctx, f)
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   562
        else:
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   563
            return ctx[f]
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
   564
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   565
    def preresolve(self, dfile, wctx):
26870
ab798d1a230f merge.mergestate: update docstrings for preresolve and resolve
Siddharth Agarwal <sid0@fb.com>
parents: 26821
diff changeset
   566
        """run premerge process for dfile
ab798d1a230f merge.mergestate: update docstrings for preresolve and resolve
Siddharth Agarwal <sid0@fb.com>
parents: 26821
diff changeset
   567
ab798d1a230f merge.mergestate: update docstrings for preresolve and resolve
Siddharth Agarwal <sid0@fb.com>
parents: 26821
diff changeset
   568
        Returns whether the merge is complete, and the exit code."""
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   569
        return self._resolve(True, dfile, wctx)
26617
dfd9811c5c9b merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents: 26616
diff changeset
   570
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   571
    def resolve(self, dfile, wctx):
26870
ab798d1a230f merge.mergestate: update docstrings for preresolve and resolve
Siddharth Agarwal <sid0@fb.com>
parents: 26821
diff changeset
   572
        """run merge process (assuming premerge was run) for dfile
ab798d1a230f merge.mergestate: update docstrings for preresolve and resolve
Siddharth Agarwal <sid0@fb.com>
parents: 26821
diff changeset
   573
ab798d1a230f merge.mergestate: update docstrings for preresolve and resolve
Siddharth Agarwal <sid0@fb.com>
parents: 26821
diff changeset
   574
        Returns the exit code of the merge."""
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
   575
        return self._resolve(False, dfile, wctx)[1]
26615
c9223a3979b7 merge.mergestate: add a wrapper around resolve
Siddharth Agarwal <sid0@fb.com>
parents: 26611
diff changeset
   576
27076
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   577
    def counts(self):
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   578
        """return counts for updated, merged and removed files in this
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   579
        session"""
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   580
        updated, merged, removed = 0, 0, 0
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   581
        for r, action in self._results.itervalues():
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   582
            if r is None:
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   583
                updated += 1
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   584
            elif r == 0:
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   585
                if action == 'r':
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   586
                    removed += 1
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   587
                else:
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   588
                    merged += 1
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   589
        return updated, merged, removed
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
   590
27077
ca3fbf9dad8c mergestate: add a function to return the number of unresolved files
Siddharth Agarwal <sid0@fb.com>
parents: 27076
diff changeset
   591
    def unresolvedcount(self):
ca3fbf9dad8c mergestate: add a function to return the number of unresolved files
Siddharth Agarwal <sid0@fb.com>
parents: 27076
diff changeset
   592
        """get unresolved count for this merge (persistent)"""
33311
f8f716da90fa mergestate: implement unresolvedcount() in terms of unresolved()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33310
diff changeset
   593
        return len(list(self.unresolved()))
27077
ca3fbf9dad8c mergestate: add a function to return the number of unresolved files
Siddharth Agarwal <sid0@fb.com>
parents: 27076
diff changeset
   594
27079
a88a10a933b2 mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents: 27078
diff changeset
   595
    def actions(self):
a88a10a933b2 mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents: 27078
diff changeset
   596
        """return lists of actions to perform on the dirstate"""
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
   597
        actions = {'r': [], 'f': [], 'a': [], 'am': [], 'g': []}
27079
a88a10a933b2 mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents: 27078
diff changeset
   598
        for f, (r, action) in self._results.iteritems():
a88a10a933b2 mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents: 27078
diff changeset
   599
            if action is not None:
a88a10a933b2 mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents: 27078
diff changeset
   600
                actions[action].append((f, None, "merge result"))
a88a10a933b2 mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents: 27078
diff changeset
   601
        return actions
a88a10a933b2 mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents: 27078
diff changeset
   602
27088
e2b79f57903a mergestate: add a way to record pending dirstate actions
Siddharth Agarwal <sid0@fb.com>
parents: 27087
diff changeset
   603
    def recordactions(self):
e2b79f57903a mergestate: add a way to record pending dirstate actions
Siddharth Agarwal <sid0@fb.com>
parents: 27087
diff changeset
   604
        """record remove/add/get actions in the dirstate"""
e2b79f57903a mergestate: add a way to record pending dirstate actions
Siddharth Agarwal <sid0@fb.com>
parents: 27087
diff changeset
   605
        branchmerge = self._repo.dirstate.p2() != nullid
e2b79f57903a mergestate: add a way to record pending dirstate actions
Siddharth Agarwal <sid0@fb.com>
parents: 27087
diff changeset
   606
        recordupdates(self._repo, self.actions(), branchmerge)
e2b79f57903a mergestate: add a way to record pending dirstate actions
Siddharth Agarwal <sid0@fb.com>
parents: 27087
diff changeset
   607
27090
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   608
    def queueremove(self, f):
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   609
        """queues a file to be removed from the dirstate
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   610
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   611
        Meant for use by custom merge drivers."""
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   612
        self._results[f] = 0, 'r'
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   613
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   614
    def queueadd(self, f):
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   615
        """queues a file to be added to the dirstate
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   616
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   617
        Meant for use by custom merge drivers."""
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   618
        self._results[f] = 0, 'a'
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   619
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   620
    def queueget(self, f):
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   621
        """queues a file to be marked modified in the dirstate
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   622
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   623
        Meant for use by custom merge drivers."""
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   624
        self._results[f] = 0, 'g'
ef6f98473a48 mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents: 27088
diff changeset
   625
27740
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
   626
def _getcheckunknownconfig(repo, section, name):
34522
bed1d2eaa108 configitems: register 'merge.checkunknown' and 'merge.checkignored'
Boris Feld <boris.feld@octobus.net>
parents: 34486
diff changeset
   627
    config = repo.ui.config(section, name)
27740
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
   628
    valid = ['abort', 'ignore', 'warn']
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
   629
    if config not in valid:
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
   630
        validstr = ', '.join(["'" + v + "'" for v in valid])
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
   631
        raise error.ConfigError(_("%s.%s not valid "
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
   632
                                  "('%s' is none of %s)")
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
   633
                                % (section, name, config, validstr))
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
   634
    return config
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
   635
23653
0297d8469350 merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents: 23652
diff changeset
   636
def _checkunknownfile(repo, wctx, mctx, f, f2=None):
0297d8469350 merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents: 23652
diff changeset
   637
    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
   638
        f2 = f
28088
19424f960bf5 checkunknown: audit path before checking if it's a file or link
Durham Goode <durham@fb.com>
parents: 28022
diff changeset
   639
    return (repo.wvfs.audit.check(f)
19424f960bf5 checkunknown: audit path before checking if it's a file or link
Durham Goode <durham@fb.com>
parents: 28022
diff changeset
   640
        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
   641
        and repo.dirstate.normalize(f) not in repo.dirstate
23653
0297d8469350 merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents: 23652
diff changeset
   642
        and mctx[f2].cmp(wctx[f]))
16093
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16092
diff changeset
   643
28020
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
   644
def _checkunknownfiles(repo, wctx, mctx, force, actions, mergeforce):
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   645
    """
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   646
    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
   647
    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
   648
    choose a different action.
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   649
    """
27654
95dc67f10239 _checkunknownfiles: turn 'conflicts' into a set
Siddharth Agarwal <sid0@fb.com>
parents: 27653
diff changeset
   650
    conflicts = set()
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   651
    warnconflicts = set()
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   652
    abortconflicts = set()
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   653
    unknownconfig = _getcheckunknownconfig(repo, 'merge', 'checkunknown')
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   654
    ignoredconfig = _getcheckunknownconfig(repo, 'merge', 'checkignored')
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   655
    if not force:
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   656
        def collectconflicts(conflicts, config):
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   657
            if config == 'abort':
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   658
                abortconflicts.update(conflicts)
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   659
            elif config == 'warn':
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   660
                warnconflicts.update(conflicts)
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   661
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   662
        for f, (m, args, msg) in actions.iteritems():
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   663
            if m in ('c', 'dc'):
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   664
                if _checkunknownfile(repo, wctx, mctx, f):
27654
95dc67f10239 _checkunknownfiles: turn 'conflicts' into a set
Siddharth Agarwal <sid0@fb.com>
parents: 27653
diff changeset
   665
                    conflicts.add(f)
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   666
            elif m == 'dg':
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   667
                if _checkunknownfile(repo, wctx, mctx, f, args[0]):
27654
95dc67f10239 _checkunknownfiles: turn 'conflicts' into a set
Siddharth Agarwal <sid0@fb.com>
parents: 27653
diff changeset
   668
                    conflicts.add(f)
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   669
27742
6b639caa1652 merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents: 27741
diff changeset
   670
        ignoredconflicts = set([c for c in conflicts
6b639caa1652 merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents: 27741
diff changeset
   671
                                if repo.dirstate._ignore(c)])
6b639caa1652 merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents: 27741
diff changeset
   672
        unknownconflicts = conflicts - ignoredconflicts
6b639caa1652 merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents: 27741
diff changeset
   673
        collectconflicts(ignoredconflicts, ignoredconfig)
6b639caa1652 merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents: 27741
diff changeset
   674
        collectconflicts(unknownconflicts, unknownconfig)
28022
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   675
    else:
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   676
        for f, (m, args, msg) in actions.iteritems():
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   677
            if m == 'cm':
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   678
                fl2, anc = args
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   679
                different = _checkunknownfile(repo, wctx, mctx, f)
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   680
                if repo.dirstate._ignore(f):
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   681
                    config = ignoredconfig
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   682
                else:
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   683
                    config = unknownconfig
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   684
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   685
                # The behavior when force is True is described by this table:
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   686
                #  config  different  mergeforce  |    action    backup
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   687
                #    *         n          *       |      get        n
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   688
                #    *         y          y       |     merge       -
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   689
                #   abort      y          n       |     merge       -   (1)
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   690
                #   warn       y          n       |  warn + get     y
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   691
                #  ignore      y          n       |      get        y
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   692
                #
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   693
                # (1) this is probably the wrong behavior here -- we should
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   694
                #     probably abort, but some actions like rebases currently
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   695
                #     don't like an abort happening in the middle of
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   696
                #     merge.update.
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   697
                if not different:
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   698
                    actions[f] = ('g', (fl2, False), "remote created")
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   699
                elif mergeforce or config == 'abort':
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   700
                    actions[f] = ('m', (f, f, None, False, anc),
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   701
                                  "remote differs from untracked local")
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   702
                elif config == 'abort':
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   703
                    abortconflicts.add(f)
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   704
                else:
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   705
                    if config == 'warn':
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   706
                        warnconflicts.add(f)
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
   707
                    actions[f] = ('g', (fl2, True), "remote created")
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
   708
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   709
    for f in sorted(abortconflicts):
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   710
        repo.ui.warn(_("%s: untracked file differs\n") % f)
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   711
    if abortconflicts:
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   712
        raise error.Abort(_("untracked files in working directory "
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   713
                            "differ from files in requested revision"))
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   714
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   715
    for f in sorted(warnconflicts):
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
   716
        repo.ui.warn(_("%s: replacing untracked file\n") % f)
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   717
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   718
    for f, (m, args, msg) in actions.iteritems():
27657
7b5c8c8a2f8c merge: add options to warn or ignore on colliding unknown files
Siddharth Agarwal <sid0@fb.com>
parents: 27656
diff changeset
   719
        backup = f in conflicts
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   720
        if m == 'c':
27655
af13eaf9ab8c merge: add a new 'backup' argument to get actions
Siddharth Agarwal <sid0@fb.com>
parents: 27654
diff changeset
   721
            flags, = args
27657
7b5c8c8a2f8c merge: add options to warn or ignore on colliding unknown files
Siddharth Agarwal <sid0@fb.com>
parents: 27656
diff changeset
   722
            actions[f] = ('g', (flags, backup), msg)
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
   723
6269
ffdf70e74623 merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents: 6268
diff changeset
   724
def _forgetremoved(wctx, mctx, branchmerge):
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   725
    """
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   726
    Forget removed files
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   727
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   728
    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
   729
    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
   730
    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
   731
    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
   732
    manifest.
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   733
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   734
    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
   735
    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
   736
    as removed.
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   737
    """
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   738
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
   739
    actions = {}
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
   740
    m = 'f'
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   741
    if branchmerge:
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
   742
        m = 'r'
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   743
    for f in wctx.deleted():
6272
dd9bd227ae9a merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents: 6271
diff changeset
   744
        if f not in mctx:
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
   745
            actions[f] = m, None, "forget deleted"
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   746
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   747
    if not branchmerge:
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
   748
        for f in wctx.removed():
6272
dd9bd227ae9a merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents: 6271
diff changeset
   749
            if f not in mctx:
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
   750
                actions[f] = 'f', None, "forget removed"
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   751
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
   752
    return actions
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
   753
20640
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
   754
def _checkcollision(repo, wmf, actions):
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   755
    # build provisional merged manifest up
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   756
    pmmf = set(wmf)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   757
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   758
    if actions:
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   759
        # k, dr, e and rd are no-op
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
   760
        for m in 'a', 'am', 'f', 'g', 'cd', 'dc':
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   761
            for f, args, msg in actions[m]:
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   762
                pmmf.add(f)
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   763
        for f, args, msg in actions['r']:
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   764
            pmmf.discard(f)
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   765
        for f, args, msg in actions['dm']:
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   766
            f2, flags = args
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   767
            pmmf.discard(f2)
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   768
            pmmf.add(f)
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   769
        for f, args, msg in actions['dg']:
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   770
            pmmf.add(f)
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   771
        for f, args, msg in actions['m']:
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   772
            f1, f2, fa, move, anc = args
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   773
            if move:
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   774
                pmmf.discard(f1)
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
   775
            pmmf.add(f)
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   776
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   777
    # 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
   778
    foldmap = {}
33808
055fee3547df merge: removed sorting in casefolding detection, for a slight performance win
Alex Gaynor <agaynor@mozilla.com>
parents: 33499
diff changeset
   779
    for f in pmmf:
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   780
        fold = util.normcase(f)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   781
        if fold in foldmap:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26570
diff changeset
   782
            raise error.Abort(_("case-folding collision between %s and %s")
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   783
                             % (f, foldmap[fold]))
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   784
        foldmap[fold] = f
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
   785
26661
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   786
    # check case-folding of directories
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   787
    foldprefix = unfoldprefix = lastfull = ''
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   788
    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
   789
        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
   790
            # the folded prefix matches but actual casing is different
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   791
            raise error.Abort(_("case-folding collision between "
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   792
                                "%s and directory of %s") % (lastfull, f))
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   793
        foldprefix = fold + '/'
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   794
        unfoldprefix = f + '/'
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   795
        lastfull = f
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
   796
26785
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   797
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
   798
    """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
   799
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   800
    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
   801
    return True
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   802
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   803
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
   804
    """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
   805
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   806
    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
   807
    return True
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
   808
27346
ba0da4b7397d merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents: 27345
diff changeset
   809
def manifestmerge(repo, wctx, p2, pa, branchmerge, force, matcher,
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   810
                  acceptremote, followcopies, forcefulldiff=False):
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   811
    """
30096
98d3d8108db0 merge: update doc of manifestmerge() per 18c2184c27dc
Yuya Nishihara <yuya@tcha.org>
parents: 30060
diff changeset
   812
    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
   813
18605
bcf29565d89f manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents: 18544
diff changeset
   814
    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
   815
    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
   816
    acceptremote = accept the incoming changes without prompting
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   817
    """
27346
ba0da4b7397d merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents: 27345
diff changeset
   818
    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
   819
        matcher = None
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   820
30581
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
   821
    copy, movewithdir, diverge, renamedelete, dirmove = {}, {}, {}, {}, {}
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
   822
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   823
    # manifests fetched in order are going to be faster, so prime the caches
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   824
    [x.manifest() for x in
32657
9fbd8ad398aa merge: use scmutil.intrev() to sort ctx objects
Yuya Nishihara <yuya@tcha.org>
parents: 32641
diff changeset
   825
     sorted(wctx.parents() + [p2, pa], key=scmutil.intrev)]
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   826
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
   827
    if followcopies:
18611
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
   828
        ret = copies.mergecopies(repo, wctx, p2, pa)
30581
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
   829
        copy, movewithdir, diverge, renamedelete, dirmove = ret
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
   830
32641
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32612
diff changeset
   831
    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
   832
    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
   833
    boolm = pycompat.bytestr(bool(matcher))
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
   834
    repo.ui.note(_("resolving manifests\n"))
18605
bcf29565d89f manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents: 18544
diff changeset
   835
    repo.ui.debug(" branchmerge: %s, force: %s, partial: %s\n"
32641
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32612
diff changeset
   836
                  % (boolbm, boolf, boolm))
18611
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
   837
    repo.ui.debug(" 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
   838
18611
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
   839
    m1, m2, ma = wctx.manifest(), p2.manifest(), pa.manifest()
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
   840
    copied = set(copy.values())
18134
6c35b53cd28b copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents: 18042
diff changeset
   841
    copied.update(movewithdir.values())
3295
72d1e521da77 merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents: 3292
diff changeset
   842
11470
34e33d50c26b subrepo: correctly handle update -C with modified subrepos (issue2022)
Matt Mackall <mpm@selenic.com>
parents: 11466
diff changeset
   843
    if '.hgsubstate' in m1:
9783
ee00ef6f9be7 submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
   844
        # check whether sub state is modified
28226
377f0d8ff874 merge: use any() instead of for loop when checking for dirty subrepos
Martin von Zweigbergk <martinvonz@google.com>
parents: 28200
diff changeset
   845
        if any(wctx.sub(s).dirty() for s in wctx.substate):
30362
3c6893ba2d36 merge: change modified indicator to be 20 bytes
Durham Goode <durham@fb.com>
parents: 30361
diff changeset
   846
            m1['.hgsubstate'] = modifiednodeid
9783
ee00ef6f9be7 submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
   847
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   848
    # Don't use m2-vs-ma optimization if:
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   849
    # - 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
   850
    # - 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
   851
    #   merge.
32498
bd56bea5ecf8 merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32351
diff changeset
   852
    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
   853
        # 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
   854
        # 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
   855
        # performance benefits in large repositories.
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   856
        relevantfiles = set(ma.diff(m2).keys())
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   857
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   858
        # For copied and moved files, we need to add the source file too.
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   859
        for copykey, copyvalue in copy.iteritems():
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   860
            if copyvalue in relevantfiles:
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   861
                relevantfiles.add(copykey)
32863
9e3733d93f64 py3: replace dict.iterkeys() with iter(dict)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32657
diff changeset
   862
        for movedirkey in movewithdir:
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   863
            relevantfiles.add(movedirkey)
32498
bd56bea5ecf8 merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32351
diff changeset
   864
        filesmatcher = scmutil.matchfiles(repo, relevantfiles)
bd56bea5ecf8 merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32351
diff changeset
   865
        matcher = matchmod.intersectmatchers(matcher, filesmatcher)
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
   866
31257
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31175
diff changeset
   867
    diff = m1.diff(m2, match=matcher)
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31175
diff changeset
   868
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31175
diff changeset
   869
    if matcher is None:
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31175
diff changeset
   870
        matcher = matchmod.always('', '')
18822
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
   871
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   872
    actions = {}
22966
ff93aa006e6a manifest: transpose pair of pairs from diff()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22965
diff changeset
   873
    for f, ((n1, fl1), (n2, fl2)) in diff.iteritems():
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   874
        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
   875
            if f not in ma:
23397
c7c95838be9a merge: break out "both renamed a -> b" case
Martin von Zweigbergk <martinvonz@google.com>
parents: 23396
diff changeset
   876
                fa = copy.get(f, None)
c7c95838be9a merge: break out "both renamed a -> b" case
Martin von Zweigbergk <martinvonz@google.com>
parents: 23396
diff changeset
   877
                if fa is not None:
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   878
                    actions[f] = ('m', (f, f, fa, False, pa.node()),
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   879
                                  "both renamed from " + fa)
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
   880
                else:
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   881
                    actions[f] = ('m', (f, f, None, False, pa.node()),
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   882
                                  "both created")
16094
0776a6cababe merge: don't use unknown()
Matt Mackall <mpm@selenic.com>
parents: 16093
diff changeset
   883
            else:
23396
6a254a2dd37c merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23395
diff changeset
   884
                a = ma[f]
6a254a2dd37c merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23395
diff changeset
   885
                fla = ma.flags(f)
23395
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
   886
                nol = 'l' not in fl1 + fl2 + fla
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
   887
                if n2 == a and fl2 == fla:
34486
a57c938e7ac8 style: never use a space before a colon or comma
Alex Gaynor <agaynor@mozilla.com>
parents: 34479
diff changeset
   888
                    actions[f] = ('k', (), "remote unchanged")
23395
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
   889
                elif n1 == a and fl1 == fla: # local unchanged - use remote
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
   890
                    if n1 == n2: # optimization: keep local content
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   891
                        actions[f] = ('e', (fl2,), "update permissions")
23395
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
   892
                    else:
27655
af13eaf9ab8c merge: add a new 'backup' argument to get actions
Siddharth Agarwal <sid0@fb.com>
parents: 27654
diff changeset
   893
                        actions[f] = ('g', (fl2, False), "remote is newer")
23395
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
   894
                elif nol and n2 == a: # remote only changed 'x'
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   895
                    actions[f] = ('e', (fl2,), "update permissions")
23395
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
   896
                elif nol and n1 == a: # local only changed 'x'
27655
af13eaf9ab8c merge: add a new 'backup' argument to get actions
Siddharth Agarwal <sid0@fb.com>
parents: 27654
diff changeset
   897
                    actions[f] = ('g', (fl1, False), "remote is newer")
23395
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
   898
                else: # both changed something
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   899
                    actions[f] = ('m', (f, f, f, False, pa.node()),
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   900
                                   "versions differ")
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   901
        elif n1: # file exists only on local side
23474
9f4ac44a7273 merge: duplicate 'if f in copied' into each branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23473
diff changeset
   902
            if f in copied:
9f4ac44a7273 merge: duplicate 'if f in copied' into each branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23473
diff changeset
   903
                pass # we'll deal with it on m2 side
9f4ac44a7273 merge: duplicate 'if f in copied' into each branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23473
diff changeset
   904
            elif f in movewithdir: # directory rename, move local
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   905
                f2 = movewithdir[f]
31515
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31475
diff changeset
   906
                if f2 in m2:
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   907
                    actions[f2] = ('m', (f, f2, None, True, pa.node()),
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   908
                                   "remote directory rename, both created")
23475
67f1d68861fb merge: don't ignore conflicting file in remote renamed directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 23474
diff changeset
   909
                else:
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   910
                    actions[f2] = ('dm', (f, fl1),
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   911
                                   "remote directory rename - move from " + f)
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   912
            elif f in copy:
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   913
                f2 = copy[f]
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   914
                actions[f] = ('m', (f, f2, f2, False, pa.node()),
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   915
                              "local copied/moved from " + 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
   916
            elif f in ma: # clean, a different, no remote
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   917
                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
   918
                    if acceptremote:
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   919
                        actions[f] = ('r', None, "remote delete")
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   920
                    else:
26962
fa2daf0e61ab merge: make 'cd' and 'dc' actions store the same arguments as 'm'
Siddharth Agarwal <sid0@fb.com>
parents: 26961
diff changeset
   921
                        actions[f] = ('cd', (f, None, f, False, pa.node()),
fa2daf0e61ab merge: make 'cd' and 'dc' actions store the same arguments as 'm'
Siddharth Agarwal <sid0@fb.com>
parents: 26961
diff changeset
   922
                                      "prompt changed/deleted")
30361
1070df141718 dirstate: change added/modified placeholder hash length to 20 bytes
Durham Goode <durham@fb.com>
parents: 30332
diff changeset
   923
                elif n1 == addednodeid:
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   924
                    # This extra 'a' is added by working copy manifest to mark
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   925
                    # the file as locally added. We should forget it instead of
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   926
                    # deleting it.
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   927
                    actions[f] = ('f', None, "remote deleted")
20639
1df033640a8e merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents: 20620
diff changeset
   928
                else:
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   929
                    actions[f] = ('r', None, "other deleted")
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   930
        elif n2: # file exists only on remote side
23474
9f4ac44a7273 merge: duplicate 'if f in copied' into each branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23473
diff changeset
   931
            if f in copied:
9f4ac44a7273 merge: duplicate 'if f in copied' into each branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23473
diff changeset
   932
                pass # we'll deal with it on m1 side
9f4ac44a7273 merge: duplicate 'if f in copied' into each branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23473
diff changeset
   933
            elif f in movewithdir:
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   934
                f2 = movewithdir[f]
31515
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31475
diff changeset
   935
                if f2 in m1:
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   936
                    actions[f2] = ('m', (f2, f, None, False, pa.node()),
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   937
                                   "local directory rename, both created")
23476
39a12719ec65 merge: don't overwrite conflicting file in locally renamed directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 23475
diff changeset
   938
                else:
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   939
                    actions[f2] = ('dg', (f, fl2),
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   940
                                   "local directory rename - get from " + f)
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   941
            elif f in copy:
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   942
                f2 = copy[f]
31515
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31475
diff changeset
   943
                if f2 in m2:
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   944
                    actions[f] = ('m', (f2, f, f2, False, pa.node()),
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   945
                                  "remote copied from " + 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
   946
                else:
23637
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   947
                    actions[f] = ('m', (f2, f, f2, True, pa.node()),
13f53a2aa342 merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23544
diff changeset
   948
                                  "remote moved from " + 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
   949
            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
   950
                # 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
   951
                # 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
   952
                #
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   953
                # 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
   954
                #   n         *           *      |   create
23650
b85c548ab14d merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents: 23649
diff changeset
   955
                #   y         n           *      |   create
b85c548ab14d merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents: 23649
diff changeset
   956
                #   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
   957
                #   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
   958
                #
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   959
                # 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
   960
                # 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
   961
                if not force:
23651
72da02d7f126 merge: collect checking for unknown files at end of manifestmerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23650
diff changeset
   962
                    actions[f] = ('c', (fl2,), "remote created")
23649
18ab5e5955df merge: structure 'remote created' code to match table
Martin von Zweigbergk <martinvonz@google.com>
parents: 23641
diff changeset
   963
                elif not branchmerge:
23650
b85c548ab14d merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents: 23649
diff changeset
   964
                    actions[f] = ('c', (fl2,), "remote created")
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   965
                else:
23654
9d56be47b5d6 merge: create 'cm' action for 'get or merge' case
Martin von Zweigbergk <martinvonz@google.com>
parents: 23653
diff changeset
   966
                    actions[f] = ('cm', (fl2, pa.node()),
9d56be47b5d6 merge: create 'cm' action for 'get or merge' case
Martin von Zweigbergk <martinvonz@google.com>
parents: 23653
diff changeset
   967
                                  "remote created, get or merge")
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
   968
            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
   969
                df = None
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
   970
                for d in dirmove:
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
   971
                    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
   972
                        # new file added in a directory that was moved
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
   973
                        df = dirmove[d] + f[len(d):]
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
   974
                        break
31515
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31475
diff changeset
   975
                if df is not None and df in m1:
30581
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
   976
                    actions[df] = ('m', (df, f, f, False, pa.node()),
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
   977
                            "local directory rename - respect move from " + f)
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30519
diff changeset
   978
                elif acceptremote:
23651
72da02d7f126 merge: collect checking for unknown files at end of manifestmerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23650
diff changeset
   979
                    actions[f] = ('c', (fl2,), "remote recreating")
18606
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
   980
                else:
26962
fa2daf0e61ab merge: make 'cd' and 'dc' actions store the same arguments as 'm'
Siddharth Agarwal <sid0@fb.com>
parents: 26961
diff changeset
   981
                    actions[f] = ('dc', (None, f, f, False, pa.node()),
fa2daf0e61ab merge: make 'cd' and 'dc' actions store the same arguments as 'm'
Siddharth Agarwal <sid0@fb.com>
parents: 26961
diff changeset
   982
                                  "prompt deleted/changed")
23651
72da02d7f126 merge: collect checking for unknown files at end of manifestmerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23650
diff changeset
   983
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
   984
    return actions, diverge, renamedelete
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
   985
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
   986
def _resolvetrivial(repo, wctx, mctx, ancestor, actions):
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
   987
    """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
   988
       remained the same."""
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
   989
23639
35c724903157 merge: let _resolvetrivial() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23638
diff changeset
   990
    for f, (m, args, msg) in actions.items():
35c724903157 merge: let _resolvetrivial() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23638
diff changeset
   991
        if m == 'cd' and 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
   992
            # local did change but ended up with same content
23639
35c724903157 merge: let _resolvetrivial() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23638
diff changeset
   993
            actions[f] = 'r', None, "prompt same"
35c724903157 merge: let _resolvetrivial() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23638
diff changeset
   994
        elif m == 'dc' and 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
   995
            # remote did change but ended up with same content
23639
35c724903157 merge: let _resolvetrivial() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23638
diff changeset
   996
            del actions[f] # don't get = keep local deleted
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
   997
27345
98266b1d144d merge: restate calculateupdates in terms of a matcher
Augie Fackler <augie@google.com>
parents: 27344
diff changeset
   998
def calculateupdates(repo, wctx, mctx, ancestors, branchmerge, force,
28020
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
   999
                     acceptremote, followcopies, matcher=None,
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
  1000
                     mergeforce=False):
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1001
    """Calculate the actions needed to merge mctx into wctx using ancestors"""
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1002
    # Avoid cycle.
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1003
    from . import sparse
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1004
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1005
    if len(ancestors) == 1: # default
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
  1006
        actions, diverge, renamedelete = manifestmerge(
27346
ba0da4b7397d merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents: 27345
diff changeset
  1007
            repo, wctx, mctx, ancestors[0], branchmerge, force, matcher,
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
  1008
            acceptremote, followcopies)
28020
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
  1009
        _checkunknownfiles(repo, wctx, mctx, force, actions, mergeforce)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1010
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1011
    else: # only when merge.preferancestor=* - the default
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1012
        repo.ui.note(
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1013
            _("note: merging %s and %s using bids from ancestors %s\n") %
34349
6f49ea88d984 py3: use pycompat.bytestr instead of str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34348
diff changeset
  1014
            (wctx, mctx, _(' and ').join(pycompat.bytestr(anc)
6f49ea88d984 py3: use pycompat.bytestr instead of str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34348
diff changeset
  1015
                                            for anc in ancestors)))
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1016
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1017
        # Call for bids
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1018
        fbids = {} # mapping filename to bids (action method to list af actions)
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
  1019
        diverge, renamedelete = None, None
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1020
        for ancestor in ancestors:
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1021
            repo.ui.note(_('\ncalculating bids for ancestor %s\n') % ancestor)
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
  1022
            actions, diverge1, renamedelete1 = manifestmerge(
27346
ba0da4b7397d merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents: 27345
diff changeset
  1023
                repo, wctx, mctx, ancestor, branchmerge, force, matcher,
32151
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31646
diff changeset
  1024
                acceptremote, followcopies, forcefulldiff=True)
28020
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
  1025
            _checkunknownfiles(repo, wctx, mctx, force, actions, mergeforce)
26318
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
  1026
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
  1027
            # 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
  1028
            # merge will correctly incorporate more information
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
  1029
            if diverge is None or len(diverge1) < len(diverge):
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
  1030
                diverge = diverge1
26318
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
  1031
            if renamedelete is None or len(renamedelete) < len(renamedelete1):
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
  1032
                renamedelete = renamedelete1
26318
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
  1033
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1034
            for f, a in sorted(actions.iteritems()):
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1035
                m, args, msg = a
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1036
                repo.ui.debug(' %s: %s -> %s\n' % (f, msg, m))
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1037
                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
  1038
                    d = fbids[f]
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1039
                    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
  1040
                        d[m].append(a)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1041
                    else:
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1042
                        d[m] = [a]
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1043
                else:
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1044
                    fbids[f] = {m: [a]}
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1045
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1046
        # Pick the best bid for each file
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1047
        repo.ui.note(_('\nauction for merging merge bids\n'))
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1048
        actions = {}
30856
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1049
        dms = [] # filenames that have dm actions
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1050
        for f, bids in sorted(fbids.items()):
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1051
            # 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
  1052
            # Consensus?
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1053
            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
  1054
                m, l = list(bids.items())[0]
25151
6eb4bdad198f cleanup: use __builtins__.all instead of util.all
Augie Fackler <augie@google.com>
parents: 24881
diff changeset
  1055
                if all(a == l[0] for a in l[1:]): # len(bids) is > 1
29242
4d075bf28702 merge: make messages translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29216
diff changeset
  1056
                    repo.ui.note(_(" %s: consensus for %s\n") % (f, m))
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1057
                    actions[f] = l[0]
30856
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1058
                    if m == 'dm':
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1059
                        dms.append(f)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1060
                    continue
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1061
            # If keep is an option, just do it.
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1062
            if 'k' in bids:
29242
4d075bf28702 merge: make messages translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29216
diff changeset
  1063
                repo.ui.note(_(" %s: picking 'keep' action\n") % f)
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1064
                actions[f] = bids['k'][0]
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1065
                continue
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1066
            # If there are gets and they all agree [how could they not?], do it.
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1067
            if 'g' in bids:
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1068
                ga0 = bids['g'][0]
25151
6eb4bdad198f cleanup: use __builtins__.all instead of util.all
Augie Fackler <augie@google.com>
parents: 24881
diff changeset
  1069
                if all(a == ga0 for a in bids['g'][1:]):
29242
4d075bf28702 merge: make messages translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29216
diff changeset
  1070
                    repo.ui.note(_(" %s: picking 'get' action\n") % f)
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1071
                    actions[f] = ga0
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1072
                    continue
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1073
            # 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
  1074
            # Handle inefficient democrazy.
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1075
            repo.ui.note(_(' %s: multiple bids for merge action:\n') % f)
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1076
            for m, l in sorted(bids.items()):
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1077
                for _f, args, msg in l:
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1078
                    repo.ui.note('  %s -> %s\n' % (msg, m))
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1079
            # 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
  1080
            m, l = list(bids.items())[0]
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1081
            repo.ui.warn(_(' %s: ambiguous merge - picked %s action\n') %
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1082
                         (f, m))
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
  1083
            actions[f] = l[0]
30856
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1084
            if m == 'dm':
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1085
                dms.append(f)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1086
            continue
30856
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1087
        # Work around 'dm' that can cause multiple actions for the same file
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1088
        for f in dms:
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1089
            dm, (f0, flags), msg = actions[f]
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1090
            assert dm == 'dm', dm
30859
086c37652735 merge: more safe detection of criss cross merge conflict between dm and r
Mads Kiilerich <mads@kiilerich.com>
parents: 30856
diff changeset
  1091
            if f0 in actions and actions[f0][0] == 'r':
30856
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1092
                # We have one bid for removing a file and another for moving it.
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1093
                # These two could be merged as first move and then delete ...
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1094
                # but instead drop moving and just delete.
41f6af50c0d8 merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents: 30581
diff changeset
  1095
                del actions[f]
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1096
        repo.ui.note(_('end of auction\n\n'))
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1097
23639
35c724903157 merge: let _resolvetrivial() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23638
diff changeset
  1098
    _resolvetrivial(repo, wctx, mctx, ancestors[0], actions)
35c724903157 merge: let _resolvetrivial() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23638
diff changeset
  1099
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
  1100
    if wctx.rev() is None:
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
  1101
        fractions = _forgetremoved(wctx, mctx, branchmerge)
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
  1102
        actions.update(fractions)
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
  1103
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1104
    prunedactions = sparse.filterupdatesactions(repo, wctx, mctx, branchmerge,
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1105
                                                actions)
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1106
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
  1107
    return prunedactions, diverge, renamedelete
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
  1108
34142
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1109
def _getcwd():
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1110
    try:
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1111
        return pycompat.getcwd()
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1112
    except OSError as err:
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1113
        if err.errno == errno.ENOENT:
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1114
            return None
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1115
        raise
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1116
33081
6582dc01aca3 merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com>
parents: 32863
diff changeset
  1117
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
  1118
    """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
  1119
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1120
    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
  1121
    """
18640
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
  1122
    verbose = repo.ui.verbose
34142
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1123
    cwd = _getcwd()
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
  1124
    i = 0
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
  1125
    for f, args, msg in actions:
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1126
        repo.ui.debug(" %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
  1127
        if verbose:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1128
            repo.ui.note(_("removing %s\n") % f)
33086
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  1129
        wctx[f].audit()
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1130
        try:
33082
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33081
diff changeset
  1131
            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
  1132
        except OSError as inst:
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1133
            repo.ui.warn(_("update failed to remove %s: %s!\n") %
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1134
                         (f, inst.strerror))
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1135
        if i == 100:
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1136
            yield i, f
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1137
            i = 0
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1138
        i += 1
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1139
    if i > 0:
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1140
        yield i, f
34142
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1141
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1142
    if cwd and not _getcwd():
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1143
        # 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
  1144
        # warning.
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1145
        repo.ui.warn(_("current directory was removed\n"
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34125
diff changeset
  1146
                       "(consider changing to repo root: %s)\n") % repo.root)
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1147
34124
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1148
    # It's necessary to flush here in case we're inside a worker fork and will
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1149
    # quit after this function.
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1150
    wctx.flushall()
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1151
33081
6582dc01aca3 merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com>
parents: 32863
diff changeset
  1152
def batchget(repo, mctx, wctx, actions):
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1153
    """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
  1154
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1155
    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
  1156
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1157
    yields tuples for progress updates
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1158
    """
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1159
    verbose = repo.ui.verbose
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1160
    fctx = mctx.filectx
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
  1161
    ui = repo.ui
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
  1162
    i = 0
28200
588695ccbb22 merge: perform background file closing in batchget
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28199
diff changeset
  1163
    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
  1164
        for f, (flags, backup), msg in actions:
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1165
            repo.ui.debug(" %s: %s -> g\n" % (f, msg))
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1166
            if verbose:
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1167
                repo.ui.note(_("getting %s\n") % f)
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
  1168
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1169
            if backup:
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1170
                absf = repo.wjoin(f)
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1171
                orig = scmutil.origpath(ui, repo, absf)
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1172
                try:
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1173
                    if repo.wvfs.isfileorlink(f):
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1174
                        util.rename(absf, orig)
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1175
                except OSError as e:
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1176
                    if e.errno != errno.ENOENT:
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1177
                        raise
34037
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 33808
diff changeset
  1178
            wctx[f].clearunknown()
33085
1e79c66d6b07 workingfilectx: add backgroundclose as a kwarg to write()
Phil Cohen <phillco@fb.com>
parents: 33084
diff changeset
  1179
            wctx[f].write(fctx(f).data(), flags, backgroundclose=True)
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1180
            if i == 100:
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1181
                yield i, f
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1182
                i = 0
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
  1183
            i += 1
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
  1184
    if i > 0:
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1185
        yield i, f
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1186
34124
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1187
    # It's necessary to flush here in case we're inside a worker fork and will
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1188
    # quit after this function.
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1189
    wctx.flushall()
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1190
21524
47b97d9af27e merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents: 21392
diff changeset
  1191
def applyupdates(repo, actions, wctx, mctx, overwrite, labels=None):
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1192
    """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
  1193
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1194
    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
  1195
    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
  1196
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
  1197
    Return a tuple of counts (updated, merged, removed, unresolved) that
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
  1198
    describes how many files were affected by the update.
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
  1199
    """
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1200
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1201
    updated, merged, removed = 0, 0, 0
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
  1202
    ms = mergestate.clean(repo, wctx.p1().node(), mctx.node(), labels)
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1203
    moves = []
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
  1204
    for m, l in actions.items():
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
  1205
        l.sort()
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1206
27137
25e4b2f000c5 merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents: 27132
diff changeset
  1207
    # 'cd' and 'dc' actions are treated like other merge conflicts
25e4b2f000c5 merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents: 27132
diff changeset
  1208
    mergeactions = sorted(actions['cd'])
25e4b2f000c5 merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents: 27132
diff changeset
  1209
    mergeactions.extend(sorted(actions['dc']))
25e4b2f000c5 merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents: 27132
diff changeset
  1210
    mergeactions.extend(actions['m'])
25e4b2f000c5 merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents: 27132
diff changeset
  1211
    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
  1212
        f1, f2, fa, move, anc = args
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1213
        if f == '.hgsubstate': # merged internally
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1214
            continue
27091
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1215
        if f1 is None:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1216
            fcl = filemerge.absentfilectx(wctx, fa)
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1217
        else:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1218
            repo.ui.debug(" preserving %s for resolve of %s\n" % (f1, f))
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1219
            fcl = wctx[f1]
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1220
        if f2 is None:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1221
            fco = filemerge.absentfilectx(mctx, fa)
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1222
        else:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1223
            fco = mctx[f2]
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1224
        actx = repo[anc]
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1225
        if fa in actx:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1226
            fca = actx[fa]
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1227
        else:
27091
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
  1228
            # TODO: move to absentfilectx
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1229
            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
  1230
        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
  1231
        if f1 != f and move:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1232
            moves.append(f1)
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1233
21390
26b84128c54d merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents: 21389
diff changeset
  1234
    _updating = _('updating')
26b84128c54d merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents: 21389
diff changeset
  1235
    _files = _('files')
26b84128c54d merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents: 21389
diff changeset
  1236
    progress = repo.ui.progress
14398
ae1f7a5373e8 applyupdates: audit unlinking of renamed files and directories
Adrian Buehlmann <adrian@cadifra.com>
parents: 14232
diff changeset
  1237
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1238
    # remove renamed files after safely stored
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
  1239
    for f in moves:
33283
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33146
diff changeset
  1240
        if wctx[f].lexists():
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9048
diff changeset
  1241
            repo.ui.debug("removing %s\n" % f)
33086
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  1242
            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
  1243
            wctx[f].remove()
5042
f191bc3916f7 merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents: 4997
diff changeset
  1244
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
  1245
    numupdates = sum(len(l) for m, l in actions.items() if m != 'k')
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1246
    z = 0
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1247
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
  1248
    if [a for a in actions['r'] if a[0] == '.hgsubstate']:
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29889
diff changeset
  1249
        subrepo.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
  1250
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1251
    # record path conflicts
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1252
    for f, args, msg in actions['p']:
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1253
        f1, fo = args
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1254
        s = repo.ui.status
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1255
        s(_("%s: path conflict - a file or link has the same name as a "
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1256
            "directory\n") % f)
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1257
        if fo == 'l':
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1258
            s(_("the local file has been renamed to %s\n") % f1)
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1259
        else:
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1260
            s(_("the remote file has been renamed to %s\n") % f1)
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1261
        s(_("resolve manually then use 'hg resolve --mark %s'\n") % f)
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1262
        ms.addpath(f, f1, fo)
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1263
        z += 1
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1264
        progress(_updating, z, item=f, total=numupdates, unit=_files)
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1265
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1266
    # remove in parallel (must come before resolving path conflicts and getting)
33081
6582dc01aca3 merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com>
parents: 32863
diff changeset
  1267
    prog = worker.worker(repo.ui, 0.001, batchremove, (repo, wctx),
6582dc01aca3 merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com>
parents: 32863
diff changeset
  1268
                         actions['r'])
19095
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
  1269
    for i, item in prog:
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
  1270
        z += i
21390
26b84128c54d merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents: 21389
diff changeset
  1271
        progress(_updating, z, item=item, total=numupdates, unit=_files)
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
  1272
    removed = len(actions['r'])
21390
26b84128c54d merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents: 21389
diff changeset
  1273
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1274
    # resolve path conflicts (must come before getting)
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1275
    for f, args, msg in actions['pr']:
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1276
        repo.ui.debug(" %s: %s -> pr\n" % (f, msg))
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1277
        f0, = args
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1278
        if wctx[f0].lexists():
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1279
            repo.ui.note(_("moving %s to %s\n") % (f0, f))
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1280
            wctx[f].audit()
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1281
            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
  1282
            wctx[f0].remove()
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1283
        z += 1
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1284
        progress(_updating, z, item=f, total=numupdates, unit=_files)
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1285
34124
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1286
    # We should flush before forking into worker processes, since those workers
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1287
    # flush when they complete, and we don't want to duplicate work.
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1288
    wctx.flushall()
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34122
diff changeset
  1289
21390
26b84128c54d merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents: 21389
diff changeset
  1290
    # get in parallel
33081
6582dc01aca3 merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com>
parents: 32863
diff changeset
  1291
    prog = worker.worker(repo.ui, 0.001, batchget, (repo, mctx, wctx),
6582dc01aca3 merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com>
parents: 32863
diff changeset
  1292
                         actions['g'])
18639
5774732bb5e5 merge: apply non-interactive working dir updates in parallel
Bryan O'Sullivan <bryano@fb.com>
parents: 18633
diff changeset
  1293
    for i, item in prog:
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
  1294
        z += i
21390
26b84128c54d merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents: 21389
diff changeset
  1295
        progress(_updating, z, item=item, total=numupdates, unit=_files)
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
  1296
    updated = len(actions['g'])
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
  1297
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
  1298
    if [a for a in actions['g'] if a[0] == '.hgsubstate']:
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29889
diff changeset
  1299
        subrepo.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
  1300
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1301
    # forget (manifest only, just log it) (must come first)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1302
    for f, args, msg in actions['f']:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1303
        repo.ui.debug(" %s: %s -> f\n" % (f, msg))
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1304
        z += 1
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1305
        progress(_updating, z, item=f, total=numupdates, unit=_files)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1306
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1307
    # re-add (manifest only, just log it)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1308
    for f, args, msg in actions['a']:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1309
        repo.ui.debug(" %s: %s -> a\n" % (f, msg))
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1310
        z += 1
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1311
        progress(_updating, z, item=f, total=numupdates, unit=_files)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1312
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1313
    # re-add/mark as modified (manifest only, just log it)
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1314
    for f, args, msg in actions['am']:
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1315
        repo.ui.debug(" %s: %s -> am\n" % (f, msg))
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1316
        z += 1
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1317
        progress(_updating, z, item=f, total=numupdates, unit=_files)
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1318
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1319
    # keep (noop, just log it)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1320
    for f, args, msg in actions['k']:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1321
        repo.ui.debug(" %s: %s -> k\n" % (f, msg))
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1322
        # no progress
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1323
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1324
    # directory rename, move local
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1325
    for f, args, msg in actions['dm']:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1326
        repo.ui.debug(" %s: %s -> dm\n" % (f, msg))
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1327
        z += 1
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1328
        progress(_updating, z, item=f, total=numupdates, unit=_files)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1329
        f0, flags = args
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1330
        repo.ui.note(_("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
  1331
        wctx[f].audit()
33083
05c680ebf512 merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com>
parents: 33082
diff changeset
  1332
        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
  1333
        wctx[f0].remove()
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1334
        updated += 1
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1335
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1336
    # local directory rename, get
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1337
    for f, args, msg in actions['dg']:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1338
        repo.ui.debug(" %s: %s -> dg\n" % (f, msg))
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1339
        z += 1
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1340
        progress(_updating, z, item=f, total=numupdates, unit=_files)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1341
        f0, flags = args
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1342
        repo.ui.note(_("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
  1343
        wctx[f].write(mctx.filectx(f0).data(), flags)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1344
        updated += 1
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1345
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1346
    # exec
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1347
    for f, args, msg in actions['e']:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1348
        repo.ui.debug(" %s: %s -> e\n" % (f, msg))
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1349
        z += 1
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1350
        progress(_updating, z, item=f, total=numupdates, unit=_files)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1351
        flags, = args
33086
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  1352
        wctx[f].audit()
33084
873f638fd7db merge: change repo.wvfs.setflags calls to a new wctx[f].setflags function
Phil Cohen <phillco@fb.com>
parents: 33083
diff changeset
  1353
        wctx[f].setflags('l' in flags, 'x' in flags)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1354
        updated += 1
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1355
26786
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1356
    # 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
  1357
    # 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
  1358
    # True
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1359
    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
  1360
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1361
    if usemergedriver:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1362
        ms.commit()
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1363
        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
  1364
        # 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
  1365
        unresolvedf = set(ms.unresolved())
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1366
        if not proceed:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1367
            # 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
  1368
            # error out
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1369
            return updated, merged, removed, max(len(unresolvedf), 1)
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1370
        newactions = []
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1371
        for f, args, msg in mergeactions:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1372
            if f in unresolvedf:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1373
                newactions.append((f, args, msg))
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1374
        mergeactions = newactions
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
  1375
26618
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
  1376
    # premerge
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
  1377
    tocomplete = []
26949
b639b2f186bf merge.applyupdates: only attempt to merge files in mergeactions
Siddharth Agarwal <sid0@fb.com>
parents: 26870
diff changeset
  1378
    for f, args, msg in mergeactions:
26618
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
  1379
        repo.ui.debug(" %s: %s -> m (premerge)\n" % (f, msg))
26292
007ac1acfcac merge: move merge step to the end
Siddharth Agarwal <sid0@fb.com>
parents: 25959
diff changeset
  1380
        z += 1
007ac1acfcac merge: move merge step to the end
Siddharth Agarwal <sid0@fb.com>
parents: 25959
diff changeset
  1381
        progress(_updating, z, item=f, total=numupdates, unit=_files)
007ac1acfcac merge: move merge step to the end
Siddharth Agarwal <sid0@fb.com>
parents: 25959
diff changeset
  1382
        if f == '.hgsubstate': # subrepo states need updating
007ac1acfcac merge: move merge step to the end
Siddharth Agarwal <sid0@fb.com>
parents: 25959
diff changeset
  1383
            subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx),
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29889
diff changeset
  1384
                             overwrite, labels)
26292
007ac1acfcac merge: move merge step to the end
Siddharth Agarwal <sid0@fb.com>
parents: 25959
diff changeset
  1385
            continue
33086
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  1386
        wctx[f].audit()
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
  1387
        complete, r = ms.preresolve(f, wctx)
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1388
        if not complete:
26618
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
  1389
            numupdates += 1
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
  1390
            tocomplete.append((f, args, msg))
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
  1391
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
  1392
    # merge
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
  1393
    for f, args, msg in tocomplete:
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
  1394
        repo.ui.debug(" %s: %s -> m (merge)\n" % (f, msg))
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
  1395
        z += 1
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
  1396
        progress(_updating, z, item=f, total=numupdates, unit=_files)
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
  1397
        ms.resolve(f, wctx)
26292
007ac1acfcac merge: move merge step to the end
Siddharth Agarwal <sid0@fb.com>
parents: 25959
diff changeset
  1398
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
  1399
    ms.commit()
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1400
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1401
    unresolved = ms.unresolvedcount()
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1402
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1403
    if usemergedriver and not unresolved and ms.mdstate() != 's':
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1404
        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
  1405
            # 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
  1406
            # 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
  1407
            unresolved = max(unresolved, 1)
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1408
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1409
        ms.commit()
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
  1410
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1411
    msupdated, msmerged, msremoved = ms.counts()
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1412
    updated += msupdated
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1413
    merged += msmerged
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
  1414
    removed += msremoved
27080
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
  1415
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
  1416
    extraactions = ms.actions()
29831
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1417
    if extraactions:
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1418
        mfiles = set(a[0] for a in actions['m'])
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1419
        for k, acts in extraactions.iteritems():
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1420
            actions[k].extend(acts)
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1421
            # Remove these files from actions['m'] as well. This is important
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1422
            # because in recordupdates, files in actions['m'] are processed
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1423
            # after files in other actions, and the merge driver might add
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1424
            # files to those actions via extraactions above. This can lead to a
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1425
            # file being recorded twice, with poor results. This is especially
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1426
            # problematic for actions['r'] (currently only possible with the
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1427
            # merge driver in the initial merge process; interrupted merges
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1428
            # don't go through this flow).
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1429
            #
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1430
            # 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
  1431
            # 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
  1432
            # 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
  1433
            # 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
  1434
            #
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1435
            # 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
  1436
            # 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
  1437
            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
  1438
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29775
diff changeset
  1439
        actions['m'] = [a for a in actions['m'] if a[0] in mfiles]
27080
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
  1440
18640
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
  1441
    progress(_updating, None, total=numupdates, unit=_files)
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
  1442
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
  1443
    return updated, merged, removed, unresolved
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
  1444
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
  1445
def recordupdates(repo, actions, branchmerge):
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1446
    "record merge actions to the dirstate"
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1447
    # remove (must come first)
27087
98fc58378a3f merge.recordupdates: don't require action keys to be present in dict
Siddharth Agarwal <sid0@fb.com>
parents: 27080
diff changeset
  1448
    for f, args, msg in actions.get('r', []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1449
        if branchmerge:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1450
            repo.dirstate.remove(f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1451
        else:
21389
e741972017d9 merge: change priority / ordering of merge actions
Mads Kiilerich <madski@unity3d.com>
parents: 21269
diff changeset
  1452
            repo.dirstate.drop(f)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1453
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1454
    # forget (must come first)
27087
98fc58378a3f merge.recordupdates: don't require action keys to be present in dict
Siddharth Agarwal <sid0@fb.com>
parents: 27080
diff changeset
  1455
    for f, args, msg in actions.get('f', []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1456
        repo.dirstate.drop(f)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1457
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1458
    # resolve path conflicts
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1459
    for f, args, msg in actions.get('pr', []):
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1460
        f0, = args
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1461
        origf0 = repo.dirstate.copied(f0) or f0
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1462
        repo.dirstate.add(f)
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1463
        repo.dirstate.copy(origf0, f)
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1464
        if f0 == origf0:
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1465
            repo.dirstate.remove(f0)
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1466
        else:
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1467
            repo.dirstate.drop(f0)
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1468
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1469
    # re-add
27087
98fc58378a3f merge.recordupdates: don't require action keys to be present in dict
Siddharth Agarwal <sid0@fb.com>
parents: 27080
diff changeset
  1470
    for f, args, msg in actions.get('a', []):
27132
baa7571f40c5 merge.recordupdates: mark 'a' files as added unconditionally
Siddharth Agarwal <sid0@fb.com>
parents: 27131
diff changeset
  1471
        repo.dirstate.add(f)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1472
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1473
    # re-add/mark as modified
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1474
    for f, args, msg in actions.get('am', []):
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1475
        if branchmerge:
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1476
            repo.dirstate.normallookup(f)
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
  1477
        else:
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1478
            repo.dirstate.add(f)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1479
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1480
    # exec change
27087
98fc58378a3f merge.recordupdates: don't require action keys to be present in dict
Siddharth Agarwal <sid0@fb.com>
parents: 27080
diff changeset
  1481
    for f, args, msg in actions.get('e', []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1482
        repo.dirstate.normallookup(f)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1483
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1484
    # keep
27087
98fc58378a3f merge.recordupdates: don't require action keys to be present in dict
Siddharth Agarwal <sid0@fb.com>
parents: 27080
diff changeset
  1485
    for f, args, msg in actions.get('k', []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1486
        pass
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1487
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1488
    # get
27087
98fc58378a3f merge.recordupdates: don't require action keys to be present in dict
Siddharth Agarwal <sid0@fb.com>
parents: 27080
diff changeset
  1489
    for f, args, msg in actions.get('g', []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1490
        if branchmerge:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1491
            repo.dirstate.otherparent(f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1492
        else:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1493
            repo.dirstate.normal(f)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1494
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1495
    # merge
27087
98fc58378a3f merge.recordupdates: don't require action keys to be present in dict
Siddharth Agarwal <sid0@fb.com>
parents: 27080
diff changeset
  1496
    for f, args, msg in actions.get('m', []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1497
        f1, f2, fa, move, anc = args
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1498
        if branchmerge:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1499
            # We've done a branch merge, mark this file as merged
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1500
            # so that we properly record the merger later
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1501
            repo.dirstate.merge(f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1502
            if f1 != f2: # copy/rename
3308
ecc1bf27378c merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents: 3307
diff changeset
  1503
                if move:
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1504
                    repo.dirstate.remove(f1)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1505
                if f1 != f:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1506
                    repo.dirstate.copy(f1, f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1507
                else:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1508
                    repo.dirstate.copy(f2, f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1509
        else:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1510
            # We've update-merged a locally modified file, so
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1511
            # we set the dirstate to emulate a normal checkout
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1512
            # of that file some time in the past. Thus our
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1513
            # merge will appear as a normal local file
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1514
            # modification.
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1515
            if f2 == f: # file not locally copied/moved
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1516
                repo.dirstate.normallookup(f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1517
            if move:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1518
                repo.dirstate.drop(f1)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1519
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1520
    # directory rename, move local
27087
98fc58378a3f merge.recordupdates: don't require action keys to be present in dict
Siddharth Agarwal <sid0@fb.com>
parents: 27080
diff changeset
  1521
    for f, args, msg in actions.get('dm', []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1522
        f0, flag = args
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1523
        if branchmerge:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1524
            repo.dirstate.add(f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1525
            repo.dirstate.remove(f0)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1526
            repo.dirstate.copy(f0, f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1527
        else:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1528
            repo.dirstate.normal(f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1529
            repo.dirstate.drop(f0)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
  1530
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1531
    # directory rename, get
27087
98fc58378a3f merge.recordupdates: don't require action keys to be present in dict
Siddharth Agarwal <sid0@fb.com>
parents: 27080
diff changeset
  1532
    for f, args, msg in actions.get('dg', []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1533
        f0, flag = args
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1534
        if branchmerge:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1535
            repo.dirstate.add(f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1536
            repo.dirstate.copy(f0, f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1537
        else:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
  1538
            repo.dirstate.normal(f)
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
  1539
27344
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27316
diff changeset
  1540
def update(repo, node, branchmerge, force, ancestor=None,
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1541
           mergeancestor=False, labels=None, matcher=None, mergeforce=False,
34302
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1542
           updatecheck=None, wc=None):
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1543
    """
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1544
    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
  1545
30902
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30901
diff changeset
  1546
    node = the node to update to
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1547
    branchmerge = whether to merge between branches
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1548
    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
  1549
    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
  1550
    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
  1551
      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
  1552
      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
  1553
      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
  1554
      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
  1555
    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
  1556
    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
  1557
      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
  1558
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
  1559
    The table below shows all the behaviors of the update command
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
  1560
    given the -c and -C or no options, whether the working directory
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
  1561
    is dirty, whether a revision is specified, and the relationship of
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1562
    the parent rev to the target rev (linear or not). Match from top first. The
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1563
    -n option doesn't exist on the command line, but represents the
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1564
    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
  1565
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 12032
diff changeset
  1566
    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
  1567
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1568
    -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
  1569
     y   y   *   *    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1570
     y   *   y   *    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1571
     y   *   *   y    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1572
     *   y   y   *    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1573
     *   y   *   y    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1574
     *   *   y   y    *     *     *     |    (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1575
     *   *   *   *    *     n     n     |     x
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1576
     *   *   *   *    n     *     *     |    ok
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1577
     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
  1578
     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
  1579
     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
  1580
     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
  1581
     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
  1582
     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
  1583
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
  1584
    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
  1585
    * = don't-care
31161
351207bfdde9 merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents: 31160
diff changeset
  1586
    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
  1587
    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
  1588
    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
  1589
34302
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1590
    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
  1591
    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
  1592
13162
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
  1593
    Return the same tuple as applyupdates().
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
  1594
    """
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1595
    # Avoid cycle.
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1596
    from . import sparse
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
  1597
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1598
    # 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
  1599
    # 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
  1600
    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
  1601
    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
  1602
        # 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
  1603
        # 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
  1604
        # 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
  1605
        if updatecheck is None:
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1606
            updatecheck = 'linear'
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1607
        assert updatecheck in ('none', 'linear', 'noconflict')
27344
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27316
diff changeset
  1608
    # If we're doing a partial update, we need to skip updating
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27316
diff changeset
  1609
    # the dirstate, so make a note of any partial-ness to the
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27316
diff changeset
  1610
    # update here.
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27316
diff changeset
  1611
    if matcher is None or matcher.always():
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27316
diff changeset
  1612
        partial = False
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27316
diff changeset
  1613
    else:
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27316
diff changeset
  1614
        partial = True
27852
a33c1c9e769c with: use context manager in merge update
Bryan O'Sullivan <bryano@fb.com>
parents: 27742
diff changeset
  1615
    with repo.wlock():
34302
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34142
diff changeset
  1616
        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
  1617
            wc = repo[None]
20279
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
  1618
        pl = wc.parents()
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
  1619
        p1 = pl[0]
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
  1620
        pas = [None]
23405
2a038deeac9a merge: 0 is a valid ancestor different from None
Mads Kiilerich <madski@unity3d.com>
parents: 23398
diff changeset
  1621
        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
  1622
            pas = [repo[ancestor]]
20279
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
  1623
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
  1624
        overwrite = force and not branchmerge
20279
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
  1625
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
  1626
        p2 = repo[node]
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
  1627
        if pas[0] is None:
34479
99c3dee3f6ce configitems: register the 'merge.preferancestor' config
Boris Feld <boris.feld@octobus.net>
parents: 34349
diff changeset
  1628
            if repo.ui.configlist('merge', 'preferancestor') == ['*']:
21128
f4014f646f71 merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21082
diff changeset
  1629
                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
  1630
                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
  1631
            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
  1632
                pas = [p1.ancestor(p2, warn=branchmerge)]
13874
9d67277c9204 merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents: 13728
diff changeset
  1633
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
  1634
        fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
3314
b16456909a0a merge: various tidying
Matt Mackall <mpm@selenic.com>
parents: 3312
diff changeset
  1635
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
  1636
        ### check phase
27316
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1637
        if not overwrite:
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1638
            if len(pl) > 1:
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1639
                raise error.Abort(_("outstanding uncommitted merge"))
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1640
            ms = mergestate.read(repo)
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1641
            if list(ms.unresolved()):
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
  1642
                raise error.Abort(_("outstanding merge conflicts"))
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
  1643
        if branchmerge:
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
  1644
            if pas == [p2]:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26570
diff changeset
  1645
                raise error.Abort(_("merging with a working directory ancestor"
11417
6f1d1ed3e19a merge: improve merge with ancestor message
Matt Mackall <mpm@selenic.com>
parents: 11178
diff changeset
  1646
                                   " has no effect"))
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
  1647
            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
  1648
                if not mergeancestor and wc.branch() == p2.branch():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26570
diff changeset
  1649
                    raise error.Abort(_("nothing to merge"),
15619
6c8573dd1b6b merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents: 15538
diff changeset
  1650
                                     hint=_("use 'hg update' "
6c8573dd1b6b merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents: 15538
diff changeset
  1651
                                            "or check 'hg heads'"))
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
  1652
            if not force and (wc.files() or wc.deleted()):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26570
diff changeset
  1653
                raise error.Abort(_("uncommitted changes"),
15619
6c8573dd1b6b merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents: 15538
diff changeset
  1654
                                 hint=_("use 'hg status' to list changes"))
18364
6252b4f1c4b4 subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18360
diff changeset
  1655
            for s in sorted(wc.substate):
24471
1ff35d76421c subrepo: add bailifchanged to centralize raising Abort if subrepo is dirty
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23971
diff changeset
  1656
                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
  1657
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
  1658
        elif not overwrite:
19929
ab2362e1672e merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 19803
diff changeset
  1659
            if p1 == p2: # no-op update
ab2362e1672e merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 19803
diff changeset
  1660
                # call the hooks and exit early
ab2362e1672e merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 19803
diff changeset
  1661
                repo.hook('preupdate', throw=True, parent1=xp2, parent2='')
ab2362e1672e merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 19803
diff changeset
  1662
                repo.hook('update', parent1=xp2, parent2='', error=0)
ab2362e1672e merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 19803
diff changeset
  1663
                return 0, 0, 0, 0
ab2362e1672e merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 19803
diff changeset
  1664
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1665
            if (updatecheck == 'linear' and
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31165
diff changeset
  1666
                    pas not in ([p1], [p2])):  # nonlinear
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1667
                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
  1668
                if dirty:
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1669
                    # 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
  1670
                    # 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
  1671
                    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
  1672
                    # 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
  1673
                    if repo[node].node() in foreground:
30901
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1674
                        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
  1675
                    else:
19799
ab3e42225dbc update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents: 19798
diff changeset
  1676
                        msg = _("uncommitted changes")
30902
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30901
diff changeset
  1677
                        hint = _("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
  1678
                        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
  1679
                else:
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
  1680
                    # 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
  1681
                    pass
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1682
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1683
        if overwrite:
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1684
            pas = [wc]
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1685
        elif not branchmerge:
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
  1686
            pas = [p1]
2814
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
  1687
25843
bf9ea348b487 merge: mark ancient debugging option
Matt Mackall <mpm@selenic.com>
parents: 25754
diff changeset
  1688
        # deprecated config: merge.followcopies
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33323
diff changeset
  1689
        followcopies = repo.ui.configbool('merge', 'followcopies')
21080
04540a8499a3 merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents: 21024
diff changeset
  1690
        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
  1691
            followcopies = False
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
  1692
        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
  1693
            followcopies = False
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
Gábor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
  1694
        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
  1695
            followcopies = False
21080
04540a8499a3 merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents: 21024
diff changeset
  1696
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
  1697
        ### calculate phase
23641
a7a0f32a383f merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23640
diff changeset
  1698
        actionbyfile, diverge, renamedelete = calculateupdates(
27345
98266b1d144d merge: restate calculateupdates in terms of a matcher
Augie Fackler <augie@google.com>
parents: 27344
diff changeset
  1699
            repo, wc, p2, pas, branchmerge, force, mergeancestor,
28020
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
  1700
            followcopies, matcher=matcher, mergeforce=mergeforce)
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1701
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1702
        if updatecheck == 'noconflict':
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1703
            for f, (m, args, msg) in actionbyfile.iteritems():
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1704
                if m not in ('g', 'k', 'e', 'r', 'pr'):
31175
7433b3bc55ee update: for "noconflict" updates, print "conflicting changes" on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 31168
diff changeset
  1705
                    msg = _("conflicting changes")
7433b3bc55ee update: for "noconflict" updates, print "conflicting changes" on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 31168
diff changeset
  1706
                    hint = _("commit or update --clean to discard changes")
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1707
                    raise error.Abort(msg, hint=hint)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
  1708
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1709
        # 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
  1710
        # already, but we can't handle .hgsubstate in filemerge or
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1711
        # subrepo.submerge yet so we have to keep prompting for it.
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1712
        if '.hgsubstate' in actionbyfile:
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1713
            f = '.hgsubstate'
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1714
            m, args, msg = actionbyfile[f]
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29629
diff changeset
  1715
            prompts = filemerge.partextras(labels)
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29629
diff changeset
  1716
            prompts['f'] = f
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1717
            if m == 'cd':
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1718
                if repo.ui.promptchoice(
29775
978b907d9b36 merge: always use other, not remote, in user prompts
Simon Farnsworth <simonfar@fb.com>
parents: 29774
diff changeset
  1719
                    _("local%(l)s changed %(f)s which other%(o)s deleted\n"
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1720
                      "use (c)hanged version or (d)elete?"
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29629
diff changeset
  1721
                      "$$ &Changed $$ &Delete") % prompts, 0):
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1722
                    actionbyfile[f] = ('r', None, "prompt delete")
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1723
                elif f in p1:
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1724
                    actionbyfile[f] = ('am', None, "prompt keep")
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1725
                else:
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1726
                    actionbyfile[f] = ('a', None, "prompt keep")
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1727
            elif m == 'dc':
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1728
                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
  1729
                flags = p2[f2].flags()
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1730
                if repo.ui.promptchoice(
29775
978b907d9b36 merge: always use other, not remote, in user prompts
Simon Farnsworth <simonfar@fb.com>
parents: 29774
diff changeset
  1731
                    _("other%(o)s changed %(f)s which local%(l)s deleted\n"
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1732
                      "use (c)hanged version or leave (d)eleted?"
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29629
diff changeset
  1733
                      "$$ &Changed $$ &Deleted") % prompts, 0) == 0:
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1734
                    actionbyfile[f] = ('g', (flags, False), "prompt recreating")
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1735
                else:
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1736
                    del actionbyfile[f]
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
  1737
23641
a7a0f32a383f merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23640
diff changeset
  1738
        # Convert to dictionary-of-lists format
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
  1739
        actions = dict((m, [])
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
  1740
                       for m in 'a am f g cd dc r dm dg m e k p pr'.split())
23641
a7a0f32a383f merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23640
diff changeset
  1741
        for f, (m, args, msg) in actionbyfile.iteritems():
a7a0f32a383f merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23640
diff changeset
  1742
            if m not in actions:
a7a0f32a383f merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23640
diff changeset
  1743
                actions[m] = []
a7a0f32a383f merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23640
diff changeset
  1744
            actions[m].append((f, args, msg))
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1745
29889
6f447b9ec263 util: rename checkcase() to fscasesensitive() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 29831
diff changeset
  1746
        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
  1747
            # check collision between files only in p2 for clean update
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  1748
            if (not branchmerge and
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  1749
                (force or not wc.dirty(missing=True, branch=False))):
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  1750
                _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
  1751
            else:
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  1752
                _checkcollision(repo, wc.manifest(), actions)
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
  1753
23525
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1754
        # divergent renames
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
  1755
        for f, fl in sorted(diverge.iteritems()):
23525
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1756
            repo.ui.warn(_("note: possible conflict - %s was renamed "
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1757
                           "multiple times to:\n") % f)
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1758
            for nf in fl:
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1759
                repo.ui.warn(" %s\n" % nf)
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1760
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1761
        # rename and delete
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
  1762
        for f, fl in sorted(renamedelete.iteritems()):
23525
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1763
            repo.ui.warn(_("note: possible conflict - %s was deleted "
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1764
                           "and renamed to:\n") % f)
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1765
            for nf in fl:
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1766
                repo.ui.warn(" %s\n" % nf)
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
  1767
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  1768
        ### apply phase
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  1769
        if not branchmerge: # just jump to the new rev
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  1770
            fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  1771
        if not partial:
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  1772
            repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  1773
            # note that we're in the middle of an update
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  1774
            repo.vfs.write('updatestate', p2.hex())
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  1775
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  1776
        stats = applyupdates(repo, actions, wc, p2, overwrite, labels=labels)
34125
57dc78d757ff merge: flush any deferred writes just before recordupdates()
Phil Cohen <phillco@fb.com>
parents: 34124
diff changeset
  1777
        wc.flushall()
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
  1778
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
  1779
        if not partial:
32351
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  1780
            with repo.dirstate.parentchange():
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  1781
                repo.setparents(fp1, fp2)
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  1782
                recordupdates(repo, actions, branchmerge)
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  1783
                # update completed, clear state
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  1784
                util.unlink(repo.vfs.join('updatestate'))
19482
499fc471296b update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents: 19285
diff changeset
  1785
32351
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  1786
                if not branchmerge:
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  1787
                    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
  1788
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1789
    # 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
  1790
    # (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
  1791
    if not branchmerge:
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1792
        sparse.prunetemporaryincludes(repo)
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
  1793
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10431
diff changeset
  1794
    if not partial:
26752
949e8c626d19 merge: make in-memory changes visible to external update hooks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26748
diff changeset
  1795
        repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10431
diff changeset
  1796
    return stats
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1797
27267
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  1798
def graft(repo, ctx, pctx, labels, keepparent=False):
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1799
    """Do a graft-like merge.
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1800
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1801
    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
  1802
    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
  1803
    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
  1804
    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
  1805
    renames/copies appropriately.
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1806
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1807
    ctx - changeset to rebase
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1808
    pctx - merge base, usually ctx.p1()
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1809
    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
  1810
    keepparent - keep second parent if any
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1811
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1812
    """
24643
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
  1813
    # 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
  1814
    # 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
  1815
    # 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
  1816
    # 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
  1817
    # 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
  1818
    # which local deleted".
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
  1819
    mergeancestor = repo.changelog.isancestor(repo['.'].node(), ctx.node())
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1820
27344
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27316
diff changeset
  1821
    stats = update(repo, ctx.node(), True, True, pctx.node(),
24643
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
  1822
                   mergeancestor=mergeancestor, labels=labels)
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
  1823
27267
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  1824
    pother = nullid
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  1825
    parents = ctx.parents()
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  1826
    if keepparent and len(parents) == 2 and pctx in parents:
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  1827
        parents.remove(pctx)
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  1828
        pother = parents[0].node()
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
  1829
32351
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  1830
    with repo.dirstate.parentchange():
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  1831
        repo.setparents(repo['.'].node(), pother)
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  1832
        repo.dirstate.write(repo.currenttransaction())
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  1833
        # fix up dirstate for copies and renames
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32246
diff changeset
  1834
        copies.duplicatecopies(repo, ctx.rev(), pctx.rev())
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
  1835
    return stats