annotate mercurial/merge.py @ 33766:4c706037adef

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