author | Martin von Zweigbergk <martinvonz@google.com> |
Mon, 15 Apr 2019 15:28:41 -0700 | |
changeset 42152 | 344066b54a7b |
parent 42110 | 3a7efcbdf288 |
child 42163 | beec7fc6adec |
permissions | -rw-r--r-- |
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 | 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 |
) |
37107
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
25 |
from .thirdparty import ( |
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
26 |
attr, |
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
27 |
) |
25959
892d601f0d44
merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25844
diff
changeset
|
28 |
from . import ( |
892d601f0d44
merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25844
diff
changeset
|
29 |
copies, |
39818
24e493ec2229
py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents:
39464
diff
changeset
|
30 |
encoding, |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26570
diff
changeset
|
31 |
error, |
25959
892d601f0d44
merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25844
diff
changeset
|
32 |
filemerge, |
31257
11831d755b51
merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents:
31175
diff
changeset
|
33 |
match as matchmod, |
33146
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33095
diff
changeset
|
34 |
obsutil, |
30519
20a42325fdef
py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30486
diff
changeset
|
35 |
pycompat, |
27656
57c0d4888ca8
batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents:
27655
diff
changeset
|
36 |
scmutil, |
36009
55e8efa2451a
subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
35726
diff
changeset
|
37 |
subrepoutil, |
25959
892d601f0d44
merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25844
diff
changeset
|
38 |
util, |
892d601f0d44
merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25844
diff
changeset
|
39 |
worker, |
892d601f0d44
merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25844
diff
changeset
|
40 |
) |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
41 |
|
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
42 |
_pack = struct.pack |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
43 |
_unpack = struct.unpack |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
44 |
|
20593
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
45 |
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
|
46 |
# 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
|
47 |
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
|
48 |
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
|
49 |
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
|
50 |
|
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
51 |
# Merge state record types. See ``mergestate`` docs for more. |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
52 |
RECORD_LOCAL = b'L' |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
53 |
RECORD_OTHER = b'O' |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
54 |
RECORD_MERGED = b'F' |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
55 |
RECORD_CHANGEDELETE_CONFLICT = b'C' |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
56 |
RECORD_MERGE_DRIVER_MERGE = b'D' |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
57 |
RECORD_PATH_CONFLICT = b'P' |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
58 |
RECORD_MERGE_DRIVER_STATE = b'm' |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
59 |
RECORD_FILE_VALUES = b'f' |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
60 |
RECORD_LABELS = b'l' |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
61 |
RECORD_OVERRIDE = b't' |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
62 |
RECORD_UNSUPPORTED_MANDATORY = b'X' |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
63 |
RECORD_UNSUPPORTED_ADVISORY = b'x' |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
64 |
|
37110
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
65 |
MERGE_DRIVER_STATE_UNMARKED = b'u' |
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
66 |
MERGE_DRIVER_STATE_MARKED = b'm' |
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
67 |
MERGE_DRIVER_STATE_SUCCESS = b's' |
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
68 |
|
37111
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
69 |
MERGE_RECORD_UNRESOLVED = b'u' |
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
70 |
MERGE_RECORD_RESOLVED = b'r' |
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
71 |
MERGE_RECORD_UNRESOLVED_PATH = b'pu' |
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
72 |
MERGE_RECORD_RESOLVED_PATH = b'pr' |
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
73 |
MERGE_RECORD_DRIVER_RESOLVED = b'd' |
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
74 |
|
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
75 |
ACTION_FORGET = b'f' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
76 |
ACTION_REMOVE = b'r' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
77 |
ACTION_ADD = b'a' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
78 |
ACTION_GET = b'g' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
79 |
ACTION_PATH_CONFLICT = b'p' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
80 |
ACTION_PATH_CONFLICT_RESOLVE = b'pr' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
81 |
ACTION_ADD_MODIFIED = b'am' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
82 |
ACTION_CREATED = b'c' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
83 |
ACTION_DELETED_CHANGED = b'dc' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
84 |
ACTION_CHANGED_DELETED = b'cd' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
85 |
ACTION_MERGE = b'm' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
86 |
ACTION_LOCAL_DIR_RENAME_GET = b'dg' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
87 |
ACTION_DIR_RENAME_MOVE_LOCAL = b'dm' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
88 |
ACTION_KEEP = b'k' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
89 |
ACTION_EXEC = b'e' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
90 |
ACTION_CREATED_MERGE = b'cm' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
91 |
|
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
92 |
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
|
93 |
'''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
|
94 |
|
27022
35102876d648
mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents:
27006
diff
changeset
|
95 |
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
|
96 |
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
|
97 |
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
|
98 |
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
|
99 |
`_readrecordsv2`. |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
100 |
|
27022
35102876d648
mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents:
27006
diff
changeset
|
101 |
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
|
102 |
`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
|
103 |
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
|
104 |
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
|
105 |
|
27022
35102876d648
mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents:
27006
diff
changeset
|
106 |
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
|
107 |
|
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
108 |
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
|
109 |
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
|
110 |
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
|
111 |
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
|
112 |
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
|
113 |
(experimental) |
34545
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
114 |
P: a path conflict (file vs directory) |
26649
f618b6aa8cdd
merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26641
diff
changeset
|
115 |
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
|
116 |
(experimental) |
30332
318a24b52eeb
spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents:
30200
diff
changeset
|
117 |
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
|
118 |
X: unsupported mandatory record type (used in tests) |
a01ecbcfaf84
mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents:
27022
diff
changeset
|
119 |
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
|
120 |
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
|
121 |
|
f618b6aa8cdd
merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26641
diff
changeset
|
122 |
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
|
123 |
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
|
124 |
to resolve or commit |
f618b6aa8cdd
merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26641
diff
changeset
|
125 |
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
|
126 |
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
|
127 |
|
34545
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
128 |
Merge record states (stored in self._state, indexed by filename): |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
129 |
u: unresolved conflict |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
130 |
r: resolved conflict |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
131 |
pu: unresolved path conflict (file conflicts with directory) |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
132 |
pr: resolved path conflict |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
133 |
d: driver-resolved conflict |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
134 |
|
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
135 |
The resolve command transitions between 'u' and 'r' for conflicts and |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
136 |
'pu' and 'pr' for path conflicts. |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
137 |
''' |
23380
90cc552ceed5
merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents:
23362
diff
changeset
|
138 |
statepathv1 = 'merge/state' |
90cc552ceed5
merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents:
23362
diff
changeset
|
139 |
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
|
140 |
|
26987
416b2b7d3068
mergestate: add a constructor that sets up a clean merge state
Siddharth Agarwal <sid0@fb.com>
parents:
26986
diff
changeset
|
141 |
@staticmethod |
28634
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
142 |
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
|
143 |
"""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
|
144 |
disk.""" |
416b2b7d3068
mergestate: add a constructor that sets up a clean merge state
Siddharth Agarwal <sid0@fb.com>
parents:
26986
diff
changeset
|
145 |
ms = mergestate(repo) |
28634
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
146 |
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
|
147 |
return ms |
416b2b7d3068
mergestate: add a constructor that sets up a clean merge state
Siddharth Agarwal <sid0@fb.com>
parents:
26986
diff
changeset
|
148 |
|
26991
2ddc92bae4a7
mergestate: add a constructor that reads state from disk
Siddharth Agarwal <sid0@fb.com>
parents:
26990
diff
changeset
|
149 |
@staticmethod |
2ddc92bae4a7
mergestate: add a constructor that reads state from disk
Siddharth Agarwal <sid0@fb.com>
parents:
26990
diff
changeset
|
150 |
def read(repo): |
2ddc92bae4a7
mergestate: add a constructor that reads state from disk
Siddharth Agarwal <sid0@fb.com>
parents:
26990
diff
changeset
|
151 |
"""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
|
152 |
ms = mergestate(repo) |
27005
3185c01c551c
mergestate: move _read() call to read constructor
Siddharth Agarwal <sid0@fb.com>
parents:
26991
diff
changeset
|
153 |
ms._read() |
26991
2ddc92bae4a7
mergestate: add a constructor that reads state from disk
Siddharth Agarwal <sid0@fb.com>
parents:
26990
diff
changeset
|
154 |
return ms |
2ddc92bae4a7
mergestate: add a constructor that reads state from disk
Siddharth Agarwal <sid0@fb.com>
parents:
26990
diff
changeset
|
155 |
|
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
156 |
def __init__(self, repo): |
27005
3185c01c551c
mergestate: move _read() call to read constructor
Siddharth Agarwal <sid0@fb.com>
parents:
26991
diff
changeset
|
157 |
"""Initialize the merge state. |
3185c01c551c
mergestate: move _read() call to read constructor
Siddharth Agarwal <sid0@fb.com>
parents:
26991
diff
changeset
|
158 |
|
3185c01c551c
mergestate: move _read() call to read constructor
Siddharth Agarwal <sid0@fb.com>
parents:
26991
diff
changeset
|
159 |
Do not use this directly! Instead call read() or clean().""" |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
160 |
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
|
161 |
self._dirty = False |
28634
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
162 |
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
|
163 |
|
28634
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
164 |
def reset(self, node=None, other=None, labels=None): |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
165 |
self._state = {} |
28009
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
166 |
self._stateextras = {} |
21261
6ca05c46aa95
mergestate: consistently set variables to None
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21203
diff
changeset
|
167 |
self._local = None |
6ca05c46aa95
mergestate: consistently set variables to None
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21203
diff
changeset
|
168 |
self._other = None |
28634
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
169 |
self._labels = labels |
27130
6f045b563fa5
mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents:
27129
diff
changeset
|
170 |
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
|
171 |
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
|
172 |
delattr(self, var) |
7848
89e05c02a4af
resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents:
7768
diff
changeset
|
173 |
if node: |
89e05c02a4af
resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents:
7768
diff
changeset
|
174 |
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
|
175 |
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
|
176 |
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
|
177 |
if self.mergedriver: |
37110
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
178 |
self._mdstate = MERGE_DRIVER_STATE_SUCCESS |
26769
5b00ec4c05cb
merge.mergestate: set merge driver state to 's' if there's none present
Siddharth Agarwal <sid0@fb.com>
parents:
26768
diff
changeset
|
179 |
else: |
37110
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
180 |
self._mdstate = MERGE_DRIVER_STATE_UNMARKED |
31323
102d3a30582c
merge: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31310
diff
changeset
|
181 |
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
|
182 |
self._results = {} |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
183 |
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
|
184 |
|
6518 | 185 |
def _read(self): |
20652
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
186 |
"""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
|
187 |
|
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
188 |
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
|
189 |
of on disk file. |
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
190 |
""" |
6518 | 191 |
self._state = {} |
28009
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
192 |
self._stateextras = {} |
21261
6ca05c46aa95
mergestate: consistently set variables to None
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21203
diff
changeset
|
193 |
self._local = None |
6ca05c46aa95
mergestate: consistently set variables to None
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21203
diff
changeset
|
194 |
self._other = None |
27130
6f045b563fa5
mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents:
27129
diff
changeset
|
195 |
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
|
196 |
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
|
197 |
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
|
198 |
self._readmergedriver = None |
37110
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
199 |
self._mdstate = MERGE_DRIVER_STATE_SUCCESS |
26986
1ee5e48f09d4
mergestate: raise structured exception for unsupported merge records
Siddharth Agarwal <sid0@fb.com>
parents:
26975
diff
changeset
|
200 |
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
|
201 |
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
|
202 |
for rtype, record in records: |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
203 |
if rtype == RECORD_LOCAL: |
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
|
204 |
self._local = bin(record) |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
205 |
elif rtype == RECORD_OTHER: |
20591
02c60e380fd0
merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20590
diff
changeset
|
206 |
self._other = bin(record) |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
207 |
elif rtype == RECORD_MERGE_DRIVER_STATE: |
26649
f618b6aa8cdd
merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26641
diff
changeset
|
208 |
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
|
209 |
mdstate = bits[1] |
37110
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
210 |
if len(mdstate) != 1 or mdstate not in ( |
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
211 |
MERGE_DRIVER_STATE_UNMARKED, MERGE_DRIVER_STATE_MARKED, |
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
212 |
MERGE_DRIVER_STATE_SUCCESS): |
26649
f618b6aa8cdd
merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26641
diff
changeset
|
213 |
# the merge driver should be idempotent, so just rerun it |
37110
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
214 |
mdstate = MERGE_DRIVER_STATE_UNMARKED |
26649
f618b6aa8cdd
merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26641
diff
changeset
|
215 |
|
26768
ac68769a5985
merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents:
26766
diff
changeset
|
216 |
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
|
217 |
self._mdstate = mdstate |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
218 |
elif rtype in (RECORD_MERGED, RECORD_CHANGEDELETE_CONFLICT, |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
219 |
RECORD_PATH_CONFLICT, RECORD_MERGE_DRIVER_MERGE): |
23380
90cc552ceed5
merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents:
23362
diff
changeset
|
220 |
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
|
221 |
self._state[bits[0]] = bits[1:] |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
222 |
elif rtype == RECORD_FILE_VALUES: |
28009
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
223 |
filename, rawextras = record.split('\0', 1) |
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
224 |
extraparts = rawextras.split('\0') |
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
225 |
extras = {} |
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
226 |
i = 0 |
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
227 |
while i < len(extraparts): |
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
228 |
extras[extraparts[i]] = extraparts[i + 1] |
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
229 |
i += 2 |
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
230 |
|
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
231 |
self._stateextras[filename] = extras |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
232 |
elif rtype == RECORD_LABELS: |
28634
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
233 |
labels = record.split('\0', 2) |
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
234 |
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
|
235 |
elif not rtype.islower(): |
26986
1ee5e48f09d4
mergestate: raise structured exception for unsupported merge records
Siddharth Agarwal <sid0@fb.com>
parents:
26975
diff
changeset
|
236 |
unsupported.add(rtype) |
27074
78b0c88ab0db
mergestate._resolve: store return code and action for each file
Siddharth Agarwal <sid0@fb.com>
parents:
27049
diff
changeset
|
237 |
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
|
238 |
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
|
239 |
|
26986
1ee5e48f09d4
mergestate: raise structured exception for unsupported merge records
Siddharth Agarwal <sid0@fb.com>
parents:
26975
diff
changeset
|
240 |
if unsupported: |
1ee5e48f09d4
mergestate: raise structured exception for unsupported merge records
Siddharth Agarwal <sid0@fb.com>
parents:
26975
diff
changeset
|
241 |
raise error.UnsupportedMergeRecords(unsupported) |
1ee5e48f09d4
mergestate: raise structured exception for unsupported merge records
Siddharth Agarwal <sid0@fb.com>
parents:
26975
diff
changeset
|
242 |
|
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
|
243 |
def _readrecords(self): |
20652
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
244 |
"""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
|
245 |
|
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20945
diff
changeset
|
246 |
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
|
247 |
|
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20945
diff
changeset
|
248 |
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
|
249 |
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
|
250 |
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
|
251 |
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
|
252 |
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
|
253 |
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
|
254 |
file around. |
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
255 |
|
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
256 |
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
|
257 |
v1records = self._readrecordsv1() |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
258 |
v2records = self._readrecordsv2() |
26500
5bd7c4c07f6d
merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents:
26361
diff
changeset
|
259 |
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
|
260 |
return v2records |
5bd7c4c07f6d
merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents:
26361
diff
changeset
|
261 |
else: |
5bd7c4c07f6d
merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents:
26361
diff
changeset
|
262 |
# 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
|
263 |
# 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
|
264 |
# 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
|
265 |
mctx = self._repo[None].parents()[-1] |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
266 |
v1records.append((RECORD_OTHER, mctx.hex())) |
26500
5bd7c4c07f6d
merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents:
26361
diff
changeset
|
267 |
# 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
|
268 |
# 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
|
269 |
# 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
|
270 |
for idx, r in enumerate(v1records): |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
271 |
if r[0] == RECORD_MERGED: |
26500
5bd7c4c07f6d
merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents:
26361
diff
changeset
|
272 |
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
|
273 |
bits.insert(-2, '') |
5bd7c4c07f6d
merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents:
26361
diff
changeset
|
274 |
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
|
275 |
return v1records |
5bd7c4c07f6d
merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents:
26361
diff
changeset
|
276 |
|
5bd7c4c07f6d
merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents:
26361
diff
changeset
|
277 |
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
|
278 |
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
|
279 |
for rec in v2records: |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
280 |
if rec[0] == RECORD_LOCAL: |
20593
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
281 |
oldv2.add(rec) |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
282 |
elif rec[0] == RECORD_MERGED: |
20593
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
283 |
# drop the onode data (not contained in v1) |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
284 |
oldv2.add((RECORD_MERGED, _droponode(rec[1]))) |
20593
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
285 |
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
|
286 |
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
|
287 |
return False |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
288 |
else: |
26500
5bd7c4c07f6d
merge.mergestate: factor out code to validate v1/v2 records
Siddharth Agarwal <sid0@fb.com>
parents:
26361
diff
changeset
|
289 |
return True |
20651
c1a52dd56eb4
merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20642
diff
changeset
|
290 |
|
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
291 |
def _readrecordsv1(self): |
20652
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
292 |
"""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
|
293 |
|
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
294 |
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
|
295 |
|
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
296 |
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
|
297 |
(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
|
298 |
""" |
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
|
299 |
records = [] |
6518 | 300 |
try: |
23877
7cc77030c557
localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23656
diff
changeset
|
301 |
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
|
302 |
for i, l in enumerate(f): |
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
303 |
if i == 0: |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
304 |
records.append((RECORD_LOCAL, l[:-1])) |
6530
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
305 |
else: |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
306 |
records.append((RECORD_MERGED, l[:-1])) |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13323
diff
changeset
|
307 |
f.close() |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25151
diff
changeset
|
308 |
except IOError as err: |
6518 | 309 |
if err.errno != errno.ENOENT: |
310 |
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
|
311 |
return records |
20651
c1a52dd56eb4
merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20642
diff
changeset
|
312 |
|
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
313 |
def _readrecordsv2(self): |
20652
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
314 |
"""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
|
315 |
|
27022
35102876d648
mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents:
27006
diff
changeset
|
316 |
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
|
317 |
|
35102876d648
mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents:
27006
diff
changeset
|
318 |
[type][length][content] |
35102876d648
mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents:
27006
diff
changeset
|
319 |
|
35102876d648
mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents:
27006
diff
changeset
|
320 |
`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
|
321 |
`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
|
322 |
|
27027
a01ecbcfaf84
mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents:
27022
diff
changeset
|
323 |
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
|
324 |
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
|
325 |
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
|
326 |
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
|
327 |
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
|
328 |
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
|
329 |
|
27022
35102876d648
mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents:
27006
diff
changeset
|
330 |
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
|
331 |
records = [] |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
332 |
try: |
23877
7cc77030c557
localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23656
diff
changeset
|
333 |
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
|
334 |
data = f.read() |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
335 |
off = 0 |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
336 |
end = len(data) |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
337 |
while off < end: |
36537
1d99260c3a81
py3: slice over bytes to prevent getting ascii values
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36477
diff
changeset
|
338 |
rtype = data[off:off + 1] |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
339 |
off += 1 |
20607
abd448767465
merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents:
20594
diff
changeset
|
340 |
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
|
341 |
off += 4 |
20607
abd448767465
merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents:
20594
diff
changeset
|
342 |
record = data[off:(off + length)] |
abd448767465
merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents:
20594
diff
changeset
|
343 |
off += length |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
344 |
if rtype == RECORD_OVERRIDE: |
36537
1d99260c3a81
py3: slice over bytes to prevent getting ascii values
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36477
diff
changeset
|
345 |
rtype, record = record[0:1], record[1:] |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
346 |
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
|
347 |
f.close() |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25151
diff
changeset
|
348 |
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
|
349 |
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
|
350 |
raise |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
351 |
return records |
20651
c1a52dd56eb4
merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20642
diff
changeset
|
352 |
|
26649
f618b6aa8cdd
merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26641
diff
changeset
|
353 |
@util.propertycache |
f618b6aa8cdd
merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26641
diff
changeset
|
354 |
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
|
355 |
# 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
|
356 |
# - 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
|
357 |
# pauses the merge |
ac68769a5985
merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents:
26766
diff
changeset
|
358 |
# - 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
|
359 |
# - 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
|
360 |
# - 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
|
361 |
# - 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
|
362 |
# gets invoked |
ac68769a5985
merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents:
26766
diff
changeset
|
363 |
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
|
364 |
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
|
365 |
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
|
366 |
raise error.ConfigError( |
ac68769a5985
merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents:
26766
diff
changeset
|
367 |
_("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
|
368 |
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
|
369 |
|
ac68769a5985
merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents:
26766
diff
changeset
|
370 |
return configmergedriver |
ac68769a5985
merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents:
26766
diff
changeset
|
371 |
|
26765
45976219eb80
merge.mergestate: add a way to get the other side of the merge
Siddharth Agarwal <sid0@fb.com>
parents:
26752
diff
changeset
|
372 |
@util.propertycache |
27130
6f045b563fa5
mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents:
27129
diff
changeset
|
373 |
def localctx(self): |
6f045b563fa5
mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents:
27129
diff
changeset
|
374 |
if self._local is None: |
31646 | 375 |
msg = "localctx accessed but self._local isn't set" |
376 |
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
|
377 |
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
|
378 |
|
6f045b563fa5
mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents:
27129
diff
changeset
|
379 |
@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
|
380 |
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
|
381 |
if self._other is None: |
31646 | 382 |
msg = "otherctx accessed but self._other isn't set" |
383 |
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
|
384 |
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
|
385 |
|
21264
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
386 |
def active(self): |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
387 |
"""Whether mergestate is active. |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
388 |
|
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
389 |
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
|
390 |
for "is a merge in progress." |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
391 |
""" |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
392 |
# 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
|
393 |
# reasons. |
41759
aaad36b88298
cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents:
41601
diff
changeset
|
394 |
return (bool(self._local) or bool(self._state) or |
aaad36b88298
cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents:
41601
diff
changeset
|
395 |
self._repo.vfs.exists(self.statepathv1) or |
aaad36b88298
cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents:
41601
diff
changeset
|
396 |
self._repo.vfs.exists(self.statepathv2)) |
21264
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
397 |
|
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
398 |
def commit(self): |
20652
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
399 |
"""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
|
400 |
if self._dirty: |
27006
9d58dc193c46
mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents:
27005
diff
changeset
|
401 |
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
|
402 |
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
|
403 |
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
|
404 |
|
27006
9d58dc193c46
mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents:
27005
diff
changeset
|
405 |
def _makerecords(self): |
9d58dc193c46
mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents:
27005
diff
changeset
|
406 |
records = [] |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
407 |
records.append((RECORD_LOCAL, hex(self._local))) |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
408 |
records.append((RECORD_OTHER, hex(self._other))) |
27006
9d58dc193c46
mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents:
27005
diff
changeset
|
409 |
if self.mergedriver: |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
410 |
records.append((RECORD_MERGE_DRIVER_STATE, '\0'.join([ |
27006
9d58dc193c46
mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents:
27005
diff
changeset
|
411 |
self.mergedriver, self._mdstate]))) |
34560
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
412 |
# Write out state items. In all cases, the value of the state map entry |
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
413 |
# is written as the contents of the record. The record type depends on |
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
414 |
# the type of state that is stored, and capital-letter records are used |
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
415 |
# to prevent older versions of Mercurial that do not support the feature |
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
416 |
# from loading them. |
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
417 |
for filename, v in self._state.iteritems(): |
37111
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
418 |
if v[0] == MERGE_RECORD_DRIVER_RESOLVED: |
34560
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
419 |
# Driver-resolved merge. These are stored in 'D' records. |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
420 |
records.append((RECORD_MERGE_DRIVER_MERGE, |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
421 |
'\0'.join([filename] + v))) |
37111
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
422 |
elif v[0] in (MERGE_RECORD_UNRESOLVED_PATH, |
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
423 |
MERGE_RECORD_RESOLVED_PATH): |
34560
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
424 |
# Path conflicts. These are stored in 'P' records. The current |
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
425 |
# resolution state ('pu' or 'pr') is stored within the record. |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
426 |
records.append((RECORD_PATH_CONFLICT, |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
427 |
'\0'.join([filename] + v))) |
27031
8be0af32e513
mergestate: allow storing and retrieving change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27027
diff
changeset
|
428 |
elif v[1] == nullhex or v[6] == nullhex: |
34560
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
429 |
# Change/Delete or Delete/Change conflicts. These are stored in |
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
430 |
# 'C' records. v[1] is the local file, and is nullhex when the |
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
431 |
# file is deleted locally ('dc'). v[6] is the remote file, and |
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
432 |
# is nullhex when the file is deleted remotely ('cd'). |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
433 |
records.append((RECORD_CHANGEDELETE_CONFLICT, |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
434 |
'\0'.join([filename] + v))) |
27006
9d58dc193c46
mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents:
27005
diff
changeset
|
435 |
else: |
34560
1248aa48cac9
merge: improve comments in mergestate._makerecords
Mark Thomas <mbthomas@fb.com>
parents:
34555
diff
changeset
|
436 |
# Normal files. These are stored in 'F' records. |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
437 |
records.append((RECORD_MERGED, |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
438 |
'\0'.join([filename] + v))) |
28009
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
439 |
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
|
440 |
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
|
441 |
extras.iteritems()) |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
442 |
records.append((RECORD_FILE_VALUES, |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
443 |
'%s\0%s' % (filename, rawextras))) |
28634
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
444 |
if self._labels is not None: |
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
445 |
labels = '\0'.join(self._labels) |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
446 |
records.append((RECORD_LABELS, labels)) |
27006
9d58dc193c46
mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents:
27005
diff
changeset
|
447 |
return records |
9d58dc193c46
mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents:
27005
diff
changeset
|
448 |
|
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
|
449 |
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
|
450 |
"""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
|
451 |
self._writerecordsv1(records) |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
452 |
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
|
453 |
|
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
454 |
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
|
455 |
"""Write current state on disk in a version 1 file""" |
36477
035b77bf01d2
py3: make sure we write in mergestate in bytes mode
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36316
diff
changeset
|
456 |
f = self._repo.vfs(self.statepathv1, 'wb') |
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
|
457 |
irecords = iter(records) |
29216
ead25aa27a43
py3: convert to next() function
timeless <timeless@mozdev.org>
parents:
29148
diff
changeset
|
458 |
lrecords = next(irecords) |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
459 |
assert lrecords[0] == RECORD_LOCAL |
23380
90cc552ceed5
merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents:
23362
diff
changeset
|
460 |
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
|
461 |
for rtype, data in irecords: |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
462 |
if rtype == RECORD_MERGED: |
23380
90cc552ceed5
merge: consistently use single quotes for non-user-facing strings
Martin von Zweigbergk <martinvonz@google.com>
parents:
23362
diff
changeset
|
463 |
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
|
464 |
f.close() |
20651
c1a52dd56eb4
merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20642
diff
changeset
|
465 |
|
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
466 |
def _writerecordsv2(self, records): |
27027
a01ecbcfaf84
mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents:
27022
diff
changeset
|
467 |
"""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
|
468 |
|
a01ecbcfaf84
mergestate: handle additional record types specially
Siddharth Agarwal <sid0@fb.com>
parents:
27022
diff
changeset
|
469 |
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
|
470 |
# these are the records that all version 2 clients can read |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
471 |
allowlist = (RECORD_LOCAL, RECORD_OTHER, RECORD_MERGED) |
36477
035b77bf01d2
py3: make sure we write in mergestate in bytes mode
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36316
diff
changeset
|
472 |
f = self._repo.vfs(self.statepathv2, 'wb') |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
473 |
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
|
474 |
assert len(key) == 1 |
37109
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
475 |
if key not in allowlist: |
a532b2f54f95
merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37107
diff
changeset
|
476 |
key, data = RECORD_OVERRIDE, '%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
|
477 |
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
|
478 |
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
|
479 |
f.close() |
20651
c1a52dd56eb4
merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20642
diff
changeset
|
480 |
|
41155
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
481 |
@staticmethod |
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
482 |
def getlocalkey(path): |
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
483 |
"""hash the path of a local file context for storage in the .hg/merge |
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
484 |
directory.""" |
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
485 |
|
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
486 |
return hex(hashlib.sha1(path).digest()) |
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
487 |
|
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
488 |
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
|
489 |
"""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
|
490 |
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
|
491 |
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
|
492 |
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
|
493 |
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
|
494 |
|
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
495 |
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
|
496 |
""" |
27049
0d61f7ec7f76
mergestate.add: store absentfilectxes as nullhex
Siddharth Agarwal <sid0@fb.com>
parents:
27048
diff
changeset
|
497 |
if fcl.isabsent(): |
41155
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
498 |
localkey = nullhex |
27049
0d61f7ec7f76
mergestate.add: store absentfilectxes as nullhex
Siddharth Agarwal <sid0@fb.com>
parents:
27048
diff
changeset
|
499 |
else: |
41155
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
500 |
localkey = mergestate.getlocalkey(fcl.path()) |
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
501 |
self._repo.vfs.write('merge/' + localkey, fcl.data()) |
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
502 |
self._state[fd] = [MERGE_RECORD_UNRESOLVED, localkey, fcl.path(), |
20593
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
503 |
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
|
504 |
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
|
505 |
fcl.flags()] |
34486
a57c938e7ac8
style: never use a space before a colon or comma
Alex Gaynor <agaynor@mozilla.com>
parents:
34479
diff
changeset
|
506 |
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
|
507 |
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
|
508 |
|
34545
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
509 |
def addpath(self, path, frename, forigin): |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
510 |
"""add a new conflicting path to the merge state |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
511 |
path: the path that conflicts |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
512 |
frename: the filename the conflicting file was renamed to |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
513 |
forigin: origin of the file ('l' or 'r' for local/remote) |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
514 |
""" |
37111
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
515 |
self._state[path] = [MERGE_RECORD_UNRESOLVED_PATH, frename, forigin] |
34545
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
516 |
self._dirty = True |
1913162854f2
merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents:
34522
diff
changeset
|
517 |
|
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
518 |
def __contains__(self, dfile): |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
519 |
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
|
520 |
|
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
521 |
def __getitem__(self, dfile): |
6518 | 522 |
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
|
523 |
|
6518 | 524 |
def __iter__(self): |
21268
a0b8a912ec81
merge: simplify mergestate iter
Mads Kiilerich <mads@kiilerich.com>
parents:
21266
diff
changeset
|
525 |
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
|
526 |
|
19285
feaf5749d7a4
merge: add a files method to the mergestate class
Bryan O'Sullivan <bryano@fb.com>
parents:
19226
diff
changeset
|
527 |
def files(self): |
feaf5749d7a4
merge: add a files method to the mergestate class
Bryan O'Sullivan <bryano@fb.com>
parents:
19226
diff
changeset
|
528 |
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
|
529 |
|
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
530 |
def mark(self, dfile, state): |
6518 | 531 |
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
|
532 |
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
|
533 |
|
26766
a83110faece1
merge.mergestate: add a way to get the merge driver state
Siddharth Agarwal <sid0@fb.com>
parents:
26765
diff
changeset
|
534 |
def mdstate(self): |
a83110faece1
merge.mergestate: add a way to get the merge driver state
Siddharth Agarwal <sid0@fb.com>
parents:
26765
diff
changeset
|
535 |
return self._mdstate |
a83110faece1
merge.mergestate: add a way to get the merge driver state
Siddharth Agarwal <sid0@fb.com>
parents:
26765
diff
changeset
|
536 |
|
21266
19d6fec60b81
resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21264
diff
changeset
|
537 |
def unresolved(self): |
19d6fec60b81
resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21264
diff
changeset
|
538 |
"""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
|
539 |
|
33310
b4d517d736a1
mergestate: make unresolved() use iteritems()
Martin von Zweigbergk <martinvonz@google.com>
parents:
33283
diff
changeset
|
540 |
for f, entry in self._state.iteritems(): |
37111
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
541 |
if entry[0] in (MERGE_RECORD_UNRESOLVED, |
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
542 |
MERGE_RECORD_UNRESOLVED_PATH): |
21266
19d6fec60b81
resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21264
diff
changeset
|
543 |
yield f |
19d6fec60b81
resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21264
diff
changeset
|
544 |
|
26740
f4a27c05c43f
merge.mergestate: add a generator for driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents:
26682
diff
changeset
|
545 |
def driverresolved(self): |
f4a27c05c43f
merge.mergestate: add a generator for driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents:
26682
diff
changeset
|
546 |
"""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
|
547 |
|
f4a27c05c43f
merge.mergestate: add a generator for driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents:
26682
diff
changeset
|
548 |
for f, entry in self._state.items(): |
37111
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
549 |
if entry[0] == MERGE_RECORD_DRIVER_RESOLVED: |
26740
f4a27c05c43f
merge.mergestate: add a generator for driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents:
26682
diff
changeset
|
550 |
yield f |
f4a27c05c43f
merge.mergestate: add a generator for driver-resolved files
Siddharth Agarwal <sid0@fb.com>
parents:
26682
diff
changeset
|
551 |
|
28009
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
552 |
def extras(self, filename): |
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
553 |
return self._stateextras.setdefault(filename, {}) |
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
554 |
|
28634
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
555 |
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
|
556 |
"""rerun merge process for file path `dfile`""" |
37111
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
557 |
if self[dfile] in (MERGE_RECORD_RESOLVED, |
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
558 |
MERGE_RECORD_DRIVER_RESOLVED): |
26616
2f1fce0d4e86
merge.mergestate._resolve: also return completed status
Siddharth Agarwal <sid0@fb.com>
parents:
26615
diff
changeset
|
559 |
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
|
560 |
stateentry = self._state[dfile] |
41155
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
561 |
state, localkey, 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
|
562 |
octx = self._repo[self._other] |
28011
8abd9f785030
merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents:
28009
diff
changeset
|
563 |
extras = self.extras(dfile) |
8abd9f785030
merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents:
28009
diff
changeset
|
564 |
anccommitnode = extras.get('ancestorlinknode') |
8abd9f785030
merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents:
28009
diff
changeset
|
565 |
if anccommitnode: |
8abd9f785030
merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents:
28009
diff
changeset
|
566 |
actx = self._repo[anccommitnode] |
8abd9f785030
merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents:
28009
diff
changeset
|
567 |
else: |
8abd9f785030
merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents:
28009
diff
changeset
|
568 |
actx = None |
41155
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
569 |
fcd = self._filectxorabsent(localkey, wctx, dfile) |
27048
86290f6f6599
mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27035
diff
changeset
|
570 |
fco = self._filectxorabsent(onode, octx, ofile) |
86290f6f6599
mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27035
diff
changeset
|
571 |
# TODO: move this to filectxorabsent |
37172
daef13da66fe
context: avoid using a context object as a changeid
Martin von Zweigbergk <martinvonz@google.com>
parents:
37125
diff
changeset
|
572 |
fca = self._repo.filectx(afile, fileid=anode, changectx=actx) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
573 |
# "premerge" x flags |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
574 |
flo = fco.flags() |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
575 |
fla = fca.flags() |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
576 |
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
|
577 |
if fca.node() == nullid and flags != flo: |
26617
dfd9811c5c9b
merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents:
26616
diff
changeset
|
578 |
if preresolve: |
dfd9811c5c9b
merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents:
26616
diff
changeset
|
579 |
self._repo.ui.warn( |
30162
5cb830801855
merge: clarify warning for (not) merging flags without ancestor
Mads Kiilerich <madski@unity3d.com>
parents:
30161
diff
changeset
|
580 |
_('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
|
581 |
'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
|
582 |
% afile) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
583 |
elif flags == fla: |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
584 |
flags = flo |
26617
dfd9811c5c9b
merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents:
26616
diff
changeset
|
585 |
if preresolve: |
dfd9811c5c9b
merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents:
26616
diff
changeset
|
586 |
# restore local |
41155
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
587 |
if localkey != nullhex: |
8c222bec97da
merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents:
41050
diff
changeset
|
588 |
f = self._repo.vfs('merge/' + localkey) |
33083
05c680ebf512
merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com>
parents:
33082
diff
changeset
|
589 |
wctx[dfile].write(f.read(), flags) |
27048
86290f6f6599
mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27035
diff
changeset
|
590 |
f.close() |
86290f6f6599
mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27035
diff
changeset
|
591 |
else: |
33082
f9e50ee4c52b
merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents:
33081
diff
changeset
|
592 |
wctx[dfile].remove(ignoremissing=True) |
34122
c0ce60459d84
merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents:
34037
diff
changeset
|
593 |
complete, r, deleted = filemerge.premerge(self._repo, wctx, |
c0ce60459d84
merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents:
34037
diff
changeset
|
594 |
self._local, lfile, fcd, |
c0ce60459d84
merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents:
34037
diff
changeset
|
595 |
fco, fca, |
28634
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
596 |
labels=self._labels) |
26617
dfd9811c5c9b
merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents:
26616
diff
changeset
|
597 |
else: |
34122
c0ce60459d84
merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents:
34037
diff
changeset
|
598 |
complete, r, deleted = filemerge.filemerge(self._repo, wctx, |
c0ce60459d84
merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents:
34037
diff
changeset
|
599 |
self._local, lfile, fcd, |
c0ce60459d84
merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents:
34037
diff
changeset
|
600 |
fco, fca, |
28634
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
601 |
labels=self._labels) |
13536
fac040b7e822
merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents:
13437
diff
changeset
|
602 |
if r is None: |
fac040b7e822
merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents:
13437
diff
changeset
|
603 |
# no real conflict |
fac040b7e822
merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents:
13437
diff
changeset
|
604 |
del self._state[dfile] |
28009
4a25e91fa55d
merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents:
27951
diff
changeset
|
605 |
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
|
606 |
self._dirty = True |
13536
fac040b7e822
merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents:
13437
diff
changeset
|
607 |
elif not r: |
37111
aa5199c7aa42
merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37110
diff
changeset
|
608 |
self.mark(dfile, MERGE_RECORD_RESOLVED) |
27035
de7bf242644e
merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents:
27034
diff
changeset
|
609 |
|
de7bf242644e
merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents:
27034
diff
changeset
|
610 |
if complete: |
27075
6373330155b2
mergestate._resolve: don't return the action any more
Siddharth Agarwal <sid0@fb.com>
parents:
27074
diff
changeset
|
611 |
action = None |
27035
de7bf242644e
merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents:
27034
diff
changeset
|
612 |
if deleted: |
27122
77d760ba8dcd
mergestate: explicitly forget 'dc' conflicts where the deleted side is picked
Siddharth Agarwal <sid0@fb.com>
parents:
27121
diff
changeset
|
613 |
if fcd.isabsent(): |
77d760ba8dcd
mergestate: explicitly forget 'dc' conflicts where the deleted side is picked
Siddharth Agarwal <sid0@fb.com>
parents:
27121
diff
changeset
|
614 |
# 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
|
615 |
# happen on re-resolves. |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
616 |
action = ACTION_FORGET |
27122
77d760ba8dcd
mergestate: explicitly forget 'dc' conflicts where the deleted side is picked
Siddharth Agarwal <sid0@fb.com>
parents:
27121
diff
changeset
|
617 |
else: |
27035
de7bf242644e
merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents:
27034
diff
changeset
|
618 |
# cd: remote picked (or otherwise deleted) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
619 |
action = ACTION_REMOVE |
27035
de7bf242644e
merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents:
27034
diff
changeset
|
620 |
else: |
de7bf242644e
merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents:
27034
diff
changeset
|
621 |
if fcd.isabsent(): # dc: remote picked |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
622 |
action = ACTION_GET |
27035
de7bf242644e
merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents:
27034
diff
changeset
|
623 |
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
|
624 |
if dfile in self.localctx: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
625 |
action = ACTION_ADD_MODIFIED |
27131
d837da26155e
merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents:
27130
diff
changeset
|
626 |
else: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
627 |
action = ACTION_ADD |
27035
de7bf242644e
merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents:
27034
diff
changeset
|
628 |
# 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
|
629 |
self._results[dfile] = r, action |
27035
de7bf242644e
merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents:
27034
diff
changeset
|
630 |
|
26616
2f1fce0d4e86
merge.mergestate._resolve: also return completed status
Siddharth Agarwal <sid0@fb.com>
parents:
26615
diff
changeset
|
631 |
return complete, r |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
632 |
|
27048
86290f6f6599
mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27035
diff
changeset
|
633 |
def _filectxorabsent(self, hexnode, ctx, f): |
86290f6f6599
mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27035
diff
changeset
|
634 |
if hexnode == nullhex: |
86290f6f6599
mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27035
diff
changeset
|
635 |
return filemerge.absentfilectx(ctx, f) |
86290f6f6599
mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27035
diff
changeset
|
636 |
else: |
86290f6f6599
mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27035
diff
changeset
|
637 |
return ctx[f] |
86290f6f6599
mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27035
diff
changeset
|
638 |
|
28634
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
639 |
def preresolve(self, dfile, wctx): |
26870
ab798d1a230f
merge.mergestate: update docstrings for preresolve and resolve
Siddharth Agarwal <sid0@fb.com>
parents:
26821
diff
changeset
|
640 |
"""run premerge process for dfile |
ab798d1a230f
merge.mergestate: update docstrings for preresolve and resolve
Siddharth Agarwal <sid0@fb.com>
parents:
26821
diff
changeset
|
641 |
|
ab798d1a230f
merge.mergestate: update docstrings for preresolve and resolve
Siddharth Agarwal <sid0@fb.com>
parents:
26821
diff
changeset
|
642 |
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
|
643 |
return self._resolve(True, dfile, wctx) |
26617
dfd9811c5c9b
merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents:
26616
diff
changeset
|
644 |
|
28634
3ceac01bc29f
merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents:
28267
diff
changeset
|
645 |
def resolve(self, dfile, wctx): |
26870
ab798d1a230f
merge.mergestate: update docstrings for preresolve and resolve
Siddharth Agarwal <sid0@fb.com>
parents:
26821
diff
changeset
|
646 |
"""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
|
647 |
|
ab798d1a230f
merge.mergestate: update docstrings for preresolve and resolve
Siddharth Agarwal <sid0@fb.com>
parents:
26821
diff
changeset
|
648 |
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
|
649 |
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
|
650 |
|
27076
09139ccf3085
mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents:
27075
diff
changeset
|
651 |
def counts(self): |
09139ccf3085
mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents:
27075
diff
changeset
|
652 |
"""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
|
653 |
session""" |
09139ccf3085
mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents:
27075
diff
changeset
|
654 |
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
|
655 |
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
|
656 |
if r is None: |
09139ccf3085
mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents:
27075
diff
changeset
|
657 |
updated += 1 |
09139ccf3085
mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents:
27075
diff
changeset
|
658 |
elif r == 0: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
659 |
if action == ACTION_REMOVE: |
27076
09139ccf3085
mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents:
27075
diff
changeset
|
660 |
removed += 1 |
09139ccf3085
mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents:
27075
diff
changeset
|
661 |
else: |
09139ccf3085
mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents:
27075
diff
changeset
|
662 |
merged += 1 |
09139ccf3085
mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents:
27075
diff
changeset
|
663 |
return updated, merged, removed |
09139ccf3085
mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents:
27075
diff
changeset
|
664 |
|
27077
ca3fbf9dad8c
mergestate: add a function to return the number of unresolved files
Siddharth Agarwal <sid0@fb.com>
parents:
27076
diff
changeset
|
665 |
def unresolvedcount(self): |
ca3fbf9dad8c
mergestate: add a function to return the number of unresolved files
Siddharth Agarwal <sid0@fb.com>
parents:
27076
diff
changeset
|
666 |
"""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
|
667 |
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
|
668 |
|
27079
a88a10a933b2
mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents:
27078
diff
changeset
|
669 |
def actions(self): |
a88a10a933b2
mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents:
27078
diff
changeset
|
670 |
"""return lists of actions to perform on the dirstate""" |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
671 |
actions = { |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
672 |
ACTION_REMOVE: [], |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
673 |
ACTION_FORGET: [], |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
674 |
ACTION_ADD: [], |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
675 |
ACTION_ADD_MODIFIED: [], |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
676 |
ACTION_GET: [], |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
677 |
} |
27079
a88a10a933b2
mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents:
27078
diff
changeset
|
678 |
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
|
679 |
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
|
680 |
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
|
681 |
return actions |
a88a10a933b2
mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents:
27078
diff
changeset
|
682 |
|
27088
e2b79f57903a
mergestate: add a way to record pending dirstate actions
Siddharth Agarwal <sid0@fb.com>
parents:
27087
diff
changeset
|
683 |
def recordactions(self): |
e2b79f57903a
mergestate: add a way to record pending dirstate actions
Siddharth Agarwal <sid0@fb.com>
parents:
27087
diff
changeset
|
684 |
"""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
|
685 |
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
|
686 |
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
|
687 |
|
27090
ef6f98473a48
mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents:
27088
diff
changeset
|
688 |
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
|
689 |
"""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
|
690 |
|
ef6f98473a48
mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents:
27088
diff
changeset
|
691 |
Meant for use by custom merge drivers.""" |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
692 |
self._results[f] = 0, ACTION_REMOVE |
27090
ef6f98473a48
mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents:
27088
diff
changeset
|
693 |
|
ef6f98473a48
mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents:
27088
diff
changeset
|
694 |
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
|
695 |
"""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
|
696 |
|
ef6f98473a48
mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents:
27088
diff
changeset
|
697 |
Meant for use by custom merge drivers.""" |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
698 |
self._results[f] = 0, ACTION_ADD |
27090
ef6f98473a48
mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents:
27088
diff
changeset
|
699 |
|
ef6f98473a48
mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents:
27088
diff
changeset
|
700 |
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
|
701 |
"""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
|
702 |
|
ef6f98473a48
mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents:
27088
diff
changeset
|
703 |
Meant for use by custom merge drivers.""" |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
704 |
self._results[f] = 0, ACTION_GET |
27090
ef6f98473a48
mergestate: add methods to queue files to remove, add or get
Siddharth Agarwal <sid0@fb.com>
parents:
27088
diff
changeset
|
705 |
|
27740
da5634e1b8a3
merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents:
27657
diff
changeset
|
706 |
def _getcheckunknownconfig(repo, section, name): |
34522
bed1d2eaa108
configitems: register 'merge.checkunknown' and 'merge.checkignored'
Boris Feld <boris.feld@octobus.net>
parents:
34486
diff
changeset
|
707 |
config = repo.ui.config(section, name) |
27740
da5634e1b8a3
merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents:
27657
diff
changeset
|
708 |
valid = ['abort', 'ignore', 'warn'] |
da5634e1b8a3
merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents:
27657
diff
changeset
|
709 |
if config not in valid: |
da5634e1b8a3
merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents:
27657
diff
changeset
|
710 |
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
|
711 |
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
|
712 |
"('%s' is none of %s)") |
da5634e1b8a3
merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents:
27657
diff
changeset
|
713 |
% (section, name, config, validstr)) |
da5634e1b8a3
merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents:
27657
diff
changeset
|
714 |
return config |
da5634e1b8a3
merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents:
27657
diff
changeset
|
715 |
|
23653
0297d8469350
merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents:
23652
diff
changeset
|
716 |
def _checkunknownfile(repo, wctx, mctx, f, f2=None): |
35288
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
717 |
if wctx.isinmemory(): |
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
718 |
# Nothing to do in IMM because nothing in the "working copy" can be an |
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
719 |
# unknown file. |
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
720 |
# |
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
721 |
# Note that we should bail out here, not in ``_checkunknownfiles()``, |
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
722 |
# because that function does other useful work. |
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
723 |
return False |
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
724 |
|
23653
0297d8469350
merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents:
23652
diff
changeset
|
725 |
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
|
726 |
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
|
727 |
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
|
728 |
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
|
729 |
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
|
730 |
and mctx[f2].cmp(wctx[f])) |
16093
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
731 |
|
35171
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
732 |
class _unknowndirschecker(object): |
34550
53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents:
34549
diff
changeset
|
733 |
""" |
53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents:
34549
diff
changeset
|
734 |
Look for any unknown files or directories that may have a path conflict |
53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents:
34549
diff
changeset
|
735 |
with a file. If any path prefix of the file exists as a file or link, |
53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents:
34549
diff
changeset
|
736 |
then it conflicts. If the file itself is a directory that contains any |
53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents:
34549
diff
changeset
|
737 |
file that is not tracked, then it conflicts. |
53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents:
34549
diff
changeset
|
738 |
|
53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents:
34549
diff
changeset
|
739 |
Returns the shortest path at which a conflict occurs, or None if there is |
53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents:
34549
diff
changeset
|
740 |
no conflict. |
53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents:
34549
diff
changeset
|
741 |
""" |
35171
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
742 |
def __init__(self): |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
743 |
# A set of paths known to be good. This prevents repeated checking of |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
744 |
# dirs. It will be updated with any new dirs that are checked and found |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
745 |
# to be safe. |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
746 |
self._unknowndircache = set() |
34550
53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents:
34549
diff
changeset
|
747 |
|
35171
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
748 |
# A set of paths that are known to be absent. This prevents repeated |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
749 |
# checking of subdirectories that are known not to exist. It will be |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
750 |
# updated with any new dirs that are checked and found to be absent. |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
751 |
self._missingdircache = set() |
34550
53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents:
34549
diff
changeset
|
752 |
|
35288
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
753 |
def __call__(self, repo, wctx, f): |
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
754 |
if wctx.isinmemory(): |
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
755 |
# Nothing to do in IMM for the same reason as ``_checkunknownfile``. |
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
756 |
return False |
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
757 |
|
35171
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
758 |
# Check for path prefixes that exist as unknown files. |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
759 |
for p in reversed(list(util.finddirs(f))): |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
760 |
if p in self._missingdircache: |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
761 |
return |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
762 |
if p in self._unknowndircache: |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
763 |
continue |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
764 |
if repo.wvfs.audit.check(p): |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
765 |
if (repo.wvfs.isfileorlink(p) |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
766 |
and repo.dirstate.normalize(p) not in repo.dirstate): |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
767 |
return p |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
768 |
if not repo.wvfs.lexists(p): |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
769 |
self._missingdircache.add(p) |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
770 |
return |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
771 |
self._unknowndircache.add(p) |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
772 |
|
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
773 |
# Check if the file conflicts with a directory containing unknown files. |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
774 |
if repo.wvfs.audit.check(f) and repo.wvfs.isdir(f): |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
775 |
# Does the directory contain any files that are not in the dirstate? |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
776 |
for p, dirs, files in repo.wvfs.walk(f): |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
777 |
for fn in files: |
37086
658b1d28813c
merge: pconvert paths in _unknowndirschecker before dirstate-normalizing
Matt Harbison <matt_harbison@yahoo.com>
parents:
36537
diff
changeset
|
778 |
relf = util.pconvert(repo.wvfs.reljoin(p, fn)) |
37087
e4640ec346ac
merge: add 'isknown=True' to a dirstate.normalize() in _unknowndirschecker
Matt Harbison <matt_harbison@yahoo.com>
parents:
37086
diff
changeset
|
779 |
relf = repo.dirstate.normalize(relf, isknown=True) |
35171
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
780 |
if relf not in repo.dirstate: |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
781 |
return f |
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
782 |
return None |
34550
53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents:
34549
diff
changeset
|
783 |
|
28020
cffa46cbdb8f
merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents:
28019
diff
changeset
|
784 |
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
|
785 |
""" |
79235b46062c
merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents:
23654
diff
changeset
|
786 |
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
|
787 |
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
|
788 |
choose a different action. |
79235b46062c
merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents:
23654
diff
changeset
|
789 |
""" |
34551
1609a5afc4f5
merge: rename conflicts to fileconflicts in _checkunknownfiles
Mark Thomas <mbthomas@fb.com>
parents:
34550
diff
changeset
|
790 |
fileconflicts = set() |
34552
33c8a6837181
merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34551
diff
changeset
|
791 |
pathconflicts = set() |
28018
3feadb0b6c34
merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents:
28011
diff
changeset
|
792 |
warnconflicts = set() |
3feadb0b6c34
merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents:
28011
diff
changeset
|
793 |
abortconflicts = set() |
3feadb0b6c34
merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents:
28011
diff
changeset
|
794 |
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
|
795 |
ignoredconfig = _getcheckunknownconfig(repo, 'merge', 'checkignored') |
34941
37450a122128
merge: add a config option to disable path conflict checking
Siddharth Agarwal <sid0@fb.com>
parents:
34919
diff
changeset
|
796 |
pathconfig = repo.ui.configbool('experimental', 'merge.checkpathconflicts') |
23655
79235b46062c
merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents:
23654
diff
changeset
|
797 |
if not force: |
27741
3951f132958f
merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents:
27740
diff
changeset
|
798 |
def collectconflicts(conflicts, config): |
3951f132958f
merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents:
27740
diff
changeset
|
799 |
if config == 'abort': |
3951f132958f
merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents:
27740
diff
changeset
|
800 |
abortconflicts.update(conflicts) |
3951f132958f
merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents:
27740
diff
changeset
|
801 |
elif config == 'warn': |
3951f132958f
merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents:
27740
diff
changeset
|
802 |
warnconflicts.update(conflicts) |
3951f132958f
merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents:
27740
diff
changeset
|
803 |
|
35171
b85962350bb3
merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
34941
diff
changeset
|
804 |
checkunknowndirs = _unknowndirschecker() |
23655
79235b46062c
merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents:
23654
diff
changeset
|
805 |
for f, (m, args, msg) in actions.iteritems(): |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
806 |
if m in (ACTION_CREATED, ACTION_DELETED_CHANGED): |
23655
79235b46062c
merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents:
23654
diff
changeset
|
807 |
if _checkunknownfile(repo, wctx, mctx, f): |
34551
1609a5afc4f5
merge: rename conflicts to fileconflicts in _checkunknownfiles
Mark Thomas <mbthomas@fb.com>
parents:
34550
diff
changeset
|
808 |
fileconflicts.add(f) |
34941
37450a122128
merge: add a config option to disable path conflict checking
Siddharth Agarwal <sid0@fb.com>
parents:
34919
diff
changeset
|
809 |
elif pathconfig and f not in wctx: |
35288
5db3c748ce8f
merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents:
35284
diff
changeset
|
810 |
path = checkunknowndirs(repo, wctx, f) |
34552
33c8a6837181
merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34551
diff
changeset
|
811 |
if path is not None: |
33c8a6837181
merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34551
diff
changeset
|
812 |
pathconflicts.add(path) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
813 |
elif m == ACTION_LOCAL_DIR_RENAME_GET: |
23655
79235b46062c
merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents:
23654
diff
changeset
|
814 |
if _checkunknownfile(repo, wctx, mctx, f, args[0]): |
34551
1609a5afc4f5
merge: rename conflicts to fileconflicts in _checkunknownfiles
Mark Thomas <mbthomas@fb.com>
parents:
34550
diff
changeset
|
815 |
fileconflicts.add(f) |
23655
79235b46062c
merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents:
23654
diff
changeset
|
816 |
|
34552
33c8a6837181
merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34551
diff
changeset
|
817 |
allconflicts = fileconflicts | pathconflicts |
42057
566daffc607d
cleanup: use set literals where possible
Martin von Zweigbergk <martinvonz@google.com>
parents:
42040
diff
changeset
|
818 |
ignoredconflicts = {c for c in allconflicts |
566daffc607d
cleanup: use set literals where possible
Martin von Zweigbergk <martinvonz@google.com>
parents:
42040
diff
changeset
|
819 |
if repo.dirstate._ignore(c)} |
34551
1609a5afc4f5
merge: rename conflicts to fileconflicts in _checkunknownfiles
Mark Thomas <mbthomas@fb.com>
parents:
34550
diff
changeset
|
820 |
unknownconflicts = allconflicts - ignoredconflicts |
27742
6b639caa1652
merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents:
27741
diff
changeset
|
821 |
collectconflicts(ignoredconflicts, ignoredconfig) |
6b639caa1652
merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents:
27741
diff
changeset
|
822 |
collectconflicts(unknownconflicts, unknownconfig) |
28022
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
823 |
else: |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
824 |
for f, (m, args, msg) in actions.iteritems(): |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
825 |
if m == ACTION_CREATED_MERGE: |
28022
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
826 |
fl2, anc = args |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
827 |
different = _checkunknownfile(repo, wctx, mctx, f) |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
828 |
if repo.dirstate._ignore(f): |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
829 |
config = ignoredconfig |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
830 |
else: |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
831 |
config = unknownconfig |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
832 |
|
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
833 |
# 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
|
834 |
# config different mergeforce | action backup |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
835 |
# * n * | get n |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
836 |
# * y y | merge - |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
837 |
# abort y n | merge - (1) |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
838 |
# warn y n | warn + get y |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
839 |
# ignore y n | get y |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
840 |
# |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
841 |
# (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
|
842 |
# 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
|
843 |
# 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
|
844 |
# merge.update. |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
845 |
if not different: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
846 |
actions[f] = (ACTION_GET, (fl2, False), 'remote created') |
28022
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
847 |
elif mergeforce or config == 'abort': |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
848 |
actions[f] = (ACTION_MERGE, (f, f, None, False, anc), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
849 |
'remote differs from untracked local') |
28022
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
850 |
elif config == 'abort': |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
851 |
abortconflicts.add(f) |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
852 |
else: |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
853 |
if config == 'warn': |
e397b58c0563
rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents:
28020
diff
changeset
|
854 |
warnconflicts.add(f) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
855 |
actions[f] = (ACTION_GET, (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
|
856 |
|
28018
3feadb0b6c34
merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents:
28011
diff
changeset
|
857 |
for f in sorted(abortconflicts): |
34553
0217d66846f7
merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34552
diff
changeset
|
858 |
warn = repo.ui.warn |
0217d66846f7
merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34552
diff
changeset
|
859 |
if f in pathconflicts: |
0217d66846f7
merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34552
diff
changeset
|
860 |
if repo.wvfs.isfileorlink(f): |
0217d66846f7
merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34552
diff
changeset
|
861 |
warn(_("%s: untracked file conflicts with directory\n") % f) |
0217d66846f7
merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34552
diff
changeset
|
862 |
else: |
0217d66846f7
merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34552
diff
changeset
|
863 |
warn(_("%s: untracked directory conflicts with file\n") % f) |
0217d66846f7
merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34552
diff
changeset
|
864 |
else: |
0217d66846f7
merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34552
diff
changeset
|
865 |
warn(_("%s: untracked file differs\n") % f) |
28018
3feadb0b6c34
merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents:
28011
diff
changeset
|
866 |
if abortconflicts: |
3feadb0b6c34
merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents:
28011
diff
changeset
|
867 |
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
|
868 |
"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
|
869 |
|
3feadb0b6c34
merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents:
28011
diff
changeset
|
870 |
for f in sorted(warnconflicts): |
34553
0217d66846f7
merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34552
diff
changeset
|
871 |
if repo.wvfs.isfileorlink(f): |
0217d66846f7
merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34552
diff
changeset
|
872 |
repo.ui.warn(_("%s: replacing untracked file\n") % f) |
0217d66846f7
merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34552
diff
changeset
|
873 |
else: |
0217d66846f7
merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34552
diff
changeset
|
874 |
repo.ui.warn(_("%s: replacing untracked files in directory\n") % f) |
23655
79235b46062c
merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents:
23654
diff
changeset
|
875 |
|
79235b46062c
merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents:
23654
diff
changeset
|
876 |
for f, (m, args, msg) in actions.iteritems(): |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
877 |
if m == ACTION_CREATED: |
34552
33c8a6837181
merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34551
diff
changeset
|
878 |
backup = (f in fileconflicts or f in pathconflicts or |
33c8a6837181
merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34551
diff
changeset
|
879 |
any(p in pathconflicts for p in util.finddirs(f))) |
27655
af13eaf9ab8c
merge: add a new 'backup' argument to get actions
Siddharth Agarwal <sid0@fb.com>
parents:
27654
diff
changeset
|
880 |
flags, = args |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
881 |
actions[f] = (ACTION_GET, (flags, backup), msg) |
23655
79235b46062c
merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents:
23654
diff
changeset
|
882 |
|
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
883 |
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
|
884 |
""" |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
885 |
Forget removed files |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
886 |
|
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
887 |
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
|
888 |
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
|
889 |
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
|
890 |
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
|
891 |
manifest. |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
892 |
|
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
893 |
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
|
894 |
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
|
895 |
as removed. |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
896 |
""" |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
897 |
|
23640
b46b9865dd08
merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23639
diff
changeset
|
898 |
actions = {} |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
899 |
m = ACTION_FORGET |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
900 |
if branchmerge: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
901 |
m = ACTION_REMOVE |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
902 |
for f in wctx.deleted(): |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
903 |
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
|
904 |
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
|
905 |
|
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
906 |
if not branchmerge: |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
907 |
for f in wctx.removed(): |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
908 |
if f not in mctx: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
909 |
actions[f] = ACTION_FORGET, None, "forget removed" |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
910 |
|
23640
b46b9865dd08
merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23639
diff
changeset
|
911 |
return actions |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
912 |
|
20640
52929dcdd512
merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents:
20639
diff
changeset
|
913 |
def _checkcollision(repo, wmf, actions): |
38045
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
914 |
""" |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
915 |
Check for case-folding collisions. |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
916 |
""" |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
917 |
|
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
918 |
# If the repo is narrowed, filter out files outside the narrowspec. |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
919 |
narrowmatch = repo.narrowmatch() |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
920 |
if not narrowmatch.always(): |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
921 |
wmf = wmf.matches(narrowmatch) |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
922 |
if actions: |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
923 |
narrowactions = {} |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
924 |
for m, actionsfortype in actions.iteritems(): |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
925 |
narrowactions[m] = [] |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
926 |
for (f, args, msg) in actionsfortype: |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
927 |
if narrowmatch(f): |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
928 |
narrowactions[m].append((f, args, msg)) |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
929 |
actions = narrowactions |
18e6ea9ba81d
narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
38044
diff
changeset
|
930 |
|
19105
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
931 |
# build provisional merged manifest up |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
932 |
pmmf = set(wmf) |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
933 |
|
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
934 |
if actions: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
935 |
# KEEP and EXEC are no-op |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
936 |
for m in (ACTION_ADD, ACTION_ADD_MODIFIED, ACTION_FORGET, ACTION_GET, |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
937 |
ACTION_CHANGED_DELETED, ACTION_DELETED_CHANGED): |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
938 |
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
|
939 |
pmmf.add(f) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
940 |
for f, args, msg in actions[ACTION_REMOVE]: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
941 |
pmmf.discard(f) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
942 |
for f, args, msg in actions[ACTION_DIR_RENAME_MOVE_LOCAL]: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
943 |
f2, flags = args |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
944 |
pmmf.discard(f2) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
945 |
pmmf.add(f) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
946 |
for f, args, msg in actions[ACTION_LOCAL_DIR_RENAME_GET]: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
947 |
pmmf.add(f) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
948 |
for f, args, msg in actions[ACTION_MERGE]: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
949 |
f1, f2, fa, move, anc = args |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
950 |
if move: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
951 |
pmmf.discard(f1) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
952 |
pmmf.add(f) |
19105
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
953 |
|
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
954 |
# 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
|
955 |
foldmap = {} |
33808
055fee3547df
merge: removed sorting in casefolding detection, for a slight performance win
Alex Gaynor <agaynor@mozilla.com>
parents:
33499
diff
changeset
|
956 |
for f in pmmf: |
19105
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
957 |
fold = util.normcase(f) |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
958 |
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
|
959 |
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
|
960 |
% (f, foldmap[fold])) |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
961 |
foldmap[fold] = f |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
962 |
|
26661
2b955fec91e0
merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents:
26651
diff
changeset
|
963 |
# check case-folding of directories |
2b955fec91e0
merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents:
26651
diff
changeset
|
964 |
foldprefix = unfoldprefix = lastfull = '' |
2b955fec91e0
merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents:
26651
diff
changeset
|
965 |
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
|
966 |
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
|
967 |
# 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
|
968 |
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
|
969 |
"%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
|
970 |
foldprefix = fold + '/' |
2b955fec91e0
merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents:
26651
diff
changeset
|
971 |
unfoldprefix = f + '/' |
2b955fec91e0
merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents:
26651
diff
changeset
|
972 |
lastfull = f |
2b955fec91e0
merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents:
26651
diff
changeset
|
973 |
|
26785
e9a0d5f5c225
merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26769
diff
changeset
|
974 |
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
|
975 |
"""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
|
976 |
|
e9a0d5f5c225
merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26769
diff
changeset
|
977 |
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
|
978 |
return True |
e9a0d5f5c225
merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26769
diff
changeset
|
979 |
|
e9a0d5f5c225
merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26769
diff
changeset
|
980 |
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
|
981 |
"""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
|
982 |
|
e9a0d5f5c225
merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26769
diff
changeset
|
983 |
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
|
984 |
return True |
e9a0d5f5c225
merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents:
26769
diff
changeset
|
985 |
|
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
986 |
def _filesindirs(repo, manifest, dirs): |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
987 |
""" |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
988 |
Generator that yields pairs of all the files in the manifest that are found |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
989 |
inside the directories listed in dirs, and which directory they are found |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
990 |
in. |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
991 |
""" |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
992 |
for f in manifest: |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
993 |
for p in util.finddirs(f): |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
994 |
if p in dirs: |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
995 |
yield f, p |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
996 |
break |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
997 |
|
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
998 |
def checkpathconflicts(repo, wctx, mctx, actions): |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
999 |
""" |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1000 |
Check if any actions introduce path conflicts in the repository, updating |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1001 |
actions to record or handle the path conflict accordingly. |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1002 |
""" |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1003 |
mf = wctx.manifest() |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1004 |
|
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1005 |
# The set of local files that conflict with a remote directory. |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1006 |
localconflicts = set() |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1007 |
|
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1008 |
# The set of directories that conflict with a remote file, and so may cause |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1009 |
# conflicts if they still contain any files after the merge. |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1010 |
remoteconflicts = set() |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1011 |
|
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1012 |
# The set of directories that appear as both a file and a directory in the |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1013 |
# remote manifest. These indicate an invalid remote manifest, which |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1014 |
# can't be updated to cleanly. |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1015 |
invalidconflicts = set() |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1016 |
|
35172
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1017 |
# The set of directories that contain files that are being created. |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1018 |
createdfiledirs = set() |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1019 |
|
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1020 |
# The set of files deleted by all the actions. |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1021 |
deletedfiles = set() |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1022 |
|
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1023 |
for f, (m, args, msg) in actions.items(): |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1024 |
if m in (ACTION_CREATED, ACTION_DELETED_CHANGED, ACTION_MERGE, |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1025 |
ACTION_CREATED_MERGE): |
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1026 |
# This action may create a new local file. |
35172
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1027 |
createdfiledirs.update(util.finddirs(f)) |
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1028 |
if mf.hasdir(f): |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1029 |
# The file aliases a local directory. This might be ok if all |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1030 |
# the files in the local directory are being deleted. This |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1031 |
# will be checked once we know what all the deleted files are. |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1032 |
remoteconflicts.add(f) |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1033 |
# Track the names of all deleted files. |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1034 |
if m == ACTION_REMOVE: |
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1035 |
deletedfiles.add(f) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1036 |
if m == ACTION_MERGE: |
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1037 |
f1, f2, fa, move, anc = args |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1038 |
if move: |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1039 |
deletedfiles.add(f1) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1040 |
if m == ACTION_DIR_RENAME_MOVE_LOCAL: |
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1041 |
f2, flags = args |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1042 |
deletedfiles.add(f2) |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1043 |
|
35172
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1044 |
# Check all directories that contain created files for path conflicts. |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1045 |
for p in createdfiledirs: |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1046 |
if p in mf: |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1047 |
if p in mctx: |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1048 |
# A file is in a directory which aliases both a local |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1049 |
# and a remote file. This is an internal inconsistency |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1050 |
# within the remote manifest. |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1051 |
invalidconflicts.add(p) |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1052 |
else: |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1053 |
# A file is in a directory which aliases a local file. |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1054 |
# We will need to rename the local file. |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1055 |
localconflicts.add(p) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1056 |
if p in actions and actions[p][0] in (ACTION_CREATED, |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1057 |
ACTION_DELETED_CHANGED, |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1058 |
ACTION_MERGE, |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1059 |
ACTION_CREATED_MERGE): |
35172
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1060 |
# The file is in a directory which aliases a remote file. |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1061 |
# This is an internal inconsistency within the remote |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1062 |
# manifest. |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1063 |
invalidconflicts.add(p) |
a92b9f8e11ba
merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents:
35171
diff
changeset
|
1064 |
|
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1065 |
# Rename all local conflicting files that have not been deleted. |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1066 |
for p in localconflicts: |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1067 |
if p not in deletedfiles: |
36042
4fe2041007ed
py3: use bytes() to cast context instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36010
diff
changeset
|
1068 |
ctxname = bytes(wctx).rstrip('+') |
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1069 |
pnew = util.safename(p, ctxname, wctx, set(actions.keys())) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1070 |
actions[pnew] = (ACTION_PATH_CONFLICT_RESOLVE, (p,), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1071 |
'local path conflict') |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1072 |
actions[p] = (ACTION_PATH_CONFLICT, (pnew, 'l'), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1073 |
'path conflict') |
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1074 |
|
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1075 |
if remoteconflicts: |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1076 |
# Check if all files in the conflicting directories have been removed. |
36042
4fe2041007ed
py3: use bytes() to cast context instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36010
diff
changeset
|
1077 |
ctxname = bytes(mctx).rstrip('+') |
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1078 |
for f, p in _filesindirs(repo, mf, remoteconflicts): |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1079 |
if f not in deletedfiles: |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1080 |
m, args, msg = actions[p] |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1081 |
pnew = util.safename(p, ctxname, wctx, set(actions.keys())) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1082 |
if m in (ACTION_DELETED_CHANGED, ACTION_MERGE): |
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1083 |
# Action was merge, just update target. |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1084 |
actions[pnew] = (m, args, msg) |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1085 |
else: |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1086 |
# Action was create, change to renamed get action. |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1087 |
fl = args[0] |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1088 |
actions[pnew] = (ACTION_LOCAL_DIR_RENAME_GET, (p, fl), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1089 |
'remote path conflict') |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1090 |
actions[p] = (ACTION_PATH_CONFLICT, (pnew, ACTION_REMOVE), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1091 |
'path conflict') |
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1092 |
remoteconflicts.remove(p) |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1093 |
break |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1094 |
|
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1095 |
if invalidconflicts: |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1096 |
for p in invalidconflicts: |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1097 |
repo.ui.warn(_("%s: is both a file and a directory\n") % p) |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1098 |
raise error.Abort(_("destination manifest contains path conflicts")) |
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1099 |
|
38044
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1100 |
def _filternarrowactions(narrowmatch, branchmerge, actions): |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1101 |
""" |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1102 |
Filters out actions that can ignored because the repo is narrowed. |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1103 |
|
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1104 |
Raise an exception if the merge cannot be completed because the repo is |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1105 |
narrowed. |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1106 |
""" |
42057
566daffc607d
cleanup: use set literals where possible
Martin von Zweigbergk <martinvonz@google.com>
parents:
42040
diff
changeset
|
1107 |
nooptypes = {'k'} # TODO: handle with nonconflicttypes |
38044
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1108 |
nonconflicttypes = set('a am c cm f g r e'.split()) |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1109 |
# We mutate the items in the dict during iteration, so iterate |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1110 |
# over a copy. |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1111 |
for f, action in list(actions.items()): |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1112 |
if narrowmatch(f): |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1113 |
pass |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1114 |
elif not branchmerge: |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1115 |
del actions[f] # just updating, ignore changes outside clone |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1116 |
elif action[0] in nooptypes: |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1117 |
del actions[f] # merge does not affect file |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1118 |
elif action[0] in nonconflicttypes: |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1119 |
raise error.Abort(_('merge affects file \'%s\' outside narrow, ' |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1120 |
'which is not yet supported') % f, |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1121 |
hint=_('merging in the other direction ' |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1122 |
'may work')) |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1123 |
else: |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1124 |
raise error.Abort(_('conflict in file \'%s\' is outside ' |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1125 |
'narrow clone') % f) |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1126 |
|
27346
ba0da4b7397d
merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents:
27345
diff
changeset
|
1127 |
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
|
1128 |
acceptremote, followcopies, forcefulldiff=False): |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
1129 |
""" |
30096
98d3d8108db0
merge: update doc of manifestmerge() per 18c2184c27dc
Yuya Nishihara <yuya@tcha.org>
parents:
30060
diff
changeset
|
1130 |
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
|
1131 |
|
18605
bcf29565d89f
manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents:
18544
diff
changeset
|
1132 |
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
|
1133 |
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
|
1134 |
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
|
1135 |
""" |
27346
ba0da4b7397d
merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents:
27345
diff
changeset
|
1136 |
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
|
1137 |
matcher = None |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
1138 |
|
30581
43a9e02a7b7f
graft: support grafting changes to new file in renamed directory (issue5436)
Gábor Stefanik <gabor.stefanik@nng.com>
parents:
30519
diff
changeset
|
1139 |
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
|
1140 |
|
18651
e556659340f0
manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents:
18650
diff
changeset
|
1141 |
# 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
|
1142 |
[x.manifest() for x in |
32657
9fbd8ad398aa
merge: use scmutil.intrev() to sort ctx objects
Yuya Nishihara <yuya@tcha.org>
parents:
32641
diff
changeset
|
1143 |
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
|
1144 |
|
e556659340f0
manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents:
18650
diff
changeset
|
1145 |
if followcopies: |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
1146 |
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
|
1147 |
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
|
1148 |
|
32641
49e1e5acb8ff
py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32612
diff
changeset
|
1149 |
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
|
1150 |
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
|
1151 |
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
|
1152 |
repo.ui.note(_("resolving manifests\n")) |
18605
bcf29565d89f
manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents:
18544
diff
changeset
|
1153 |
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
|
1154 |
% (boolbm, boolf, boolm)) |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
1155 |
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
|
1156 |
|
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
1157 |
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
|
1158 |
copied = set(copy.values()) |
18134
6c35b53cd28b
copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents:
18042
diff
changeset
|
1159 |
copied.update(movewithdir.values()) |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
1160 |
|
38425
1322ae04d3d7
merge: do not fill manifest of committed revision with pseudo node (issue5526)
Yuya Nishihara <yuya@tcha.org>
parents:
37762
diff
changeset
|
1161 |
if '.hgsubstate' in m1 and wctx.rev() is None: |
1322ae04d3d7
merge: do not fill manifest of committed revision with pseudo node (issue5526)
Yuya Nishihara <yuya@tcha.org>
parents:
37762
diff
changeset
|
1162 |
# Check whether sub state is modified, and overwrite the manifest |
1322ae04d3d7
merge: do not fill manifest of committed revision with pseudo node (issue5526)
Yuya Nishihara <yuya@tcha.org>
parents:
37762
diff
changeset
|
1163 |
# to flag the change. If wctx is a committed revision, we shouldn't |
1322ae04d3d7
merge: do not fill manifest of committed revision with pseudo node (issue5526)
Yuya Nishihara <yuya@tcha.org>
parents:
37762
diff
changeset
|
1164 |
# care for the dirty state of the working directory. |
28226
377f0d8ff874
merge: use any() instead of for loop when checking for dirty subrepos
Martin von Zweigbergk <martinvonz@google.com>
parents:
28200
diff
changeset
|
1165 |
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
|
1166 |
m1['.hgsubstate'] = modifiednodeid |
9783
ee00ef6f9be7
submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents:
9780
diff
changeset
|
1167 |
|
32151
4d504e541d3d
rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents:
31646
diff
changeset
|
1168 |
# Don't use m2-vs-ma optimization if: |
4d504e541d3d
rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents:
31646
diff
changeset
|
1169 |
# - 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
|
1170 |
# - 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
|
1171 |
# merge. |
32498
bd56bea5ecf8
merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents:
32351
diff
changeset
|
1172 |
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
|
1173 |
# 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
|
1174 |
# 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
|
1175 |
# performance benefits in large repositories. |
4d504e541d3d
rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents:
31646
diff
changeset
|
1176 |
relevantfiles = set(ma.diff(m2).keys()) |
4d504e541d3d
rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents:
31646
diff
changeset
|
1177 |
|
4d504e541d3d
rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents:
31646
diff
changeset
|
1178 |
# 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
|
1179 |
for copykey, copyvalue in copy.iteritems(): |
4d504e541d3d
rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents:
31646
diff
changeset
|
1180 |
if copyvalue in relevantfiles: |
4d504e541d3d
rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents:
31646
diff
changeset
|
1181 |
relevantfiles.add(copykey) |
32863
9e3733d93f64
py3: replace dict.iterkeys() with iter(dict)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32657
diff
changeset
|
1182 |
for movedirkey in movewithdir: |
32151
4d504e541d3d
rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents:
31646
diff
changeset
|
1183 |
relevantfiles.add(movedirkey) |
32498
bd56bea5ecf8
merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents:
32351
diff
changeset
|
1184 |
filesmatcher = scmutil.matchfiles(repo, relevantfiles) |
bd56bea5ecf8
merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents:
32351
diff
changeset
|
1185 |
matcher = matchmod.intersectmatchers(matcher, filesmatcher) |
32151
4d504e541d3d
rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents:
31646
diff
changeset
|
1186 |
|
31257
11831d755b51
merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents:
31175
diff
changeset
|
1187 |
diff = m1.diff(m2, match=matcher) |
11831d755b51
merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents:
31175
diff
changeset
|
1188 |
|
23637
13f53a2aa342
merge: write manifestmerge() using dictionary with entry per file
Martin von Zweigbergk <martinvonz@google.com>
parents:
23544
diff
changeset
|
1189 |
actions = {} |
22966
ff93aa006e6a
manifest: transpose pair of pairs from diff()
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22965
diff
changeset
|
1190 |
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
|
1191 |
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
|
1192 |
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
|
1193 |
fa = copy.get(f, None) |
c7c95838be9a
merge: break out "both renamed a -> b" case
Martin von Zweigbergk <martinvonz@google.com>
parents:
23396
diff
changeset
|
1194 |
if fa is not None: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1195 |
actions[f] = (ACTION_MERGE, (f, f, fa, False, pa.node()), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1196 |
'both renamed from %s' % fa) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
1197 |
else: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1198 |
actions[f] = (ACTION_MERGE, (f, f, None, False, pa.node()), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1199 |
'both created') |
16094
0776a6cababe
merge: don't use unknown()
Matt Mackall <mpm@selenic.com>
parents:
16093
diff
changeset
|
1200 |
else: |
23396
6a254a2dd37c
merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents:
23395
diff
changeset
|
1201 |
a = ma[f] |
6a254a2dd37c
merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents:
23395
diff
changeset
|
1202 |
fla = ma.flags(f) |
23395
d9ebb475eede
merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents:
23387
diff
changeset
|
1203 |
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
|
1204 |
if n2 == a and fl2 == fla: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1205 |
actions[f] = (ACTION_KEEP, (), 'remote unchanged') |
23395
d9ebb475eede
merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents:
23387
diff
changeset
|
1206 |
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
|
1207 |
if n1 == n2: # optimization: keep local content |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1208 |
actions[f] = (ACTION_EXEC, (fl2,), 'update permissions') |
23395
d9ebb475eede
merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents:
23387
diff
changeset
|
1209 |
else: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1210 |
actions[f] = (ACTION_GET, (fl2, False), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1211 |
'remote is newer') |
23395
d9ebb475eede
merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents:
23387
diff
changeset
|
1212 |
elif nol and n2 == a: # remote only changed 'x' |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1213 |
actions[f] = (ACTION_EXEC, (fl2,), 'update permissions') |
23395
d9ebb475eede
merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents:
23387
diff
changeset
|
1214 |
elif nol and n1 == a: # local only changed 'x' |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1215 |
actions[f] = (ACTION_GET, (fl1, False), 'remote is newer') |
23395
d9ebb475eede
merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents:
23387
diff
changeset
|
1216 |
else: # both changed something |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1217 |
actions[f] = (ACTION_MERGE, (f, f, f, False, pa.node()), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1218 |
'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
|
1219 |
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
|
1220 |
if f in copied: |
9f4ac44a7273
merge: duplicate 'if f in copied' into each branch
Martin von Zweigbergk <martinvonz@google.com>
parents:
23473
diff
changeset
|
1221 |
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
|
1222 |
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
|
1223 |
f2 = movewithdir[f] |
31515
527a247f114f
merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents:
31475
diff
changeset
|
1224 |
if f2 in m2: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1225 |
actions[f2] = (ACTION_MERGE, (f, f2, None, True, pa.node()), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1226 |
'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
|
1227 |
else: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1228 |
actions[f2] = (ACTION_DIR_RENAME_MOVE_LOCAL, (f, fl1), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1229 |
'remote directory rename - move from %s' % 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
|
1230 |
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
|
1231 |
f2 = copy[f] |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1232 |
actions[f] = (ACTION_MERGE, (f, f2, f2, False, pa.node()), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1233 |
'local copied/moved from %s' % f2) |
23473
922b10c870c5
merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents:
23448
diff
changeset
|
1234 |
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
|
1235 |
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
|
1236 |
if acceptremote: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1237 |
actions[f] = (ACTION_REMOVE, 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
|
1238 |
else: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1239 |
actions[f] = (ACTION_CHANGED_DELETED, |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1240 |
(f, None, f, False, pa.node()), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1241 |
'prompt changed/deleted') |
30361
1070df141718
dirstate: change added/modified placeholder hash length to 20 bytes
Durham Goode <durham@fb.com>
parents:
30332
diff
changeset
|
1242 |
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
|
1243 |
# 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
|
1244 |
# 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
|
1245 |
# deleting it. |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1246 |
actions[f] = (ACTION_FORGET, None, 'remote deleted') |
20639
1df033640a8e
merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents:
20620
diff
changeset
|
1247 |
else: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1248 |
actions[f] = (ACTION_REMOVE, 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
|
1249 |
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
|
1250 |
if f in copied: |
9f4ac44a7273
merge: duplicate 'if f in copied' into each branch
Martin von Zweigbergk <martinvonz@google.com>
parents:
23473
diff
changeset
|
1251 |
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
|
1252 |
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
|
1253 |
f2 = movewithdir[f] |
31515
527a247f114f
merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents:
31475
diff
changeset
|
1254 |
if f2 in m1: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1255 |
actions[f2] = (ACTION_MERGE, |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1256 |
(f2, f, None, False, pa.node()), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1257 |
'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
|
1258 |
else: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1259 |
actions[f2] = (ACTION_LOCAL_DIR_RENAME_GET, (f, fl2), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1260 |
'local directory rename - get from %s' % 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
|
1261 |
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
|
1262 |
f2 = copy[f] |
31515
527a247f114f
merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents:
31475
diff
changeset
|
1263 |
if f2 in m2: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1264 |
actions[f] = (ACTION_MERGE, (f2, f, f2, False, pa.node()), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1265 |
'remote copied from %s' % f2) |
23473
922b10c870c5
merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents:
23448
diff
changeset
|
1266 |
else: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1267 |
actions[f] = (ACTION_MERGE, (f2, f, f2, True, pa.node()), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1268 |
'remote moved from %s' % f2) |
23473
922b10c870c5
merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents:
23448
diff
changeset
|
1269 |
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
|
1270 |
# 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
|
1271 |
# 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
|
1272 |
# |
922b10c870c5
merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents:
23448
diff
changeset
|
1273 |
# 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
|
1274 |
# n * * | create |
23650
b85c548ab14d
merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents:
23649
diff
changeset
|
1275 |
# y n * | create |
b85c548ab14d
merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents:
23649
diff
changeset
|
1276 |
# 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
|
1277 |
# 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
|
1278 |
# |
922b10c870c5
merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents:
23448
diff
changeset
|
1279 |
# 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
|
1280 |
# 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
|
1281 |
if not force: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1282 |
actions[f] = (ACTION_CREATED, (fl2,), 'remote created') |
23649
18ab5e5955df
merge: structure 'remote created' code to match table
Martin von Zweigbergk <martinvonz@google.com>
parents:
23641
diff
changeset
|
1283 |
elif not branchmerge: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1284 |
actions[f] = (ACTION_CREATED, (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
|
1285 |
else: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1286 |
actions[f] = (ACTION_CREATED_MERGE, (fl2, pa.node()), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1287 |
'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
|
1288 |
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
|
1289 |
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
|
1290 |
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
|
1291 |
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
|
1292 |
# 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
|
1293 |
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
|
1294 |
break |
31515
527a247f114f
merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents:
31475
diff
changeset
|
1295 |
if df is not None and df in m1: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1296 |
actions[df] = (ACTION_MERGE, (df, f, f, False, pa.node()), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1297 |
'local directory rename - respect move ' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1298 |
'from %s' % 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
|
1299 |
elif acceptremote: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1300 |
actions[f] = (ACTION_CREATED, (fl2,), 'remote recreating') |
18606
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
1301 |
else: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1302 |
actions[f] = (ACTION_DELETED_CHANGED, |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1303 |
(None, f, f, False, pa.node()), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1304 |
'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
|
1305 |
|
34941
37450a122128
merge: add a config option to disable path conflict checking
Siddharth Agarwal <sid0@fb.com>
parents:
34919
diff
changeset
|
1306 |
if repo.ui.configbool('experimental', 'merge.checkpathconflicts'): |
37450a122128
merge: add a config option to disable path conflict checking
Siddharth Agarwal <sid0@fb.com>
parents:
34919
diff
changeset
|
1307 |
# If we are merging, look for path conflicts. |
37450a122128
merge: add a config option to disable path conflict checking
Siddharth Agarwal <sid0@fb.com>
parents:
34919
diff
changeset
|
1308 |
checkpathconflicts(repo, wctx, p2, actions) |
34555
989e884d1be9
merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents:
34553
diff
changeset
|
1309 |
|
38044
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1310 |
narrowmatch = repo.narrowmatch() |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1311 |
if not narrowmatch.always(): |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1312 |
# Updates "actions" in place |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1313 |
_filternarrowactions(narrowmatch, branchmerge, actions) |
8f37b5fc5abf
narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents:
37959
diff
changeset
|
1314 |
|
23526
a5887f2da5e6
merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents:
23525
diff
changeset
|
1315 |
return actions, diverge, renamedelete |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
1316 |
|
23531
416c133145ee
merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
23526
diff
changeset
|
1317 |
def _resolvetrivial(repo, wctx, mctx, ancestor, actions): |
416c133145ee
merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
23526
diff
changeset
|
1318 |
"""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
|
1319 |
remained the same.""" |
36316
759579bac31d
merge: make a copy of dict.items() before mutating the dict during iteration
Augie Fackler <augie@google.com>
parents:
36177
diff
changeset
|
1320 |
# We force a copy of actions.items() because we're going to mutate |
759579bac31d
merge: make a copy of dict.items() before mutating the dict during iteration
Augie Fackler <augie@google.com>
parents:
36177
diff
changeset
|
1321 |
# actions as we resolve trivial conflicts. |
759579bac31d
merge: make a copy of dict.items() before mutating the dict during iteration
Augie Fackler <augie@google.com>
parents:
36177
diff
changeset
|
1322 |
for f, (m, args, msg) in list(actions.items()): |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1323 |
if (m == ACTION_CHANGED_DELETED and f in ancestor |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1324 |
and not wctx[f].cmp(ancestor[f])): |
23531
416c133145ee
merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
23526
diff
changeset
|
1325 |
# local did change but ended up with same content |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1326 |
actions[f] = ACTION_REMOVE, None, 'prompt same' |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1327 |
elif (m == ACTION_DELETED_CHANGED and f in ancestor |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1328 |
and not mctx[f].cmp(ancestor[f])): |
23531
416c133145ee
merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
23526
diff
changeset
|
1329 |
# 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
|
1330 |
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
|
1331 |
|
27345
98266b1d144d
merge: restate calculateupdates in terms of a matcher
Augie Fackler <augie@google.com>
parents:
27344
diff
changeset
|
1332 |
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
|
1333 |
acceptremote, followcopies, matcher=None, |
cffa46cbdb8f
merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents:
28019
diff
changeset
|
1334 |
mergeforce=False): |
33323
252500520d60
sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
1335 |
"""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
|
1336 |
# Avoid cycle. |
252500520d60
sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
1337 |
from . import sparse |
252500520d60
sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
1338 |
|
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1339 |
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
|
1340 |
actions, diverge, renamedelete = manifestmerge( |
27346
ba0da4b7397d
merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents:
27345
diff
changeset
|
1341 |
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
|
1342 |
acceptremote, followcopies) |
28020
cffa46cbdb8f
merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents:
28019
diff
changeset
|
1343 |
_checkunknownfiles(repo, wctx, mctx, force, actions, mergeforce) |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1344 |
|
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1345 |
else: # only when merge.preferancestor=* - the default |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1346 |
repo.ui.note( |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1347 |
_("note: merging %s and %s using bids from ancestors %s\n") % |
34349
6f49ea88d984
py3: use pycompat.bytestr instead of str
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34348
diff
changeset
|
1348 |
(wctx, mctx, _(' and ').join(pycompat.bytestr(anc) |
6f49ea88d984
py3: use pycompat.bytestr instead of str
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34348
diff
changeset
|
1349 |
for anc in ancestors))) |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1350 |
|
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1351 |
# Call for bids |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1352 |
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
|
1353 |
diverge, renamedelete = None, None |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1354 |
for ancestor in ancestors: |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1355 |
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
|
1356 |
actions, diverge1, renamedelete1 = manifestmerge( |
27346
ba0da4b7397d
merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents:
27345
diff
changeset
|
1357 |
repo, wctx, mctx, ancestor, branchmerge, force, matcher, |
32151
4d504e541d3d
rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents:
31646
diff
changeset
|
1358 |
acceptremote, followcopies, forcefulldiff=True) |
28020
cffa46cbdb8f
merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents:
28019
diff
changeset
|
1359 |
_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
|
1360 |
|
d3bd6cefd742
bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents:
26304
diff
changeset
|
1361 |
# 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
|
1362 |
# 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
|
1363 |
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
|
1364 |
diverge = diverge1 |
26318
d3bd6cefd742
bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents:
26304
diff
changeset
|
1365 |
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
|
1366 |
renamedelete = renamedelete1 |
26318
d3bd6cefd742
bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents:
26304
diff
changeset
|
1367 |
|
23638
09be050ca98c
merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23637
diff
changeset
|
1368 |
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
|
1369 |
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
|
1370 |
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
|
1371 |
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
|
1372 |
d = fbids[f] |
09be050ca98c
merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23637
diff
changeset
|
1373 |
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
|
1374 |
d[m].append(a) |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1375 |
else: |
23638
09be050ca98c
merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23637
diff
changeset
|
1376 |
d[m] = [a] |
09be050ca98c
merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23637
diff
changeset
|
1377 |
else: |
09be050ca98c
merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23637
diff
changeset
|
1378 |
fbids[f] = {m: [a]} |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1379 |
|
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1380 |
# Pick the best bid for each file |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1381 |
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
|
1382 |
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
|
1383 |
dms = [] # filenames that have dm actions |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1384 |
for f, bids in sorted(fbids.items()): |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1385 |
# 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
|
1386 |
# Consensus? |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1387 |
if len(bids) == 1: # all bids are the same kind of method |
34348
1a5abc45e2fa
py3: explicitly convert dict.keys() and dict.items() into a list
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34302
diff
changeset
|
1388 |
m, l = list(bids.items())[0] |
25151
6eb4bdad198f
cleanup: use __builtins__.all instead of util.all
Augie Fackler <augie@google.com>
parents:
24881
diff
changeset
|
1389 |
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
|
1390 |
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
|
1391 |
actions[f] = l[0] |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1392 |
if m == ACTION_DIR_RENAME_MOVE_LOCAL: |
30856
41f6af50c0d8
merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents:
30581
diff
changeset
|
1393 |
dms.append(f) |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1394 |
continue |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1395 |
# If keep is an option, just do it. |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1396 |
if ACTION_KEEP in bids: |
29242
4d075bf28702
merge: make messages translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29216
diff
changeset
|
1397 |
repo.ui.note(_(" %s: picking 'keep' action\n") % f) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1398 |
actions[f] = bids[ACTION_KEEP][0] |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1399 |
continue |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1400 |
# If there are gets and they all agree [how could they not?], do it. |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1401 |
if ACTION_GET in bids: |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1402 |
ga0 = bids[ACTION_GET][0] |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1403 |
if all(a == ga0 for a in bids[ACTION_GET][1:]): |
29242
4d075bf28702
merge: make messages translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29216
diff
changeset
|
1404 |
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
|
1405 |
actions[f] = ga0 |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1406 |
continue |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1407 |
# 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
|
1408 |
# Handle inefficient democrazy. |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1409 |
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
|
1410 |
for m, l in sorted(bids.items()): |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1411 |
for _f, args, msg in l: |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1412 |
repo.ui.note(' %s -> %s\n' % (msg, m)) |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1413 |
# Pick random action. TODO: Instead, prompt user when resolving |
34348
1a5abc45e2fa
py3: explicitly convert dict.keys() and dict.items() into a list
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34302
diff
changeset
|
1414 |
m, l = list(bids.items())[0] |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1415 |
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
|
1416 |
(f, m)) |
23638
09be050ca98c
merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23637
diff
changeset
|
1417 |
actions[f] = l[0] |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1418 |
if m == ACTION_DIR_RENAME_MOVE_LOCAL: |
30856
41f6af50c0d8
merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents:
30581
diff
changeset
|
1419 |
dms.append(f) |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1420 |
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
|
1421 |
# 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
|
1422 |
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
|
1423 |
dm, (f0, flags), msg = actions[f] |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1424 |
assert dm == ACTION_DIR_RENAME_MOVE_LOCAL, dm |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1425 |
if f0 in actions and actions[f0][0] == ACTION_REMOVE: |
30856
41f6af50c0d8
merge: fix crash on criss cross merge with dir move and delete (issue5020)
Mads Kiilerich <mads@kiilerich.com>
parents:
30581
diff
changeset
|
1426 |
# 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
|
1427 |
# 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
|
1428 |
# 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
|
1429 |
del actions[f] |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1430 |
repo.ui.note(_('end of auction\n\n')) |
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1431 |
|
23640
b46b9865dd08
merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23639
diff
changeset
|
1432 |
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
|
1433 |
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
|
1434 |
actions.update(fractions) |
b46b9865dd08
merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23639
diff
changeset
|
1435 |
|
33323
252500520d60
sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
1436 |
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
|
1437 |
actions) |
38757
d49e490a9e85
merge: do the trivial resolution after updating sparse checkout
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38732
diff
changeset
|
1438 |
_resolvetrivial(repo, wctx, mctx, ancestors[0], actions) |
33323
252500520d60
sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
1439 |
|
252500520d60
sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33321
diff
changeset
|
1440 |
return prunedactions, diverge, renamedelete |
23385
91c24457c16a
merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23384
diff
changeset
|
1441 |
|
34142
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1442 |
def _getcwd(): |
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1443 |
try: |
39818
24e493ec2229
py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents:
39464
diff
changeset
|
1444 |
return encoding.getcwd() |
34142
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1445 |
except OSError as err: |
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1446 |
if err.errno == errno.ENOENT: |
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1447 |
return None |
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1448 |
raise |
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1449 |
|
33081
6582dc01aca3
merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com>
parents:
32863
diff
changeset
|
1450 |
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
|
1451 |
"""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
|
1452 |
|
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
1453 |
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
|
1454 |
""" |
18640
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
1455 |
verbose = repo.ui.verbose |
34142
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1456 |
cwd = _getcwd() |
18633
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
1457 |
i = 0 |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
1458 |
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
|
1459 |
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
|
1460 |
if verbose: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1461 |
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
|
1462 |
wctx[f].audit() |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1463 |
try: |
33082
f9e50ee4c52b
merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents:
33081
diff
changeset
|
1464 |
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
|
1465 |
except OSError as inst: |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1466 |
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
|
1467 |
(f, inst.strerror)) |
21392
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
1468 |
if i == 100: |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
1469 |
yield i, f |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
1470 |
i = 0 |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
1471 |
i += 1 |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
1472 |
if i > 0: |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
1473 |
yield i, f |
34142
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1474 |
|
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1475 |
if cwd and not _getcwd(): |
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1476 |
# cwd was removed in the course of removing files; print a helpful |
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1477 |
# warning. |
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1478 |
repo.ui.warn(_("current directory was removed\n" |
24bf823377fc
merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents:
34125
diff
changeset
|
1479 |
"(consider changing to repo root: %s)\n") % repo.root) |
21392
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
1480 |
|
33081
6582dc01aca3
merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com>
parents:
32863
diff
changeset
|
1481 |
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
|
1482 |
"""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
|
1483 |
|
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
1484 |
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
|
1485 |
|
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
1486 |
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
|
1487 |
""" |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
1488 |
verbose = repo.ui.verbose |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
1489 |
fctx = mctx.filectx |
27656
57c0d4888ca8
batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents:
27655
diff
changeset
|
1490 |
ui = repo.ui |
21392
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
1491 |
i = 0 |
28200
588695ccbb22
merge: perform background file closing in batchget
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28199
diff
changeset
|
1492 |
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
|
1493 |
for f, (flags, backup), msg in actions: |
d49793aac1ac
merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28088
diff
changeset
|
1494 |
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
|
1495 |
if verbose: |
d49793aac1ac
merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28088
diff
changeset
|
1496 |
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
|
1497 |
|
28199
d49793aac1ac
merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28088
diff
changeset
|
1498 |
if backup: |
34549
a991e1d6bc82
merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents:
34548
diff
changeset
|
1499 |
# If a file or directory exists with the same name, back that |
a991e1d6bc82
merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents:
34548
diff
changeset
|
1500 |
# up. Otherwise, look to see if there is a file that conflicts |
a991e1d6bc82
merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents:
34548
diff
changeset
|
1501 |
# with a directory this file is in, and if so, back that up. |
41570
1f2714052d7e
merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents:
41569
diff
changeset
|
1502 |
conflicting = f |
34549
a991e1d6bc82
merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents:
34548
diff
changeset
|
1503 |
if not repo.wvfs.lexists(f): |
a991e1d6bc82
merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents:
34548
diff
changeset
|
1504 |
for p in util.finddirs(f): |
a991e1d6bc82
merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents:
34548
diff
changeset
|
1505 |
if repo.wvfs.isfileorlink(p): |
41570
1f2714052d7e
merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents:
41569
diff
changeset
|
1506 |
conflicting = p |
34549
a991e1d6bc82
merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents:
34548
diff
changeset
|
1507 |
break |
41570
1f2714052d7e
merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents:
41569
diff
changeset
|
1508 |
if repo.wvfs.lexists(conflicting): |
41601
ac8cf125d8d5
merge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41570
diff
changeset
|
1509 |
orig = scmutil.backuppath(ui, repo, conflicting) |
ac8cf125d8d5
merge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41570
diff
changeset
|
1510 |
util.rename(repo.wjoin(conflicting), orig) |
34037
65ae54582713
merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents:
33808
diff
changeset
|
1511 |
wctx[f].clearunknown() |
35726
45b678bf3a78
atomicupdate: add an experimental option to use atomictemp when updating
Boris Feld <boris.feld@octobus.net>
parents:
35500
diff
changeset
|
1512 |
atomictemp = ui.configbool("experimental", "update.atomic-file") |
45b678bf3a78
atomicupdate: add an experimental option to use atomictemp when updating
Boris Feld <boris.feld@octobus.net>
parents:
35500
diff
changeset
|
1513 |
wctx[f].write(fctx(f).data(), flags, backgroundclose=True, |
45b678bf3a78
atomicupdate: add an experimental option to use atomictemp when updating
Boris Feld <boris.feld@octobus.net>
parents:
35500
diff
changeset
|
1514 |
atomictemp=atomictemp) |
28199
d49793aac1ac
merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28088
diff
changeset
|
1515 |
if i == 100: |
d49793aac1ac
merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28088
diff
changeset
|
1516 |
yield i, f |
d49793aac1ac
merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28088
diff
changeset
|
1517 |
i = 0 |
d49793aac1ac
merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28088
diff
changeset
|
1518 |
i += 1 |
18633
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
1519 |
if i > 0: |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
1520 |
yield i, f |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
1521 |
|
36142
60dd840a7fdb
merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
36042
diff
changeset
|
1522 |
def _prefetchfiles(repo, ctx, actions): |
37762
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37172
diff
changeset
|
1523 |
"""Invoke ``scmutil.prefetchfiles()`` for the files relevant to the dict |
36142
60dd840a7fdb
merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
36042
diff
changeset
|
1524 |
of merge actions. ``ctx`` is the context being merged in.""" |
60dd840a7fdb
merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
36042
diff
changeset
|
1525 |
|
60dd840a7fdb
merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
36042
diff
changeset
|
1526 |
# Skipping 'a', 'am', 'f', 'r', 'dm', 'e', 'k', 'p' and 'pr', because they |
60dd840a7fdb
merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
36042
diff
changeset
|
1527 |
# don't touch the context to be merged in. 'cd' is skipped, because |
60dd840a7fdb
merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
36042
diff
changeset
|
1528 |
# changed/deleted never resolves to something from the remote side. |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1529 |
oplist = [actions[a] for a in (ACTION_GET, ACTION_DELETED_CHANGED, |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1530 |
ACTION_LOCAL_DIR_RENAME_GET, ACTION_MERGE)] |
37762
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37172
diff
changeset
|
1531 |
prefetch = scmutil.prefetchfiles |
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37172
diff
changeset
|
1532 |
matchfiles = scmutil.matchfiles |
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37172
diff
changeset
|
1533 |
prefetch(repo, [ctx.rev()], |
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37172
diff
changeset
|
1534 |
matchfiles(repo, |
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37172
diff
changeset
|
1535 |
[f for sublist in oplist for f, args, msg in sublist])) |
34124
b90e5b2a9c82
merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents:
34122
diff
changeset
|
1536 |
|
37107
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
1537 |
@attr.s(frozen=True) |
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
1538 |
class updateresult(object): |
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
1539 |
updatedcount = attr.ib() |
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
1540 |
mergedcount = attr.ib() |
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
1541 |
removedcount = attr.ib() |
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
1542 |
unresolvedcount = attr.ib() |
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
1543 |
|
37125
6f570c501e3e
merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37112
diff
changeset
|
1544 |
def isempty(self): |
41050
6faaf3a1c6ec
merge: modify the logical statement
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
41039
diff
changeset
|
1545 |
return not (self.updatedcount or self.mergedcount |
6faaf3a1c6ec
merge: modify the logical statement
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
41039
diff
changeset
|
1546 |
or self.removedcount or self.unresolvedcount) |
37125
6f570c501e3e
merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37112
diff
changeset
|
1547 |
|
41039
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1548 |
def emptyactions(): |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1549 |
"""create an actions dict, to be populated and passed to applyupdates()""" |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1550 |
return dict((m, []) |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1551 |
for m in ( |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1552 |
ACTION_ADD, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1553 |
ACTION_ADD_MODIFIED, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1554 |
ACTION_FORGET, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1555 |
ACTION_GET, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1556 |
ACTION_CHANGED_DELETED, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1557 |
ACTION_DELETED_CHANGED, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1558 |
ACTION_REMOVE, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1559 |
ACTION_DIR_RENAME_MOVE_LOCAL, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1560 |
ACTION_LOCAL_DIR_RENAME_GET, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1561 |
ACTION_MERGE, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1562 |
ACTION_EXEC, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1563 |
ACTION_KEEP, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1564 |
ACTION_PATH_CONFLICT, |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1565 |
ACTION_PATH_CONFLICT_RESOLVE)) |
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
1566 |
|
21524
47b97d9af27e
merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents:
21392
diff
changeset
|
1567 |
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
|
1568 |
"""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
|
1569 |
|
9b0406b23be0
merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
11451
diff
changeset
|
1570 |
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
|
1571 |
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
|
1572 |
|
115a9760c382
merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents:
13158
diff
changeset
|
1573 |
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
|
1574 |
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
|
1575 |
""" |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
1576 |
|
36142
60dd840a7fdb
merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
36042
diff
changeset
|
1577 |
_prefetchfiles(repo, mctx, actions) |
60dd840a7fdb
merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
36042
diff
changeset
|
1578 |
|
27078
a421debae31d
merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents:
27077
diff
changeset
|
1579 |
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
|
1580 |
ms = mergestate.clean(repo, wctx.p1().node(), mctx.node(), labels) |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
1581 |
moves = [] |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
1582 |
for m, l in actions.items(): |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
1583 |
l.sort() |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
1584 |
|
27137
25e4b2f000c5
merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents:
27132
diff
changeset
|
1585 |
# 'cd' and 'dc' actions are treated like other merge conflicts |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1586 |
mergeactions = sorted(actions[ACTION_CHANGED_DELETED]) |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1587 |
mergeactions.extend(sorted(actions[ACTION_DELETED_CHANGED])) |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1588 |
mergeactions.extend(actions[ACTION_MERGE]) |
27137
25e4b2f000c5
merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents:
27132
diff
changeset
|
1589 |
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
|
1590 |
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
|
1591 |
if f == '.hgsubstate': # merged internally |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1592 |
continue |
27091
2ce00de5cc0e
merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27090
diff
changeset
|
1593 |
if f1 is None: |
2ce00de5cc0e
merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27090
diff
changeset
|
1594 |
fcl = filemerge.absentfilectx(wctx, fa) |
2ce00de5cc0e
merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27090
diff
changeset
|
1595 |
else: |
2ce00de5cc0e
merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27090
diff
changeset
|
1596 |
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
|
1597 |
fcl = wctx[f1] |
2ce00de5cc0e
merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27090
diff
changeset
|
1598 |
if f2 is None: |
2ce00de5cc0e
merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27090
diff
changeset
|
1599 |
fco = filemerge.absentfilectx(mctx, fa) |
2ce00de5cc0e
merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27090
diff
changeset
|
1600 |
else: |
2ce00de5cc0e
merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27090
diff
changeset
|
1601 |
fco = mctx[f2] |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1602 |
actx = repo[anc] |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1603 |
if fa in actx: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1604 |
fca = actx[fa] |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1605 |
else: |
27091
2ce00de5cc0e
merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27090
diff
changeset
|
1606 |
# TODO: move to absentfilectx |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1607 |
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
|
1608 |
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
|
1609 |
if f1 != f and move: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1610 |
moves.append(f1) |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
1611 |
|
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
1612 |
# remove renamed files after safely stored |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
1613 |
for f in moves: |
33283
634b259079c5
workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents:
33146
diff
changeset
|
1614 |
if wctx[f].lexists(): |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9048
diff
changeset
|
1615 |
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
|
1616 |
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
|
1617 |
wctx[f].remove() |
5042
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
1618 |
|
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1619 |
numupdates = sum(len(l) for m, l in actions.items() |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1620 |
if m != ACTION_KEEP) |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1621 |
progress = repo.ui.makeprogress(_('updating'), unit=_('files'), |
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1622 |
total=numupdates) |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
1623 |
|
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1624 |
if [a for a in actions[ACTION_REMOVE] if a[0] == '.hgsubstate']: |
36009
55e8efa2451a
subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
35726
diff
changeset
|
1625 |
subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels) |
18632
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
1626 |
|
34547
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34545
diff
changeset
|
1627 |
# record path conflicts |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1628 |
for f, args, msg in actions[ACTION_PATH_CONFLICT]: |
34547
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34545
diff
changeset
|
1629 |
f1, fo = args |
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34545
diff
changeset
|
1630 |
s = repo.ui.status |
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34545
diff
changeset
|
1631 |
s(_("%s: path conflict - a file or link has the same name as a " |
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34545
diff
changeset
|
1632 |
"directory\n") % f) |
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34545
diff
changeset
|
1633 |
if fo == 'l': |
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34545
diff
changeset
|
1634 |
s(_("the local file has been renamed to %s\n") % f1) |
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34545
diff
changeset
|
1635 |
else: |
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34545
diff
changeset
|
1636 |
s(_("the remote file has been renamed to %s\n") % f1) |
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34545
diff
changeset
|
1637 |
s(_("resolve manually then use 'hg resolve --mark %s'\n") % f) |
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34545
diff
changeset
|
1638 |
ms.addpath(f, f1, fo) |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1639 |
progress.increment(item=f) |
34547
81aebcc73beb
merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents:
34545
diff
changeset
|
1640 |
|
34786
9c899660700a
merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents:
34680
diff
changeset
|
1641 |
# When merging in-memory, we can't support worker processes, so set the |
9c899660700a
merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents:
34680
diff
changeset
|
1642 |
# per-item cost at 0 in that case. |
9c899660700a
merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents:
34680
diff
changeset
|
1643 |
cost = 0 if wctx.isinmemory() else 0.001 |
9c899660700a
merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents:
34680
diff
changeset
|
1644 |
|
34548
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1645 |
# remove in parallel (must come before resolving path conflicts and getting) |
34786
9c899660700a
merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents:
34680
diff
changeset
|
1646 |
prog = worker.worker(repo.ui, cost, batchremove, (repo, wctx), |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1647 |
actions[ACTION_REMOVE]) |
19095
5cc71484ee9c
merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18985
diff
changeset
|
1648 |
for i, item in prog: |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1649 |
progress.increment(step=i, item=item) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1650 |
removed = len(actions[ACTION_REMOVE]) |
21390
26b84128c54d
merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents:
21389
diff
changeset
|
1651 |
|
34548
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1652 |
# resolve path conflicts (must come before getting) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1653 |
for f, args, msg in actions[ACTION_PATH_CONFLICT_RESOLVE]: |
34548
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1654 |
repo.ui.debug(" %s: %s -> pr\n" % (f, msg)) |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1655 |
f0, = args |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1656 |
if wctx[f0].lexists(): |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1657 |
repo.ui.note(_("moving %s to %s\n") % (f0, f)) |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1658 |
wctx[f].audit() |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1659 |
wctx[f].write(wctx.filectx(f0).data(), wctx.filectx(f0).flags()) |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1660 |
wctx[f0].remove() |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1661 |
progress.increment(item=f) |
34548
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1662 |
|
38732
be4984261611
merge: mark file gets as not thread safe (issue5933)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38494
diff
changeset
|
1663 |
# get in parallel. |
be4984261611
merge: mark file gets as not thread safe (issue5933)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38494
diff
changeset
|
1664 |
threadsafe = repo.ui.configbool('experimental', |
be4984261611
merge: mark file gets as not thread safe (issue5933)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38494
diff
changeset
|
1665 |
'worker.wdir-get-thread-safe') |
34786
9c899660700a
merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents:
34680
diff
changeset
|
1666 |
prog = worker.worker(repo.ui, cost, batchget, (repo, mctx, wctx), |
38732
be4984261611
merge: mark file gets as not thread safe (issue5933)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38494
diff
changeset
|
1667 |
actions[ACTION_GET], |
be4984261611
merge: mark file gets as not thread safe (issue5933)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38494
diff
changeset
|
1668 |
threadsafe=threadsafe) |
18639
5774732bb5e5
merge: apply non-interactive working dir updates in parallel
Bryan O'Sullivan <bryano@fb.com>
parents:
18633
diff
changeset
|
1669 |
for i, item in prog: |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1670 |
progress.increment(step=i, item=item) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1671 |
updated = len(actions[ACTION_GET]) |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
1672 |
|
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1673 |
if [a for a in actions[ACTION_GET] if a[0] == '.hgsubstate']: |
36009
55e8efa2451a
subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
35726
diff
changeset
|
1674 |
subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels) |
18632
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
1675 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1676 |
# forget (manifest only, just log it) (must come first) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1677 |
for f, args, msg in actions[ACTION_FORGET]: |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1678 |
repo.ui.debug(" %s: %s -> f\n" % (f, msg)) |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1679 |
progress.increment(item=f) |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
1680 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1681 |
# re-add (manifest only, just log it) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1682 |
for f, args, msg in actions[ACTION_ADD]: |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1683 |
repo.ui.debug(" %s: %s -> a\n" % (f, msg)) |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1684 |
progress.increment(item=f) |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
1685 |
|
27131
d837da26155e
merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents:
27130
diff
changeset
|
1686 |
# re-add/mark as modified (manifest only, just log it) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1687 |
for f, args, msg in actions[ACTION_ADD_MODIFIED]: |
27131
d837da26155e
merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents:
27130
diff
changeset
|
1688 |
repo.ui.debug(" %s: %s -> am\n" % (f, msg)) |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1689 |
progress.increment(item=f) |
27131
d837da26155e
merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents:
27130
diff
changeset
|
1690 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1691 |
# keep (noop, just log it) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1692 |
for f, args, msg in actions[ACTION_KEEP]: |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1693 |
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
|
1694 |
# no progress |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
1695 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1696 |
# directory rename, move local |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1697 |
for f, args, msg in actions[ACTION_DIR_RENAME_MOVE_LOCAL]: |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1698 |
repo.ui.debug(" %s: %s -> dm\n" % (f, msg)) |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1699 |
progress.increment(item=f) |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1700 |
f0, flags = args |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1701 |
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
|
1702 |
wctx[f].audit() |
33083
05c680ebf512
merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com>
parents:
33082
diff
changeset
|
1703 |
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
|
1704 |
wctx[f0].remove() |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1705 |
updated += 1 |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
1706 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1707 |
# local directory rename, get |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1708 |
for f, args, msg in actions[ACTION_LOCAL_DIR_RENAME_GET]: |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1709 |
repo.ui.debug(" %s: %s -> dg\n" % (f, msg)) |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1710 |
progress.increment(item=f) |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1711 |
f0, flags = args |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1712 |
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
|
1713 |
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
|
1714 |
updated += 1 |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
1715 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1716 |
# exec |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1717 |
for f, args, msg in actions[ACTION_EXEC]: |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1718 |
repo.ui.debug(" %s: %s -> e\n" % (f, msg)) |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1719 |
progress.increment(item=f) |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1720 |
flags, = args |
33086
eb4c49f55f1f
workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents:
33085
diff
changeset
|
1721 |
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
|
1722 |
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
|
1723 |
updated += 1 |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
1724 |
|
26786
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1725 |
# 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
|
1726 |
# 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
|
1727 |
# True |
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1728 |
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
|
1729 |
|
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1730 |
if usemergedriver: |
35500
87918218da70
merge: raise before running mergedriver if using IMM
Phil Cohen <phillco@fb.com>
parents:
35288
diff
changeset
|
1731 |
if wctx.isinmemory(): |
87918218da70
merge: raise before running mergedriver if using IMM
Phil Cohen <phillco@fb.com>
parents:
35288
diff
changeset
|
1732 |
raise error.InMemoryMergeConflictsError("in-memory merge does not " |
87918218da70
merge: raise before running mergedriver if using IMM
Phil Cohen <phillco@fb.com>
parents:
35288
diff
changeset
|
1733 |
"support mergedriver") |
26786
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1734 |
ms.commit() |
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1735 |
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
|
1736 |
# 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
|
1737 |
unresolvedf = set(ms.unresolved()) |
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1738 |
if not proceed: |
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1739 |
# 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
|
1740 |
# error out |
37107
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
1741 |
return updateresult(updated, merged, removed, |
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
1742 |
max(len(unresolvedf), 1)) |
26786
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1743 |
newactions = [] |
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1744 |
for f, args, msg in mergeactions: |
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1745 |
if f in unresolvedf: |
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1746 |
newactions.append((f, args, msg)) |
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1747 |
mergeactions = newactions |
121f80d14e4b
merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26785
diff
changeset
|
1748 |
|
34680
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1749 |
try: |
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1750 |
# premerge |
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1751 |
tocomplete = [] |
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1752 |
for f, args, msg in mergeactions: |
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1753 |
repo.ui.debug(" %s: %s -> m (premerge)\n" % (f, msg)) |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1754 |
progress.increment(item=f) |
34680
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1755 |
if f == '.hgsubstate': # subrepo states need updating |
36009
55e8efa2451a
subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
35726
diff
changeset
|
1756 |
subrepoutil.submerge(repo, wctx, mctx, wctx.ancestor(mctx), |
55e8efa2451a
subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
35726
diff
changeset
|
1757 |
overwrite, labels) |
34680
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1758 |
continue |
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1759 |
wctx[f].audit() |
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1760 |
complete, r = ms.preresolve(f, wctx) |
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1761 |
if not complete: |
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1762 |
numupdates += 1 |
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1763 |
tocomplete.append((f, args, msg)) |
26618
8e6d5b7317e6
merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
26617
diff
changeset
|
1764 |
|
34680
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1765 |
# merge |
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1766 |
for f, args, msg in tocomplete: |
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1767 |
repo.ui.debug(" %s: %s -> m (merge)\n" % (f, msg)) |
38345
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38045
diff
changeset
|
1768 |
progress.increment(item=f, total=numupdates) |
34680
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1769 |
ms.resolve(f, wctx) |
26292
007ac1acfcac
merge: move merge step to the end
Siddharth Agarwal <sid0@fb.com>
parents:
25959
diff
changeset
|
1770 |
|
34680
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1771 |
finally: |
c0a524f77e8a
merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents:
34560
diff
changeset
|
1772 |
ms.commit() |
26787
64848559413a
merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26786
diff
changeset
|
1773 |
|
27078
a421debae31d
merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents:
27077
diff
changeset
|
1774 |
unresolved = ms.unresolvedcount() |
a421debae31d
merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents:
27077
diff
changeset
|
1775 |
|
37110
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
1776 |
if (usemergedriver and not unresolved |
1b158ca37ea4
merge: use constants for merge driver state
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37109
diff
changeset
|
1777 |
and ms.mdstate() != MERGE_DRIVER_STATE_SUCCESS): |
26787
64848559413a
merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26786
diff
changeset
|
1778 |
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
|
1779 |
# 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
|
1780 |
# 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
|
1781 |
unresolved = max(unresolved, 1) |
26787
64848559413a
merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26786
diff
changeset
|
1782 |
|
64848559413a
merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26786
diff
changeset
|
1783 |
ms.commit() |
64848559413a
merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents:
26786
diff
changeset
|
1784 |
|
27078
a421debae31d
merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents:
27077
diff
changeset
|
1785 |
msupdated, msmerged, msremoved = ms.counts() |
a421debae31d
merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents:
27077
diff
changeset
|
1786 |
updated += msupdated |
a421debae31d
merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents:
27077
diff
changeset
|
1787 |
merged += msmerged |
a421debae31d
merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents:
27077
diff
changeset
|
1788 |
removed += msremoved |
27080
ae2d3782d818
merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents:
27079
diff
changeset
|
1789 |
|
ae2d3782d818
merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents:
27079
diff
changeset
|
1790 |
extraactions = ms.actions() |
29831
1316c7cccc76
merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents:
29775
diff
changeset
|
1791 |
if extraactions: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1792 |
mfiles = set(a[0] for a in actions[ACTION_MERGE]) |
29831
1316c7cccc76
merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents:
29775
diff
changeset
|
1793 |
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
|
1794 |
actions[k].extend(acts) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1795 |
# Remove these files from actions[ACTION_MERGE] as well. This is |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1796 |
# important because in recordupdates, files in actions[ACTION_MERGE] |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1797 |
# are processed after files in other actions, and the merge driver |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1798 |
# might add files to those actions via extraactions above. This can |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1799 |
# lead to a file being recorded twice, with poor results. This is |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1800 |
# especially problematic for actions[ACTION_REMOVE] (currently only |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1801 |
# possible with the merge driver in the initial merge process; |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1802 |
# interrupted merges don't go through this flow). |
29831
1316c7cccc76
merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents:
29775
diff
changeset
|
1803 |
# |
1316c7cccc76
merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents:
29775
diff
changeset
|
1804 |
# 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
|
1805 |
# 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
|
1806 |
# 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
|
1807 |
# 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
|
1808 |
# |
1316c7cccc76
merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents:
29775
diff
changeset
|
1809 |
# 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
|
1810 |
# 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
|
1811 |
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
|
1812 |
|
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1813 |
actions[ACTION_MERGE] = [a for a in actions[ACTION_MERGE] |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1814 |
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
|
1815 |
|
38373
ef692614e601
progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents:
38345
diff
changeset
|
1816 |
progress.complete() |
37107
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
1817 |
return updateresult(updated, merged, removed, unresolved) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
1818 |
|
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
1819 |
def recordupdates(repo, actions, branchmerge): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
1820 |
"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
|
1821 |
# remove (must come first) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1822 |
for f, args, msg in actions.get(ACTION_REMOVE, []): |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1823 |
if branchmerge: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1824 |
repo.dirstate.remove(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1825 |
else: |
21389
e741972017d9
merge: change priority / ordering of merge actions
Mads Kiilerich <madski@unity3d.com>
parents:
21269
diff
changeset
|
1826 |
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
|
1827 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1828 |
# forget (must come first) |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1829 |
for f, args, msg in actions.get(ACTION_FORGET, []): |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1830 |
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
|
1831 |
|
34548
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1832 |
# resolve path conflicts |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1833 |
for f, args, msg in actions.get(ACTION_PATH_CONFLICT_RESOLVE, []): |
34548
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1834 |
f0, = args |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1835 |
origf0 = repo.dirstate.copied(f0) or f0 |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1836 |
repo.dirstate.add(f) |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1837 |
repo.dirstate.copy(origf0, f) |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1838 |
if f0 == origf0: |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1839 |
repo.dirstate.remove(f0) |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1840 |
else: |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1841 |
repo.dirstate.drop(f0) |
b4955650eb57
merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents:
34547
diff
changeset
|
1842 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1843 |
# re-add |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1844 |
for f, args, msg in actions.get(ACTION_ADD, []): |
27132
baa7571f40c5
merge.recordupdates: mark 'a' files as added unconditionally
Siddharth Agarwal <sid0@fb.com>
parents:
27131
diff
changeset
|
1845 |
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
|
1846 |
|
27131
d837da26155e
merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents:
27130
diff
changeset
|
1847 |
# re-add/mark as modified |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1848 |
for f, args, msg in actions.get(ACTION_ADD_MODIFIED, []): |
27131
d837da26155e
merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents:
27130
diff
changeset
|
1849 |
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
|
1850 |
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
|
1851 |
else: |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1852 |
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
|
1853 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1854 |
# exec change |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1855 |
for f, args, msg in actions.get(ACTION_EXEC, []): |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1856 |
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
|
1857 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1858 |
# keep |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1859 |
for f, args, msg in actions.get(ACTION_KEEP, []): |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1860 |
pass |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1861 |
|
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1862 |
# get |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1863 |
for f, args, msg in actions.get(ACTION_GET, []): |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1864 |
if branchmerge: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1865 |
repo.dirstate.otherparent(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1866 |
else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1867 |
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
|
1868 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1869 |
# merge |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1870 |
for f, args, msg in actions.get(ACTION_MERGE, []): |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1871 |
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
|
1872 |
if branchmerge: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1873 |
# 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
|
1874 |
# 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
|
1875 |
repo.dirstate.merge(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1876 |
if f1 != f2: # copy/rename |
3308
ecc1bf27378c
merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents:
3307
diff
changeset
|
1877 |
if move: |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1878 |
repo.dirstate.remove(f1) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1879 |
if f1 != f: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1880 |
repo.dirstate.copy(f1, f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1881 |
else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1882 |
repo.dirstate.copy(f2, f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1883 |
else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1884 |
# 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
|
1885 |
# 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
|
1886 |
# 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
|
1887 |
# 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
|
1888 |
# modification. |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1889 |
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
|
1890 |
repo.dirstate.normallookup(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1891 |
if move: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1892 |
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
|
1893 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1894 |
# directory rename, move local |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1895 |
for f, args, msg in actions.get(ACTION_DIR_RENAME_MOVE_LOCAL, []): |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1896 |
f0, flag = args |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1897 |
if branchmerge: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1898 |
repo.dirstate.add(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1899 |
repo.dirstate.remove(f0) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1900 |
repo.dirstate.copy(f0, f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1901 |
else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1902 |
repo.dirstate.normal(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1903 |
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
|
1904 |
|
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1905 |
# directory rename, get |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
1906 |
for f, args, msg in actions.get(ACTION_LOCAL_DIR_RENAME_GET, []): |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1907 |
f0, flag = args |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1908 |
if branchmerge: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1909 |
repo.dirstate.add(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1910 |
repo.dirstate.copy(f0, f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1911 |
else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
1912 |
repo.dirstate.normal(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
1913 |
|
27344
43c00ca887d1
merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents:
27316
diff
changeset
|
1914 |
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
|
1915 |
mergeancestor=False, labels=None, matcher=None, mergeforce=False, |
34302
440ece43024c
merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents:
34142
diff
changeset
|
1916 |
updatecheck=None, wc=None): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
1917 |
""" |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
1918 |
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
|
1919 |
|
30902
e6932e9a262a
merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents:
30901
diff
changeset
|
1920 |
node = the node to update to |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
1921 |
branchmerge = whether to merge between branches |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
1922 |
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
|
1923 |
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
|
1924 |
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
|
1925 |
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
|
1926 |
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
|
1927 |
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
|
1928 |
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
|
1929 |
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
|
1930 |
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
|
1931 |
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
|
1932 |
|
34919
1856de4d1297
update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents:
34885
diff
changeset
|
1933 |
The table below shows all the behaviors of the update command given the |
1856de4d1297
update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents:
34885
diff
changeset
|
1934 |
-c/--check and -C/--clean or no options, whether the working directory is |
1856de4d1297
update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents:
34885
diff
changeset
|
1935 |
dirty, whether a revision is specified, and the relationship of the parent |
1856de4d1297
update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents:
34885
diff
changeset
|
1936 |
rev to the target rev (linear or not). Match from top first. The -n |
1856de4d1297
update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents:
34885
diff
changeset
|
1937 |
option doesn't exist on the command line, but represents the |
31168
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
1938 |
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
|
1939 |
|
12279 | 1940 |
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
|
1941 |
|
31168
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
1942 |
-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
|
1943 |
y y * * * * * | (1) |
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
1944 |
y * y * * * * | (1) |
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
1945 |
y * * y * * * | (1) |
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
1946 |
* y y * * * * | (1) |
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
1947 |
* y * y * * * | (1) |
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
1948 |
* * y y * * * | (1) |
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
1949 |
* * * * * n n | x |
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
1950 |
* * * * n * * | ok |
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
1951 |
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
|
1952 |
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
|
1953 |
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
|
1954 |
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
|
1955 |
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
|
1956 |
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
|
1957 |
|
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
1958 |
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
|
1959 |
* = don't-care |
31161
351207bfdde9
merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents:
31160
diff
changeset
|
1960 |
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
|
1961 |
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
|
1962 |
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
|
1963 |
|
34302
440ece43024c
merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents:
34142
diff
changeset
|
1964 |
The merge is performed inside ``wc``, a workingctx-like objects. It defaults |
440ece43024c
merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents:
34142
diff
changeset
|
1965 |
to repo[None] if None is passed. |
440ece43024c
merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents:
34142
diff
changeset
|
1966 |
|
13162
115a9760c382
merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents:
13158
diff
changeset
|
1967 |
Return the same tuple as applyupdates(). |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
1968 |
""" |
33321
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33311
diff
changeset
|
1969 |
# Avoid cycle. |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33311
diff
changeset
|
1970 |
from . import sparse |
2815
4870f795f681
Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents:
2814
diff
changeset
|
1971 |
|
31166
fad5e299cfc7
update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents:
31165
diff
changeset
|
1972 |
# 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
|
1973 |
# 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
|
1974 |
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
|
1975 |
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
|
1976 |
# 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
|
1977 |
# 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
|
1978 |
# 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
|
1979 |
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
|
1980 |
updatecheck = 'linear' |
31168
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
1981 |
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
|
1982 |
# 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
|
1983 |
# 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
|
1984 |
# update here. |
43c00ca887d1
merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents:
27316
diff
changeset
|
1985 |
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
|
1986 |
partial = False |
43c00ca887d1
merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents:
27316
diff
changeset
|
1987 |
else: |
43c00ca887d1
merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents:
27316
diff
changeset
|
1988 |
partial = True |
27852
a33c1c9e769c
with: use context manager in merge update
Bryan O'Sullivan <bryano@fb.com>
parents:
27742
diff
changeset
|
1989 |
with repo.wlock(): |
34302
440ece43024c
merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents:
34142
diff
changeset
|
1990 |
if wc is None: |
440ece43024c
merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents:
34142
diff
changeset
|
1991 |
wc = repo[None] |
20279
5b4f963d21cc
merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20278
diff
changeset
|
1992 |
pl = wc.parents() |
5b4f963d21cc
merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20278
diff
changeset
|
1993 |
p1 = pl[0] |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1994 |
pas = [None] |
23405
2a038deeac9a
merge: 0 is a valid ancestor different from None
Mads Kiilerich <madski@unity3d.com>
parents:
23398
diff
changeset
|
1995 |
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
|
1996 |
pas = [repo[ancestor]] |
20279
5b4f963d21cc
merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20278
diff
changeset
|
1997 |
|
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1998 |
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
|
1999 |
|
5b4f963d21cc
merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20278
diff
changeset
|
2000 |
p2 = repo[node] |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
2001 |
if pas[0] is None: |
34479
99c3dee3f6ce
configitems: register the 'merge.preferancestor' config
Boris Feld <boris.feld@octobus.net>
parents:
34349
diff
changeset
|
2002 |
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
|
2003 |
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
|
2004 |
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
|
2005 |
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
|
2006 |
pas = [p1.ancestor(p2, warn=branchmerge)] |
13874
9d67277c9204
merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents:
13728
diff
changeset
|
2007 |
|
36177
187f2474bc11
merge: coerce nodes to bytes, not str
Augie Fackler <augie@google.com>
parents:
36142
diff
changeset
|
2008 |
fp1, fp2, xp1, xp2 = p1.node(), p2.node(), bytes(p1), bytes(p2) |
3314 | 2009 |
|
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
2010 |
### check phase |
27316
777f668eca70
merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents:
27267
diff
changeset
|
2011 |
if not overwrite: |
777f668eca70
merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents:
27267
diff
changeset
|
2012 |
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
|
2013 |
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
|
2014 |
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
|
2015 |
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
|
2016 |
raise error.Abort(_("outstanding merge conflicts")) |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
2017 |
if branchmerge: |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
2018 |
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
|
2019 |
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
|
2020 |
" has no effect")) |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
2021 |
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
|
2022 |
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
|
2023 |
raise error.Abort(_("nothing to merge"), |
15619
6c8573dd1b6b
merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents:
15538
diff
changeset
|
2024 |
hint=_("use 'hg update' " |
6c8573dd1b6b
merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents:
15538
diff
changeset
|
2025 |
"or check 'hg heads'")) |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
2026 |
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
|
2027 |
raise error.Abort(_("uncommitted changes"), |
15619
6c8573dd1b6b
merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents:
15538
diff
changeset
|
2028 |
hint=_("use 'hg status' to list changes")) |
35284
1b03407e808d
merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents:
35283
diff
changeset
|
2029 |
if not wc.isinmemory(): |
1b03407e808d
merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents:
35283
diff
changeset
|
2030 |
for s in sorted(wc.substate): |
1b03407e808d
merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents:
35283
diff
changeset
|
2031 |
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
|
2032 |
|
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
2033 |
elif not overwrite: |
19929
ab2362e1672e
merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
19803
diff
changeset
|
2034 |
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
|
2035 |
# 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
|
2036 |
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
|
2037 |
repo.hook('update', parent1=xp2, parent2='', error=0) |
37107
71543b942eea
merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
2038 |
return updateresult(0, 0, 0, 0) |
19929
ab2362e1672e
merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
19803
diff
changeset
|
2039 |
|
31166
fad5e299cfc7
update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents:
31165
diff
changeset
|
2040 |
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
|
2041 |
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
|
2042 |
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
|
2043 |
if dirty: |
18985
a59e575c6ff8
update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18895
diff
changeset
|
2044 |
# 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
|
2045 |
# 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
|
2046 |
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
|
2047 |
# 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
|
2048 |
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
|
2049 |
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
|
2050 |
else: |
19799
ab3e42225dbc
update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents:
19798
diff
changeset
|
2051 |
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
|
2052 |
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
|
2053 |
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
|
2054 |
else: |
a59e575c6ff8
update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18895
diff
changeset
|
2055 |
# 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
|
2056 |
pass |
47278970fc8c
update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents:
30859
diff
changeset
|
2057 |
|
47278970fc8c
update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents:
30859
diff
changeset
|
2058 |
if overwrite: |
47278970fc8c
update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents:
30859
diff
changeset
|
2059 |
pas = [wc] |
47278970fc8c
update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents:
30859
diff
changeset
|
2060 |
elif not branchmerge: |
47278970fc8c
update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents:
30859
diff
changeset
|
2061 |
pas = [p1] |
2814
0f787997e3c2
Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents:
2813
diff
changeset
|
2062 |
|
25843
bf9ea348b487
merge: mark ancient debugging option
Matt Mackall <mpm@selenic.com>
parents:
25754
diff
changeset
|
2063 |
# deprecated config: merge.followcopies |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33323
diff
changeset
|
2064 |
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
|
2065 |
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
|
2066 |
followcopies = False |
a2804ddcf9ae
update: enable copy tracing for backwards and non-linear updates
Gábor Stefanik <gabor.stefanik@nng.com>
parents:
30172
diff
changeset
|
2067 |
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
|
2068 |
followcopies = False |
a2804ddcf9ae
update: enable copy tracing for backwards and non-linear updates
Gábor Stefanik <gabor.stefanik@nng.com>
parents:
30172
diff
changeset
|
2069 |
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
|
2070 |
followcopies = False |
21080
04540a8499a3
merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents:
21024
diff
changeset
|
2071 |
|
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
2072 |
### calculate phase |
23641
a7a0f32a383f
merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23640
diff
changeset
|
2073 |
actionbyfile, diverge, renamedelete = calculateupdates( |
27345
98266b1d144d
merge: restate calculateupdates in terms of a matcher
Augie Fackler <augie@google.com>
parents:
27344
diff
changeset
|
2074 |
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
|
2075 |
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
|
2076 |
|
31168
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
2077 |
if updatecheck == 'noconflict': |
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
2078 |
for f, (m, args, msg) in actionbyfile.iteritems(): |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
2079 |
if m not in (ACTION_GET, ACTION_KEEP, ACTION_EXEC, |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
2080 |
ACTION_REMOVE, ACTION_PATH_CONFLICT_RESOLVE): |
31175
7433b3bc55ee
update: for "noconflict" updates, print "conflicting changes" on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
31168
diff
changeset
|
2081 |
msg = _("conflicting changes") |
7433b3bc55ee
update: for "noconflict" updates, print "conflicting changes" on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
31168
diff
changeset
|
2082 |
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
|
2083 |
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
|
2084 |
|
27951
6bce6d925e45
merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents:
27852
diff
changeset
|
2085 |
# 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
|
2086 |
# already, but we can't handle .hgsubstate in filemerge or |
36009
55e8efa2451a
subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
35726
diff
changeset
|
2087 |
# subrepoutil.submerge yet so we have to keep prompting for it. |
27951
6bce6d925e45
merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents:
27852
diff
changeset
|
2088 |
if '.hgsubstate' in actionbyfile: |
6bce6d925e45
merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents:
27852
diff
changeset
|
2089 |
f = '.hgsubstate' |
6bce6d925e45
merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents:
27852
diff
changeset
|
2090 |
m, args, msg = actionbyfile[f] |
29774
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29629
diff
changeset
|
2091 |
prompts = filemerge.partextras(labels) |
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29629
diff
changeset
|
2092 |
prompts['f'] = f |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
2093 |
if m == ACTION_CHANGED_DELETED: |
27951
6bce6d925e45
merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents:
27852
diff
changeset
|
2094 |
if repo.ui.promptchoice( |
29775
978b907d9b36
merge: always use other, not remote, in user prompts
Simon Farnsworth <simonfar@fb.com>
parents:
29774
diff
changeset
|
2095 |
_("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
|
2096 |
"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
|
2097 |
"$$ &Changed $$ &Delete") % prompts, 0): |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
2098 |
actionbyfile[f] = (ACTION_REMOVE, None, 'prompt delete') |
27951
6bce6d925e45
merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents:
27852
diff
changeset
|
2099 |
elif f in p1: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
2100 |
actionbyfile[f] = (ACTION_ADD_MODIFIED, None, 'prompt keep') |
27951
6bce6d925e45
merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents:
27852
diff
changeset
|
2101 |
else: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
2102 |
actionbyfile[f] = (ACTION_ADD, None, 'prompt keep') |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
2103 |
elif m == ACTION_DELETED_CHANGED: |
27951
6bce6d925e45
merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents:
27852
diff
changeset
|
2104 |
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
|
2105 |
flags = p2[f2].flags() |
6bce6d925e45
merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents:
27852
diff
changeset
|
2106 |
if repo.ui.promptchoice( |
29775
978b907d9b36
merge: always use other, not remote, in user prompts
Simon Farnsworth <simonfar@fb.com>
parents:
29774
diff
changeset
|
2107 |
_("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
|
2108 |
"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
|
2109 |
"$$ &Changed $$ &Deleted") % prompts, 0) == 0: |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
2110 |
actionbyfile[f] = (ACTION_GET, (flags, False), |
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
2111 |
'prompt recreating') |
27951
6bce6d925e45
merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents:
27852
diff
changeset
|
2112 |
else: |
6bce6d925e45
merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents:
27852
diff
changeset
|
2113 |
del actionbyfile[f] |
6bce6d925e45
merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents:
27852
diff
changeset
|
2114 |
|
23641
a7a0f32a383f
merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23640
diff
changeset
|
2115 |
# Convert to dictionary-of-lists format |
41039
54c3b4bd01f2
merge: extract helper for creating empty "actions" dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
39818
diff
changeset
|
2116 |
actions = emptyactions() |
23641
a7a0f32a383f
merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23640
diff
changeset
|
2117 |
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
|
2118 |
if m not in actions: |
a7a0f32a383f
merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23640
diff
changeset
|
2119 |
actions[m] = [] |
a7a0f32a383f
merge: make calculateupdates() return file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents:
23640
diff
changeset
|
2120 |
actions[m].append((f, args, msg)) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
2121 |
|
29889
6f447b9ec263
util: rename checkcase() to fscasesensitive() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
29831
diff
changeset
|
2122 |
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
|
2123 |
# 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
|
2124 |
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
|
2125 |
(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
|
2126 |
_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
|
2127 |
else: |
7cc0fb0080b6
merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents:
23541
diff
changeset
|
2128 |
_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
|
2129 |
|
23525
5126d7718d7c
merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23524
diff
changeset
|
2130 |
# divergent renames |
23526
a5887f2da5e6
merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents:
23525
diff
changeset
|
2131 |
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
|
2132 |
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
|
2133 |
"multiple times to:\n") % f) |
42110
3a7efcbdf288
copies: print list of divergent renames in sorted order
Martin von Zweigbergk <martinvonz@google.com>
parents:
42057
diff
changeset
|
2134 |
for nf in sorted(fl): |
23525
5126d7718d7c
merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23524
diff
changeset
|
2135 |
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
|
2136 |
|
5126d7718d7c
merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23524
diff
changeset
|
2137 |
# rename and delete |
23526
a5887f2da5e6
merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents:
23525
diff
changeset
|
2138 |
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
|
2139 |
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
|
2140 |
"and renamed to:\n") % f) |
42110
3a7efcbdf288
copies: print list of divergent renames in sorted order
Martin von Zweigbergk <martinvonz@google.com>
parents:
42057
diff
changeset
|
2141 |
for nf in sorted(fl): |
23525
5126d7718d7c
merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents:
23524
diff
changeset
|
2142 |
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
|
2143 |
|
26957
d16d73173fdd
merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents:
26949
diff
changeset
|
2144 |
### apply phase |
d16d73173fdd
merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents:
26949
diff
changeset
|
2145 |
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
|
2146 |
fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' |
35284
1b03407e808d
merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents:
35283
diff
changeset
|
2147 |
if not partial and not wc.isinmemory(): |
26957
d16d73173fdd
merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents:
26949
diff
changeset
|
2148 |
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
|
2149 |
# 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
|
2150 |
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
|
2151 |
|
34885
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2152 |
# Advertise fsmonitor when its presence could be useful. |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2153 |
# |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2154 |
# We only advertise when performing an update from an empty working |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2155 |
# directory. This typically only occurs during initial clone. |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2156 |
# |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2157 |
# We give users a mechanism to disable the warning in case it is |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2158 |
# annoying. |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2159 |
# |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2160 |
# We only allow on Linux and MacOS because that's where fsmonitor is |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2161 |
# considered stable. |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2162 |
fsmonitorwarning = repo.ui.configbool('fsmonitor', 'warn_when_unused') |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2163 |
fsmonitorthreshold = repo.ui.configint('fsmonitor', |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2164 |
'warn_update_file_count') |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2165 |
try: |
36010
46a54de96a54
merge: cut import cycle at merge -> extensions
Yuya Nishihara <yuya@tcha.org>
parents:
36009
diff
changeset
|
2166 |
# avoid cycle: extensions -> cmdutil -> merge |
46a54de96a54
merge: cut import cycle at merge -> extensions
Yuya Nishihara <yuya@tcha.org>
parents:
36009
diff
changeset
|
2167 |
from . import extensions |
34885
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2168 |
extensions.find('fsmonitor') |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2169 |
fsmonitorenabled = repo.ui.config('fsmonitor', 'mode') != 'off' |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2170 |
# We intentionally don't look at whether fsmonitor has disabled |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2171 |
# itself because a) fsmonitor may have already printed a warning |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2172 |
# b) we only care about the config state here. |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2173 |
except KeyError: |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2174 |
fsmonitorenabled = False |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2175 |
|
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2176 |
if (fsmonitorwarning |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2177 |
and not fsmonitorenabled |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2178 |
and p1.node() == nullid |
37112
43ffd9070da1
merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37111
diff
changeset
|
2179 |
and len(actions[ACTION_GET]) >= fsmonitorthreshold |
34885
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2180 |
and pycompat.sysplatform.startswith(('linux', 'darwin'))): |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2181 |
repo.ui.warn( |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2182 |
_('(warning: large working directory being used without ' |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2183 |
'fsmonitor enabled; enable fsmonitor to improve performance; ' |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2184 |
'see "hg help -e fsmonitor")\n')) |
df2ff314e36f
fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34787
diff
changeset
|
2185 |
|
26957
d16d73173fdd
merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents:
26949
diff
changeset
|
2186 |
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
|
2187 |
|
35284
1b03407e808d
merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents:
35283
diff
changeset
|
2188 |
if not partial and not wc.isinmemory(): |
32351
c568c187102f
merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32246
diff
changeset
|
2189 |
with repo.dirstate.parentchange(): |
c568c187102f
merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32246
diff
changeset
|
2190 |
repo.setparents(fp1, fp2) |
c568c187102f
merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32246
diff
changeset
|
2191 |
recordupdates(repo, actions, branchmerge) |
c568c187102f
merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32246
diff
changeset
|
2192 |
# update completed, clear state |
c568c187102f
merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32246
diff
changeset
|
2193 |
util.unlink(repo.vfs.join('updatestate')) |
19482
499fc471296b
update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents:
19285
diff
changeset
|
2194 |
|
32351
c568c187102f
merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32246
diff
changeset
|
2195 |
if not branchmerge: |
c568c187102f
merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32246
diff
changeset
|
2196 |
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
|
2197 |
|
33321
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33311
diff
changeset
|
2198 |
# 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
|
2199 |
# (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
|
2200 |
if not branchmerge: |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33311
diff
changeset
|
2201 |
sparse.prunetemporaryincludes(repo) |
d09e948dc303
sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33311
diff
changeset
|
2202 |
|
10492
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10431
diff
changeset
|
2203 |
if not partial: |
37125
6f570c501e3e
merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37112
diff
changeset
|
2204 |
repo.hook('update', parent1=xp1, parent2=xp2, |
6f570c501e3e
merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37112
diff
changeset
|
2205 |
error=stats.unresolvedcount) |
10492
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10431
diff
changeset
|
2206 |
return stats |
22902
ce0592328d68
merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents:
22841
diff
changeset
|
2207 |
|
42040
02fa567f8a3c
merge: make "labels" argument to graft() optional, like it is for update()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41759
diff
changeset
|
2208 |
def graft(repo, ctx, pctx, labels=None, keepparent=False, |
38494
d4be8ea8f22d
merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents:
38426
diff
changeset
|
2209 |
keepconflictparent=False): |
22902
ce0592328d68
merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents:
22841
diff
changeset
|
2210 |
"""Do a graft-like merge. |
ce0592328d68
merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents:
22841
diff
changeset
|
2211 |
|
ce0592328d68
merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents:
22841
diff
changeset
|
2212 |
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
|
2213 |
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
|
2214 |
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
|
2215 |
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
|
2216 |
renames/copies appropriately. |
22902
ce0592328d68
merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents:
22841
diff
changeset
|
2217 |
|
ce0592328d68
merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents:
22841
diff
changeset
|
2218 |
ctx - changeset to rebase |
ce0592328d68
merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents:
22841
diff
changeset
|
2219 |
pctx - merge base, usually ctx.p1() |
ce0592328d68
merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents:
22841
diff
changeset
|
2220 |
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
|
2221 |
keepparent - keep second parent if any |
38494
d4be8ea8f22d
merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents:
38426
diff
changeset
|
2222 |
keepparent - if unresolved, keep parent used for the merge |
22902
ce0592328d68
merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents:
22841
diff
changeset
|
2223 |
|
ce0592328d68
merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents:
22841
diff
changeset
|
2224 |
""" |
24643
a8e6897dffbe
graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents:
24471
diff
changeset
|
2225 |
# 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
|
2226 |
# 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
|
2227 |
# 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
|
2228 |
# 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
|
2229 |
# 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
|
2230 |
# which local deleted". |
a8e6897dffbe
graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents:
24471
diff
changeset
|
2231 |
mergeancestor = repo.changelog.isancestor(repo['.'].node(), ctx.node()) |
22902
ce0592328d68
merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents:
22841
diff
changeset
|
2232 |
|
27344
43c00ca887d1
merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents:
27316
diff
changeset
|
2233 |
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
|
2234 |
mergeancestor=mergeancestor, labels=labels) |
a8e6897dffbe
graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents:
24471
diff
changeset
|
2235 |
|
38494
d4be8ea8f22d
merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents:
38426
diff
changeset
|
2236 |
|
d4be8ea8f22d
merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents:
38426
diff
changeset
|
2237 |
if keepconflictparent and stats.unresolvedcount: |
d4be8ea8f22d
merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents:
38426
diff
changeset
|
2238 |
pother = ctx.node() |
d4be8ea8f22d
merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents:
38426
diff
changeset
|
2239 |
else: |
d4be8ea8f22d
merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents:
38426
diff
changeset
|
2240 |
pother = nullid |
d4be8ea8f22d
merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents:
38426
diff
changeset
|
2241 |
parents = ctx.parents() |
d4be8ea8f22d
merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents:
38426
diff
changeset
|
2242 |
if keepparent and len(parents) == 2 and pctx in parents: |
d4be8ea8f22d
merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents:
38426
diff
changeset
|
2243 |
parents.remove(pctx) |
d4be8ea8f22d
merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents:
38426
diff
changeset
|
2244 |
pother = parents[0].node() |
27267
d6859d86a5d5
merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents:
27137
diff
changeset
|
2245 |
|
32351
c568c187102f
merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32246
diff
changeset
|
2246 |
with repo.dirstate.parentchange(): |
c568c187102f
merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32246
diff
changeset
|
2247 |
repo.setparents(repo['.'].node(), pother) |
c568c187102f
merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32246
diff
changeset
|
2248 |
repo.dirstate.write(repo.currenttransaction()) |
c568c187102f
merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32246
diff
changeset
|
2249 |
# fix up dirstate for copies and renames |
34787
754b5117622f
context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents:
34786
diff
changeset
|
2250 |
copies.duplicatecopies(repo, repo[None], ctx.rev(), pctx.rev()) |
22902
ce0592328d68
merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents:
22841
diff
changeset
|
2251 |
return stats |
39463
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2252 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2253 |
def purge(repo, matcher, ignored=False, removeemptydirs=True, |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2254 |
removefiles=True, abortonerror=False, noop=False): |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2255 |
"""Purge the working directory of untracked files. |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2256 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2257 |
``matcher`` is a matcher configured to scan the working directory - |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2258 |
potentially a subset. |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2259 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2260 |
``ignored`` controls whether ignored files should also be purged. |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2261 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2262 |
``removeemptydirs`` controls whether empty directories should be removed. |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2263 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2264 |
``removefiles`` controls whether files are removed. |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2265 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2266 |
``abortonerror`` causes an exception to be raised if an error occurs |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2267 |
deleting a file or directory. |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2268 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2269 |
``noop`` controls whether to actually remove files. If not defined, actions |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2270 |
will be taken. |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2271 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2272 |
Returns an iterable of relative paths in the working directory that were |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2273 |
or would be removed. |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2274 |
""" |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2275 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2276 |
def remove(removefn, path): |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2277 |
try: |
39464
3dd34b401bc2
merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39463
diff
changeset
|
2278 |
removefn(path) |
39463
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2279 |
except OSError: |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2280 |
m = _('%s cannot be removed') % path |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2281 |
if abortonerror: |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2282 |
raise error.Abort(m) |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2283 |
else: |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2284 |
repo.ui.warn(_('warning: %s\n') % m) |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2285 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2286 |
# There's no API to copy a matcher. So mutate the passed matcher and |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2287 |
# restore it when we're done. |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2288 |
oldexplicitdir = matcher.explicitdir |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2289 |
oldtraversedir = matcher.traversedir |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2290 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2291 |
res = [] |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2292 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2293 |
try: |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2294 |
if removeemptydirs: |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2295 |
directories = [] |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2296 |
matcher.explicitdir = matcher.traversedir = directories.append |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2297 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2298 |
status = repo.status(match=matcher, ignored=ignored, unknown=True) |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2299 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2300 |
if removefiles: |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2301 |
for f in sorted(status.unknown + status.ignored): |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2302 |
if not noop: |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2303 |
repo.ui.note(_('removing file %s\n') % f) |
39464
3dd34b401bc2
merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39463
diff
changeset
|
2304 |
remove(repo.wvfs.unlink, f) |
39463
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2305 |
res.append(f) |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2306 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2307 |
if removeemptydirs: |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2308 |
for f in sorted(directories, reverse=True): |
39464
3dd34b401bc2
merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39463
diff
changeset
|
2309 |
if matcher(f) and not repo.wvfs.listdir(f): |
39463
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2310 |
if not noop: |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2311 |
repo.ui.note(_('removing directory %s\n') % f) |
39464
3dd34b401bc2
merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39463
diff
changeset
|
2312 |
remove(repo.wvfs.rmdir, f) |
39463
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2313 |
res.append(f) |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2314 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2315 |
return res |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2316 |
|
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2317 |
finally: |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2318 |
matcher.explicitdir = oldexplicitdir |
7fea205fd5dc
merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38757
diff
changeset
|
2319 |
matcher.traversedir = oldtraversedir |