Mercurial > hg-stable
annotate mercurial/merge.py @ 22153:fc8bc2787528
revert: move manifest membership condition outside of the loop
Currently, revset is using information from dirstate status and alter its
behavior whenever the file exist in the target manifest or not. This tests are
done a big for loop. We move this member ship testing outside of the loop and
simplifies associates data structure.
This is a step toward a cleaner implementation of revert based on status.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Tue, 24 Jun 2014 15:28:22 +0100 |
parents | bde505f47141 |
children | 46308fadaa15 b27c3beaaf30 |
rev | line source |
---|---|
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1 # merge.py - directory-level update/merge handling for Mercurial |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
2 # |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com> |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8152
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 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 |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
8 import struct |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
9 |
6518 | 10 from node import nullid, nullrev, hex, bin |
3891 | 11 from i18n import _ |
18985
a59e575c6ff8
update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18895
diff
changeset
|
12 from mercurial import obsolete |
18822
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
13 import error, util, filemerge, copies, subrepo, worker, dicthelpers |
8312
b87a50b7125c
separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents:
8259
diff
changeset
|
14 import errno, os, shutil |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
15 |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
16 _pack = struct.pack |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
17 _unpack = struct.unpack |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
18 |
20593
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
19 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
|
20 # used for compatibility for v1 |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
21 bits = data.split("\0") |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
22 bits = bits[:-2] + bits[-1:] |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
23 return "\0".join(bits) |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
24 |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
25 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
|
26 '''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
|
27 |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
28 it is stored on disk when needed. Two file are used, one with an old |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
29 format, one with a new format. Both contains similar data, but the new |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
30 format can store new kind of field. |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
31 |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
32 Current new format is a list of arbitrary record of the form: |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
33 |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
34 [type][length][content] |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
35 |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
36 Type is a single character, length is a 4 bytes integer, content is an |
20607
abd448767465
merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents:
20594
diff
changeset
|
37 arbitrary suites of bytes of length `length`. |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
38 |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
39 Type should be a letter. Capital letter are mandatory record, Mercurial |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
40 should abort if they are unknown. lower case record can be safely ignored. |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
41 |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
42 Currently known record: |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
43 |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
44 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
|
45 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
|
46 F: a file to be merged entry |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
47 ''' |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
48 statepathv1 = "merge/state" |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
49 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
|
50 |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
51 def __init__(self, repo): |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
52 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
|
53 self._dirty = False |
6518 | 54 self._read() |
20651
c1a52dd56eb4
merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20642
diff
changeset
|
55 |
20591
02c60e380fd0
merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20590
diff
changeset
|
56 def reset(self, node=None, other=None): |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
57 self._state = {} |
21261
6ca05c46aa95
mergestate: consistently set variables to None
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21203
diff
changeset
|
58 self._local = None |
6ca05c46aa95
mergestate: consistently set variables to None
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21203
diff
changeset
|
59 self._other = None |
7848
89e05c02a4af
resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents:
7768
diff
changeset
|
60 if node: |
89e05c02a4af
resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents:
7768
diff
changeset
|
61 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
|
62 self._other = other |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
63 shutil.rmtree(self._repo.join("merge"), True) |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
64 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
|
65 |
6518 | 66 def _read(self): |
20652
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
67 """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
|
68 |
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
69 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
|
70 of on disk file. |
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
71 """ |
6518 | 72 self._state = {} |
21261
6ca05c46aa95
mergestate: consistently set variables to None
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21203
diff
changeset
|
73 self._local = None |
6ca05c46aa95
mergestate: consistently set variables to None
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21203
diff
changeset
|
74 self._other = None |
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
|
75 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
|
76 for rtype, record in records: |
31993cd23b11
merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20588
diff
changeset
|
77 if rtype == 'L': |
31993cd23b11
merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20588
diff
changeset
|
78 self._local = bin(record) |
20591
02c60e380fd0
merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20590
diff
changeset
|
79 elif rtype == 'O': |
02c60e380fd0
merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20590
diff
changeset
|
80 self._other = bin(record) |
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
|
81 elif rtype == "F": |
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
|
82 bits = record.split("\0") |
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
|
83 self._state[bits[0]] = bits[1:] |
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
|
84 elif not rtype.islower(): |
20868
5db105f216c3
i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20867
diff
changeset
|
85 raise util.Abort(_('unsupported merge state record: %s') |
5db105f216c3
i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20867
diff
changeset
|
86 % rtype) |
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
|
87 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
|
88 |
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
|
89 def _readrecords(self): |
20652
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
90 """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
|
91 |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20945
diff
changeset
|
92 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
|
93 |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20945
diff
changeset
|
94 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
|
95 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
|
96 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
|
97 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
|
98 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
|
99 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
|
100 file around. |
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
101 |
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
102 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
|
103 v1records = self._readrecordsv1() |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
104 v2records = self._readrecordsv2() |
20593
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
105 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
|
106 for rec in v2records: |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
107 if rec[0] == 'L': |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
108 oldv2.add(rec) |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
109 elif rec[0] == 'F': |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
110 # drop the onode data (not contained in v1) |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
111 oldv2.add(('F', _droponode(rec[1]))) |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
112 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
|
113 if rec not in oldv2: |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
114 # v1 file is newer than v2 file, use it |
20592
303cbfe3dcc8
merge: infer the "other" changeset when falling back to v1 format
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20591
diff
changeset
|
115 # we have to infer the "other" changeset of the merge |
303cbfe3dcc8
merge: infer the "other" changeset when falling back to v1 format
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20591
diff
changeset
|
116 # we cannot do better than that with v1 of the format |
303cbfe3dcc8
merge: infer the "other" changeset when falling back to v1 format
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20591
diff
changeset
|
117 mctx = self._repo[None].parents()[-1] |
303cbfe3dcc8
merge: infer the "other" changeset when falling back to v1 format
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20591
diff
changeset
|
118 v1records.append(('O', mctx.hex())) |
20593
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
119 # add place holder "other" file node information |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
120 # nobody is using it yet so we do no need to fetch the data |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
121 # if mctx was wrong `mctx[bits[-2]]` may fails. |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
122 for idx, r in enumerate(v1records): |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
123 if r[0] == 'F': |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
124 bits = r[1].split("\0") |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
125 bits.insert(-2, '') |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
126 v1records[idx] = (r[0], "\0".join(bits)) |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
127 return v1records |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
128 else: |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
129 return v2records |
20651
c1a52dd56eb4
merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20642
diff
changeset
|
130 |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
131 def _readrecordsv1(self): |
20652
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
132 """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
|
133 |
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
134 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
|
135 |
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
136 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
|
137 (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
|
138 """ |
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
|
139 records = [] |
6518 | 140 try: |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
141 f = self._repo.opener(self.statepathv1) |
6530
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
142 for i, l in enumerate(f): |
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
143 if i == 0: |
20589
31993cd23b11
merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20588
diff
changeset
|
144 records.append(('L', l[:-1])) |
6530
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
145 else: |
20589
31993cd23b11
merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20588
diff
changeset
|
146 records.append(('F', l[:-1])) |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13323
diff
changeset
|
147 f.close() |
6518 | 148 except IOError, err: |
149 if err.errno != errno.ENOENT: | |
150 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
|
151 return records |
20651
c1a52dd56eb4
merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20642
diff
changeset
|
152 |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
153 def _readrecordsv2(self): |
20652
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
154 """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
|
155 |
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
156 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
|
157 """ |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
158 records = [] |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
159 try: |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
160 f = self._repo.opener(self.statepathv2) |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
161 data = f.read() |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
162 off = 0 |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
163 end = len(data) |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
164 while off < end: |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
165 rtype = data[off] |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
166 off += 1 |
20607
abd448767465
merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents:
20594
diff
changeset
|
167 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
|
168 off += 4 |
20607
abd448767465
merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents:
20594
diff
changeset
|
169 record = data[off:(off + length)] |
abd448767465
merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents:
20594
diff
changeset
|
170 off += length |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
171 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
|
172 f.close() |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
173 except IOError, err: |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
174 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
|
175 raise |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
176 return records |
20651
c1a52dd56eb4
merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20642
diff
changeset
|
177 |
21264
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
178 def active(self): |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
179 """Whether mergestate is active. |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
180 |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
181 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
|
182 for "is a merge in progress." |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
183 """ |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
184 # 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
|
185 # reasons. |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
186 return bool(self._local) or bool(self._state) or \ |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
187 self._repo.opener.exists(self.statepathv1) or \ |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
188 self._repo.opener.exists(self.statepathv2) |
4e932dc5c113
resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21261
diff
changeset
|
189 |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
190 def commit(self): |
20652
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
191 """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
|
192 if self._dirty: |
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
|
193 records = [] |
31993cd23b11
merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20588
diff
changeset
|
194 records.append(("L", hex(self._local))) |
20591
02c60e380fd0
merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20590
diff
changeset
|
195 records.append(("O", hex(self._other))) |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
196 for d, v in self._state.iteritems(): |
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
|
197 records.append(("F", "\0".join([d] + v))) |
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
|
198 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
|
199 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
|
200 |
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 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
|
202 """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
|
203 self._writerecordsv1(records) |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
204 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
|
205 |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
206 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
|
207 """Write current state on disk in a version 1 file""" |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
208 f = self._repo.opener(self.statepathv1, "w") |
20589
31993cd23b11
merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20588
diff
changeset
|
209 irecords = iter(records) |
31993cd23b11
merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20588
diff
changeset
|
210 lrecords = irecords.next() |
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
|
211 assert lrecords[0] == 'L' |
31993cd23b11
merge: change the merge state serialisation to use a record based logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20588
diff
changeset
|
212 f.write(hex(self._local) + "\n") |
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
|
213 for rtype, data in irecords: |
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
|
214 if rtype == "F": |
20593
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
215 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
|
216 f.close() |
20651
c1a52dd56eb4
merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20642
diff
changeset
|
217 |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
218 def _writerecordsv2(self, records): |
20652
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
219 """Write current state on disk in a version 2 file""" |
20590
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
220 f = self._repo.opener(self.statepathv2, "w") |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
221 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
|
222 assert len(key) == 1 |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
223 format = ">sI%is" % len(data) |
2b7d54e929b4
merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20589
diff
changeset
|
224 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
|
225 f.close() |
20651
c1a52dd56eb4
merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20642
diff
changeset
|
226 |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
227 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
|
228 """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
|
229 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
|
230 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
|
231 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
|
232 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
|
233 |
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
234 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
|
235 """ |
6517
fcfb6a0a0a84
python-2.6: use sha wrapper from util for new merge code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6512
diff
changeset
|
236 hash = util.sha1(fcl.path()).hexdigest() |
14168
135e244776f0
prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14064
diff
changeset
|
237 self._repo.opener.write("merge/" + hash, fcl.data()) |
20593
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
238 self._state[fd] = ['u', hash, fcl.path(), |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
239 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
|
240 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
|
241 fcl.flags()] |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
242 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
|
243 |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
244 def __contains__(self, dfile): |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
245 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
|
246 |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
247 def __getitem__(self, dfile): |
6518 | 248 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
|
249 |
6518 | 250 def __iter__(self): |
21268
a0b8a912ec81
merge: simplify mergestate iter
Mads Kiilerich <mads@kiilerich.com>
parents:
21266
diff
changeset
|
251 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
|
252 |
19285
feaf5749d7a4
merge: add a files method to the mergestate class
Bryan O'Sullivan <bryano@fb.com>
parents:
19226
diff
changeset
|
253 def files(self): |
feaf5749d7a4
merge: add a files method to the mergestate class
Bryan O'Sullivan <bryano@fb.com>
parents:
19226
diff
changeset
|
254 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
|
255 |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
256 def mark(self, dfile, state): |
6518 | 257 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
|
258 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
|
259 |
21266
19d6fec60b81
resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21264
diff
changeset
|
260 def unresolved(self): |
19d6fec60b81
resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21264
diff
changeset
|
261 """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
|
262 |
19d6fec60b81
resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21264
diff
changeset
|
263 for f, entry in self._state.items(): |
19d6fec60b81
resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21264
diff
changeset
|
264 if entry[0] == 'u': |
19d6fec60b81
resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21264
diff
changeset
|
265 yield f |
19d6fec60b81
resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21264
diff
changeset
|
266 |
21524
47b97d9af27e
merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents:
21392
diff
changeset
|
267 def resolve(self, dfile, wctx, labels=None): |
20652
2a4871c2511d
merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20651
diff
changeset
|
268 """rerun merge process for file path `dfile`""" |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
269 if self[dfile] == 'r': |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
270 return 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
|
271 stateentry = self._state[dfile] |
3678707e4017
merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20592
diff
changeset
|
272 state, hash, lfile, afile, anode, ofile, onode, flags = stateentry |
20594
ba619c50a355
resolve: use "other" changeset from merge state (issue4163)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20593
diff
changeset
|
273 octx = self._repo[self._other] |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
274 fcd = wctx[dfile] |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
275 fco = octx[ofile] |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
276 fca = self._repo.filectx(afile, fileid=anode) |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
277 # "premerge" x flags |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
278 flo = fco.flags() |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
279 fla = fca.flags() |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
280 if 'x' in flags + flo + fla and 'l' not in flags + flo + fla: |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
281 if fca.node() == nullid: |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
282 self._repo.ui.warn(_('warning: cannot merge flags for %s\n') % |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
283 afile) |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
284 elif flags == fla: |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
285 flags = flo |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
286 # restore local |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
287 f = self._repo.opener("merge/" + hash) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
288 self._repo.wwrite(dfile, f.read(), flags) |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13323
diff
changeset
|
289 f.close() |
21524
47b97d9af27e
merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents:
21392
diff
changeset
|
290 r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca, |
47b97d9af27e
merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents:
21392
diff
changeset
|
291 labels=labels) |
13536
fac040b7e822
merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents:
13437
diff
changeset
|
292 if r is None: |
fac040b7e822
merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents:
13437
diff
changeset
|
293 # no real conflict |
fac040b7e822
merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents:
13437
diff
changeset
|
294 del self._state[dfile] |
20792
89059c450c56
merge: mark mergestate as dirty when resolve changes _state
Mads Kiilerich <madski@unity3d.com>
parents:
20652
diff
changeset
|
295 self._dirty = True |
13536
fac040b7e822
merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents:
13437
diff
changeset
|
296 elif not r: |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
297 self.mark(dfile, 'r') |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
298 return r |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
299 |
16093
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
300 def _checkunknownfile(repo, wctx, mctx, f): |
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
301 return (not repo.dirstate._ignore(f) |
16534
11212babc690
merge: check for untracked files more precisely (issue3400)
Matt Mackall <mpm@selenic.com>
parents:
16492
diff
changeset
|
302 and os.path.isfile(repo.wjoin(f)) |
19157
113681bbef9e
manifestmerge: local unknown, remote created: don't traverse symlinks
Siddharth Agarwal <sid0@fb.com>
parents:
19105
diff
changeset
|
303 and repo.wopener.audit.check(f) |
16284
2b0a406d3043
merge: fix unknown file merge detection for case-folding systems
Matt Mackall <mpm@selenic.com>
parents:
16261
diff
changeset
|
304 and repo.dirstate.normalize(f) not in repo.dirstate |
16093
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
305 and mctx[f].cmp(wctx[f])) |
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
306 |
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
307 def _checkunknown(repo, wctx, mctx): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
308 "check for collisions between unknown files and files in mctx" |
15894
44fa047cef57
merge: report all files in _checkunknown
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
15774
diff
changeset
|
309 |
44fa047cef57
merge: report all files in _checkunknown
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
15774
diff
changeset
|
310 error = False |
16093
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
311 for f in mctx: |
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
312 if f not in wctx and _checkunknownfile(repo, wctx, mctx, f): |
15894
44fa047cef57
merge: report all files in _checkunknown
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
15774
diff
changeset
|
313 error = True |
16093
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
314 wctx._repo.ui.warn(_("%s: untracked file differs\n") % f) |
15894
44fa047cef57
merge: report all files in _checkunknown
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
15774
diff
changeset
|
315 if error: |
44fa047cef57
merge: report all files in _checkunknown
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
15774
diff
changeset
|
316 raise util.Abort(_("untracked files in working directory differ " |
44fa047cef57
merge: report all files in _checkunknown
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
15774
diff
changeset
|
317 "from files in requested revision")) |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
318 |
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
319 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
|
320 """ |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
321 Forget removed files |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
322 |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
323 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
|
324 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
|
325 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
|
326 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
|
327 manifest. |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
328 |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
329 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
|
330 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
|
331 as removed. |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
332 """ |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
333 |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
334 ractions = [] |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
335 factions = xactions = [] |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
336 if branchmerge: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
337 xactions = ractions |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
338 for f in wctx.deleted(): |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
339 if f not in mctx: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
340 xactions.append((f, None, "forget deleted")) |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
341 |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
342 if not branchmerge: |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
343 for f in wctx.removed(): |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
344 if f not in mctx: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
345 factions.append((f, None, "forget removed")) |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
346 |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
347 return ractions, factions |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
348 |
20640
52929dcdd512
merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents:
20639
diff
changeset
|
349 def _checkcollision(repo, wmf, actions): |
19105
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
350 # build provisional merged manifest up |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
351 pmmf = set(wmf) |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
352 |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
353 if actions: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
354 # k, dr, e and rd are no-op |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
355 for m in 'a', 'f', 'g', 'cd', 'dc': |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
356 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
|
357 pmmf.add(f) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
358 for f, args, msg in actions['r']: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
359 pmmf.discard(f) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
360 for f, args, msg in actions['dm']: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
361 f2, flags = args |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
362 pmmf.discard(f2) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
363 pmmf.add(f) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
364 for f, args, msg in actions['dg']: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
365 f2, flags = args |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
366 pmmf.add(f) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
367 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
|
368 f1, f2, fa, move, anc = args |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
369 if move: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
370 pmmf.discard(f1) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
371 pmmf.add(f) |
19105
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
372 |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
373 # 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
|
374 foldmap = {} |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
375 for f in sorted(pmmf): |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
376 fold = util.normcase(f) |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
377 if fold in foldmap: |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
378 raise util.Abort(_("case-folding collision between %s and %s") |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
379 % (f, foldmap[fold])) |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
380 foldmap[fold] = f |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
381 |
18778
1ef89df2c248
rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents:
18651
diff
changeset
|
382 def manifestmerge(repo, wctx, p2, pa, branchmerge, force, partial, |
21080
04540a8499a3
merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents:
21024
diff
changeset
|
383 acceptremote, followcopies): |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
384 """ |
11817
d12fe809e1ee
merge: fix typo in docstring
Alecs King <alecsk@gmail.com>
parents:
11759
diff
changeset
|
385 Merge p1 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
|
386 |
18605
bcf29565d89f
manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents:
18544
diff
changeset
|
387 branchmerge and force are as passed in to update |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
388 partial = function 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
|
389 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
|
390 """ |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
391 |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
392 actions = dict((m, []) for m in 'a f g cd dc r dm dg m dr e rd k'.split()) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
393 copy, movewithdir = {}, {} |
8753
af5f099d932b
merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents:
8752
diff
changeset
|
394 |
18651
e556659340f0
manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents:
18650
diff
changeset
|
395 # 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
|
396 [x.manifest() for x in |
e556659340f0
manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents:
18650
diff
changeset
|
397 sorted(wctx.parents() + [p2, pa], key=lambda x: x.rev())] |
e556659340f0
manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents:
18650
diff
changeset
|
398 |
e556659340f0
manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents:
18650
diff
changeset
|
399 if followcopies: |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
400 ret = copies.mergecopies(repo, wctx, p2, pa) |
18134
6c35b53cd28b
copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents:
18042
diff
changeset
|
401 copy, movewithdir, diverge, renamedelete = ret |
8753
af5f099d932b
merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents:
8752
diff
changeset
|
402 for of, fl in diverge.iteritems(): |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
403 actions['dr'].append((of, (fl,), "divergent renames")) |
16794
98687cdddcb1
merge: warn about file deleted in one branch and renamed in other (issue3074)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
16719
diff
changeset
|
404 for of, fl in renamedelete.iteritems(): |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
405 actions['rd'].append((of, (fl,), "rename and delete")) |
8753
af5f099d932b
merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents:
8752
diff
changeset
|
406 |
af5f099d932b
merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents:
8752
diff
changeset
|
407 repo.ui.note(_("resolving manifests\n")) |
18605
bcf29565d89f
manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents:
18544
diff
changeset
|
408 repo.ui.debug(" branchmerge: %s, force: %s, partial: %s\n" |
bcf29565d89f
manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents:
18544
diff
changeset
|
409 % (bool(branchmerge), bool(force), bool(partial))) |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
410 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
|
411 |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
412 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
|
413 copied = set(copy.values()) |
18134
6c35b53cd28b
copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents:
18042
diff
changeset
|
414 copied.update(movewithdir.values()) |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
415 |
11470
34e33d50c26b
subrepo: correctly handle update -C with modified subrepos (issue2022)
Matt Mackall <mpm@selenic.com>
parents:
11466
diff
changeset
|
416 if '.hgsubstate' in m1: |
9783
ee00ef6f9be7
submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents:
9780
diff
changeset
|
417 # check whether sub state is modified |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
418 for s in sorted(wctx.substate): |
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
419 if wctx.sub(s).dirty(): |
9783
ee00ef6f9be7
submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents:
9780
diff
changeset
|
420 m1['.hgsubstate'] += "+" |
ee00ef6f9be7
submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents:
9780
diff
changeset
|
421 break |
ee00ef6f9be7
submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents:
9780
diff
changeset
|
422 |
20640
52929dcdd512
merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents:
20639
diff
changeset
|
423 aborts = [] |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
424 # Compare manifests |
18822
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
425 fdiff = dicthelpers.diff(m1, m2) |
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
426 flagsdiff = m1.flagsdiff(m2) |
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
427 diff12 = dicthelpers.join(fdiff, flagsdiff) |
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
428 |
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
429 for f, (n12, fl12) in diff12.iteritems(): |
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
430 if n12: |
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
431 n1, n2 = n12 |
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
432 else: # file contents didn't change, but flags did |
18895
ed676ed67a5c
manifestmerge: handle workdir removed, remote removed with flags
Siddharth Agarwal <sid0@fb.com>
parents:
18876
diff
changeset
|
433 n1 = n2 = m1.get(f, None) |
ed676ed67a5c
manifestmerge: handle workdir removed, remote removed with flags
Siddharth Agarwal <sid0@fb.com>
parents:
18876
diff
changeset
|
434 if n1 is None: |
ed676ed67a5c
manifestmerge: handle workdir removed, remote removed with flags
Siddharth Agarwal <sid0@fb.com>
parents:
18876
diff
changeset
|
435 # Since n1 == n2, the file isn't present in m2 either. This |
ed676ed67a5c
manifestmerge: handle workdir removed, remote removed with flags
Siddharth Agarwal <sid0@fb.com>
parents:
18876
diff
changeset
|
436 # means that the file was removed or deleted locally and |
ed676ed67a5c
manifestmerge: handle workdir removed, remote removed with flags
Siddharth Agarwal <sid0@fb.com>
parents:
18876
diff
changeset
|
437 # removed remotely, but that residual entries remain in flags. |
ed676ed67a5c
manifestmerge: handle workdir removed, remote removed with flags
Siddharth Agarwal <sid0@fb.com>
parents:
18876
diff
changeset
|
438 # This can happen in manifests generated by workingctx. |
ed676ed67a5c
manifestmerge: handle workdir removed, remote removed with flags
Siddharth Agarwal <sid0@fb.com>
parents:
18876
diff
changeset
|
439 continue |
18822
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
440 if fl12: |
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
441 fl1, fl2 = fl12 |
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
442 else: # flags didn't change, file contents did |
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
443 fl1 = fl2 = m1.flags(f) |
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
444 |
3248
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
445 if partial and not partial(f): |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
446 continue |
18822
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
447 if n1 and n2: |
20642
0dc7a50345c2
merge: use the right ancestor when both sides copied the same file
Mads Kiilerich <madski@unity3d.com>
parents:
20640
diff
changeset
|
448 fa = f |
0dc7a50345c2
merge: use the right ancestor when both sides copied the same file
Mads Kiilerich <madski@unity3d.com>
parents:
20640
diff
changeset
|
449 a = ma.get(f, nullid) |
0dc7a50345c2
merge: use the right ancestor when both sides copied the same file
Mads Kiilerich <madski@unity3d.com>
parents:
20640
diff
changeset
|
450 if a == nullid: |
0dc7a50345c2
merge: use the right ancestor when both sides copied the same file
Mads Kiilerich <madski@unity3d.com>
parents:
20640
diff
changeset
|
451 fa = copy.get(f, f) |
0dc7a50345c2
merge: use the right ancestor when both sides copied the same file
Mads Kiilerich <madski@unity3d.com>
parents:
20640
diff
changeset
|
452 # Note: f as default is wrong - we can't really make a 3-way |
0dc7a50345c2
merge: use the right ancestor when both sides copied the same file
Mads Kiilerich <madski@unity3d.com>
parents:
20640
diff
changeset
|
453 # merge without an ancestor file. |
0dc7a50345c2
merge: use the right ancestor when both sides copied the same file
Mads Kiilerich <madski@unity3d.com>
parents:
20640
diff
changeset
|
454 fla = ma.flags(fa) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
455 nol = 'l' not in fl1 + fl2 + fla |
18822
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
456 if n2 == a and fl2 == fla: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
457 actions['k'].append((f, (), "keep")) # remote unchanged |
18818
a0bff3d4f67b
manifestmerge: rename n to n1 and n2
Siddharth Agarwal <sid0@fb.com>
parents:
18780
diff
changeset
|
458 elif n1 == a and fl1 == fla: # local unchanged - use remote |
a0bff3d4f67b
manifestmerge: rename n to n1 and n2
Siddharth Agarwal <sid0@fb.com>
parents:
18780
diff
changeset
|
459 if n1 == n2: # optimization: keep local content |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
460 actions['e'].append((f, (fl2,), "update permissions")) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
461 else: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
462 actions['g'].append((f, (fl2,), "remote is newer")) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
463 elif nol and n2 == a: # remote only changed 'x' |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
464 actions['e'].append((f, (fl2,), "update permissions")) |
18818
a0bff3d4f67b
manifestmerge: rename n to n1 and n2
Siddharth Agarwal <sid0@fb.com>
parents:
18780
diff
changeset
|
465 elif nol and n1 == a: # local only changed 'x' |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
466 actions['g'].append((f, (fl1,), "remote is newer")) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
467 else: # both changed something |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
468 actions['m'].append((f, (f, f, fa, False, pa.node()), |
20943
003cb972178d
merge: include ancestor node in merge actions
Mads Kiilerich <madski@unity3d.com>
parents:
20897
diff
changeset
|
469 "versions differ")) |
8752
f177bdab261b
merge: simplify file revision comparison logic
Matt Mackall <mpm@selenic.com>
parents:
8751
diff
changeset
|
470 elif f in copied: # files we'll deal with on m2 side |
f177bdab261b
merge: simplify file revision comparison logic
Matt Mackall <mpm@selenic.com>
parents:
8751
diff
changeset
|
471 pass |
20944
5b8d5803d7b7
merge: keep destination filename as key in actions for merge with dir rename
Mads Kiilerich <madski@unity3d.com>
parents:
20943
diff
changeset
|
472 elif n1 and f in movewithdir: # directory rename, move local |
18134
6c35b53cd28b
copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents:
18042
diff
changeset
|
473 f2 = movewithdir[f] |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
474 actions['dm'].append((f2, (f, fl1), |
20944
5b8d5803d7b7
merge: keep destination filename as key in actions for merge with dir rename
Mads Kiilerich <madski@unity3d.com>
parents:
20943
diff
changeset
|
475 "remote directory rename - move from " + f)) |
18822
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
476 elif n1 and f in copy: |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
477 f2 = copy[f] |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
478 actions['m'].append((f, (f, f2, f2, False, pa.node()), |
20945
18adc15635a1
merge: keep destination filename as key in filemerge actions
Mads Kiilerich <madski@unity3d.com>
parents:
20944
diff
changeset
|
479 "local copied/moved from " + f2)) |
18822
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
480 elif n1 and f in ma: # clean, a different, no remote |
18818
a0bff3d4f67b
manifestmerge: rename n to n1 and n2
Siddharth Agarwal <sid0@fb.com>
parents:
18780
diff
changeset
|
481 if n1 != ma[f]: |
20639
1df033640a8e
merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents:
20620
diff
changeset
|
482 if acceptremote: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
483 actions['r'].append((f, None, "remote delete")) |
20639
1df033640a8e
merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents:
20620
diff
changeset
|
484 else: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
485 actions['cd'].append((f, None, "prompt changed/deleted")) |
18818
a0bff3d4f67b
manifestmerge: rename n to n1 and n2
Siddharth Agarwal <sid0@fb.com>
parents:
18780
diff
changeset
|
486 elif n1[20:] == "a": # added, no remote |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
487 actions['f'].append((f, None, "remote deleted")) |
16094
0776a6cababe
merge: don't use unknown()
Matt Mackall <mpm@selenic.com>
parents:
16093
diff
changeset
|
488 else: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
489 actions['r'].append((f, None, "other deleted")) |
18822
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
490 elif n2 and f in movewithdir: |
18134
6c35b53cd28b
copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents:
18042
diff
changeset
|
491 f2 = movewithdir[f] |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
492 actions['dg'].append((f2, (f, fl2), |
20944
5b8d5803d7b7
merge: keep destination filename as key in actions for merge with dir rename
Mads Kiilerich <madski@unity3d.com>
parents:
20943
diff
changeset
|
493 "local directory rename - get from " + f)) |
18822
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
494 elif n2 and f in copy: |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
495 f2 = copy[f] |
18339
aadefcee1f5e
merge: remove "case" comments
Mads Kiilerich <mads@kiilerich.com>
parents:
18338
diff
changeset
|
496 if f2 in m2: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
497 actions['m'].append((f, (f2, f, f2, False, pa.node()), |
20945
18adc15635a1
merge: keep destination filename as key in filemerge actions
Mads Kiilerich <madski@unity3d.com>
parents:
20944
diff
changeset
|
498 "remote copied from " + f2)) |
18339
aadefcee1f5e
merge: remove "case" comments
Mads Kiilerich <mads@kiilerich.com>
parents:
18338
diff
changeset
|
499 else: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
500 actions['m'].append((f, (f2, f, f2, True, pa.node()), |
20945
18adc15635a1
merge: keep destination filename as key in filemerge actions
Mads Kiilerich <madski@unity3d.com>
parents:
20944
diff
changeset
|
501 "remote moved from " + f2)) |
18822
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
502 elif n2 and f not in ma: |
18606
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
503 # local unknown, remote created: the logic is described by the |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
504 # following table: |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
505 # |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
506 # force branchmerge different | action |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
507 # n * n | get |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
508 # n * y | abort |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
509 # y n * | get |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
510 # y y n | get |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
511 # y y y | merge |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
512 # |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
513 # Checking whether the files are different is expensive, so we |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
514 # don't do that when we can avoid it. |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
515 if force and not branchmerge: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
516 actions['g'].append((f, (fl2,), "remote created")) |
18339
aadefcee1f5e
merge: remove "case" comments
Mads Kiilerich <mads@kiilerich.com>
parents:
18338
diff
changeset
|
517 else: |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
518 different = _checkunknownfile(repo, wctx, p2, f) |
18606
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
519 if force and branchmerge and different: |
20897
0b50788c160c
merge: use ancestor filename from planning phase instead of filectx ancestor
Mads Kiilerich <madski@unity3d.com>
parents:
20870
diff
changeset
|
520 # FIXME: This is wrong - f is not in ma ... |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
521 actions['m'].append((f, (f, f, f, False, pa.node()), |
18606
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
522 "remote differs from untracked local")) |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
523 elif not force and different: |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
524 aborts.append((f, "ud")) |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
525 else: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
526 actions['g'].append((f, (fl2,), "remote created")) |
18822
381c0ef72a56
manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents:
18818
diff
changeset
|
527 elif n2 and n2 != ma[f]: |
20415
e4d7cbc94219
merge: don't overwrite file untracked after remove, abort with 'untracked files'
Mads Kiilerich <madski@unity3d.com>
parents:
20280
diff
changeset
|
528 different = _checkunknownfile(repo, wctx, p2, f) |
e4d7cbc94219
merge: don't overwrite file untracked after remove, abort with 'untracked files'
Mads Kiilerich <madski@unity3d.com>
parents:
20280
diff
changeset
|
529 if not force and different: |
e4d7cbc94219
merge: don't overwrite file untracked after remove, abort with 'untracked files'
Mads Kiilerich <madski@unity3d.com>
parents:
20280
diff
changeset
|
530 aborts.append((f, "ud")) |
e4d7cbc94219
merge: don't overwrite file untracked after remove, abort with 'untracked files'
Mads Kiilerich <madski@unity3d.com>
parents:
20280
diff
changeset
|
531 else: |
e4d7cbc94219
merge: don't overwrite file untracked after remove, abort with 'untracked files'
Mads Kiilerich <madski@unity3d.com>
parents:
20280
diff
changeset
|
532 # if different: old untracked f may be overwritten and lost |
20639
1df033640a8e
merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents:
20620
diff
changeset
|
533 if acceptremote: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
534 actions['g'].append((f, (m2.flags(f),), |
20639
1df033640a8e
merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents:
20620
diff
changeset
|
535 "remote recreating")) |
1df033640a8e
merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents:
20620
diff
changeset
|
536 else: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
537 actions['dc'].append((f, (m2.flags(f),), |
20640
52929dcdd512
merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents:
20639
diff
changeset
|
538 "prompt deleted/changed")) |
18539
cf25e4efd685
merge: delay prompts a bit and show them in (extra) sorted order
Mads Kiilerich <madski@unity3d.com>
parents:
18505
diff
changeset
|
539 |
18606
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
540 for f, m in sorted(aborts): |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
541 if m == "ud": |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
542 repo.ui.warn(_("%s: untracked file differs\n") % f) |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
543 else: assert False, m |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
544 if aborts: |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
545 raise util.Abort(_("untracked files in working directory differ " |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
546 "from files in requested revision")) |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
547 |
19105
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
548 if not util.checkcase(repo.path): |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
549 # check collision between files only in p2 for clean update |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
550 if (not branchmerge and |
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
551 (force or not wctx.dirty(missing=True, branch=False))): |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
552 _checkcollision(repo, m2, None) |
19105
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
553 else: |
20640
52929dcdd512
merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents:
20639
diff
changeset
|
554 _checkcollision(repo, m1, actions) |
19105
c60a7f5a741f
icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19095
diff
changeset
|
555 |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
556 return actions |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
557 |
21392
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
558 def batchremove(repo, actions): |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
559 """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
|
560 |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
561 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
|
562 """ |
18640
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
563 verbose = repo.ui.verbose |
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
564 unlink = util.unlinkpath |
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
565 wjoin = repo.wjoin |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
566 audit = repo.wopener.audit |
18633
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
567 i = 0 |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
568 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
|
569 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
|
570 if verbose: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
571 repo.ui.note(_("removing %s\n") % f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
572 audit(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
573 try: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
574 unlink(wjoin(f), ignoremissing=True) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
575 except OSError, inst: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
576 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
|
577 (f, inst.strerror)) |
21392
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
578 if i == 100: |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
579 yield i, f |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
580 i = 0 |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
581 i += 1 |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
582 if i > 0: |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
583 yield i, f |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
584 |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
585 def batchget(repo, mctx, actions): |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
586 """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
|
587 |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
588 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
|
589 |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
590 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
|
591 """ |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
592 verbose = repo.ui.verbose |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
593 fctx = mctx.filectx |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
594 wwrite = repo.wwrite |
b1ce47dadbdf
merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents:
21391
diff
changeset
|
595 i = 0 |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
596 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
|
597 repo.ui.debug(" %s: %s -> g\n" % (f, msg)) |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
598 if verbose: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
599 repo.ui.note(_("getting %s\n") % f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
600 wwrite(f, fctx(f).data(), args[0]) |
18633
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
601 if i == 100: |
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
602 yield i, f |
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
603 i = 0 |
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
604 i += 1 |
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
605 if i > 0: |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
606 yield i, f |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
607 |
21524
47b97d9af27e
merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents:
21392
diff
changeset
|
608 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
|
609 """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
|
610 |
9b0406b23be0
merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
11451
diff
changeset
|
611 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
|
612 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
|
613 |
115a9760c382
merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents:
13158
diff
changeset
|
614 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
|
615 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
|
616 """ |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
617 |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
618 updated, merged, removed, unresolved = 0, 0, 0, 0 |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
619 ms = mergestate(repo) |
20591
02c60e380fd0
merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20590
diff
changeset
|
620 ms.reset(wctx.p1().node(), mctx.node()) |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
621 moves = [] |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
622 for m, l in actions.items(): |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
623 l.sort() |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
624 |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
625 # prescan for merges |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
626 for f, args, msg in actions['m']: |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
627 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
|
628 if f == '.hgsubstate': # merged internally |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
629 continue |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
630 repo.ui.debug(" preserving %s for resolve of %s\n" % (f1, f)) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
631 fcl = wctx[f1] |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
632 fco = mctx[f2] |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
633 actx = repo[anc] |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
634 if fa in actx: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
635 fca = actx[fa] |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
636 else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
637 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
|
638 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
|
639 if f1 != f and move: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
640 moves.append(f1) |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
641 |
18328
2fee5119099b
merge: consistently use repo.wopener.audit instead of creating a new auditor
Mads Kiilerich <mads@kiilerich.com>
parents:
18143
diff
changeset
|
642 audit = repo.wopener.audit |
21390
26b84128c54d
merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents:
21389
diff
changeset
|
643 _updating = _('updating') |
26b84128c54d
merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents:
21389
diff
changeset
|
644 _files = _('files') |
26b84128c54d
merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents:
21389
diff
changeset
|
645 progress = repo.ui.progress |
14398
ae1f7a5373e8
applyupdates: audit unlinking of renamed files and directories
Adrian Buehlmann <adrian@cadifra.com>
parents:
14232
diff
changeset
|
646 |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
647 # remove renamed files after safely stored |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
648 for f in moves: |
12032
ad787252fed6
util: remove lexists, Python 2.4 introduced os.path.lexists
Martin Geisler <mg@lazybytes.net>
parents:
12010
diff
changeset
|
649 if os.path.lexists(repo.wjoin(f)): |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9048
diff
changeset
|
650 repo.ui.debug("removing %s\n" % f) |
14398
ae1f7a5373e8
applyupdates: audit unlinking of renamed files and directories
Adrian Buehlmann <adrian@cadifra.com>
parents:
14232
diff
changeset
|
651 audit(f) |
18333
f6f23ecafc9b
merge: use util.unlinkpath for removing moved files
Mads Kiilerich <mads@kiilerich.com>
parents:
18332
diff
changeset
|
652 util.unlinkpath(repo.wjoin(f)) |
5042
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
653 |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
654 numupdates = sum(len(l) for m, l in actions.items() if m != 'k') |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
655 |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
656 if [a for a in actions['r'] if a[0] == '.hgsubstate']: |
18632
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
657 subrepo.submerge(repo, wctx, mctx, wctx, overwrite) |
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
658 |
21390
26b84128c54d
merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents:
21389
diff
changeset
|
659 # remove in parallel (must come first) |
18633
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
660 z = 0 |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
661 prog = worker.worker(repo.ui, 0.001, batchremove, (repo,), actions['r']) |
19095
5cc71484ee9c
merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18985
diff
changeset
|
662 for i, item in prog: |
5cc71484ee9c
merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18985
diff
changeset
|
663 z += i |
21390
26b84128c54d
merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents:
21389
diff
changeset
|
664 progress(_updating, z, item=item, total=numupdates, unit=_files) |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
665 removed = len(actions['r']) |
21390
26b84128c54d
merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents:
21389
diff
changeset
|
666 |
26b84128c54d
merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents:
21389
diff
changeset
|
667 # get in parallel |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
668 prog = worker.worker(repo.ui, 0.001, batchget, (repo, mctx), actions['g']) |
18639
5774732bb5e5
merge: apply non-interactive working dir updates in parallel
Bryan O'Sullivan <bryano@fb.com>
parents:
18633
diff
changeset
|
669 for i, item in prog: |
18633
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
670 z += i |
21390
26b84128c54d
merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents:
21389
diff
changeset
|
671 progress(_updating, z, item=item, total=numupdates, unit=_files) |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
672 updated = len(actions['g']) |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
673 |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
674 if [a for a in actions['g'] if a[0] == '.hgsubstate']: |
18632
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
675 subrepo.submerge(repo, wctx, mctx, wctx, overwrite) |
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
676 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
677 # forget (manifest only, just log it) (must come first) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
678 for f, args, msg in actions['f']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
679 repo.ui.debug(" %s: %s -> f\n" % (f, msg)) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
680 z += 1 |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
681 progress(_updating, z, item=f, total=numupdates, unit=_files) |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
682 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
683 # re-add (manifest only, just log it) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
684 for f, args, msg in actions['a']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
685 repo.ui.debug(" %s: %s -> a\n" % (f, msg)) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
686 z += 1 |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
687 progress(_updating, z, item=f, total=numupdates, unit=_files) |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
688 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
689 # keep (noop, just log it) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
690 for f, args, msg in actions['k']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
691 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
|
692 # no progress |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
693 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
694 # merge |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
695 for f, args, msg in actions['m']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
696 repo.ui.debug(" %s: %s -> m\n" % (f, msg)) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
697 z += 1 |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
698 progress(_updating, z, item=f, total=numupdates, unit=_files) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
699 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
|
700 if f == '.hgsubstate': # subrepo states need updating |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
701 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx), |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
702 overwrite) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
703 continue |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
704 audit(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
705 r = ms.resolve(f, wctx, labels=labels) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
706 if r is not None and r > 0: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
707 unresolved += 1 |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
708 else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
709 if r is None: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
710 updated += 1 |
3309
e8be5942335d
merge: pull file copy/move out of filemerge
Matt Mackall <mpm@selenic.com>
parents:
3308
diff
changeset
|
711 else: |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
712 merged += 1 |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
713 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
714 # directory rename, move local |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
715 for f, args, msg in actions['dm']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
716 repo.ui.debug(" %s: %s -> dm\n" % (f, msg)) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
717 z += 1 |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
718 progress(_updating, z, item=f, total=numupdates, unit=_files) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
719 f0, flags = args |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
720 repo.ui.note(_("moving %s to %s\n") % (f0, f)) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
721 audit(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
722 repo.wwrite(f, wctx.filectx(f0).data(), flags) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
723 util.unlinkpath(repo.wjoin(f0)) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
724 updated += 1 |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
725 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
726 # local directory rename, get |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
727 for f, args, msg in actions['dg']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
728 repo.ui.debug(" %s: %s -> dg\n" % (f, msg)) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
729 z += 1 |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
730 progress(_updating, z, item=f, total=numupdates, unit=_files) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
731 f0, flags = args |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
732 repo.ui.note(_("getting %s to %s\n") % (f0, f)) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
733 repo.wwrite(f, mctx.filectx(f0).data(), flags) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
734 updated += 1 |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
735 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
736 # divergent renames |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
737 for f, args, msg in actions['dr']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
738 repo.ui.debug(" %s: %s -> dr\n" % (f, msg)) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
739 z += 1 |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
740 progress(_updating, z, item=f, total=numupdates, unit=_files) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
741 fl, = args |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
742 repo.ui.warn(_("note: possible conflict - %s was renamed " |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
743 "multiple times to:\n") % f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
744 for nf in fl: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
745 repo.ui.warn(" %s\n" % nf) |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
746 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
747 # rename and delete |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
748 for f, args, msg in actions['rd']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
749 repo.ui.debug(" %s: %s -> rd\n" % (f, msg)) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
750 z += 1 |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
751 progress(_updating, z, item=f, total=numupdates, unit=_files) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
752 fl, = args |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
753 repo.ui.warn(_("note: possible conflict - %s was deleted " |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
754 "and renamed to:\n") % f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
755 for nf in fl: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
756 repo.ui.warn(" %s\n" % nf) |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
757 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
758 # exec |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
759 for f, args, msg in actions['e']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
760 repo.ui.debug(" %s: %s -> e\n" % (f, msg)) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
761 z += 1 |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
762 progress(_updating, z, item=f, total=numupdates, unit=_files) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
763 flags, = args |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
764 audit(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
765 util.setflags(repo.wjoin(f), 'l' in flags, 'x' in flags) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
766 updated += 1 |
21391
cb15835456cb
merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents:
21390
diff
changeset
|
767 |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
768 ms.commit() |
18640
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
769 progress(_updating, None, total=numupdates, unit=_files) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
770 |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
771 return updated, merged, removed, unresolved |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
772 |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
773 def calculateupdates(repo, wctx, mctx, ancestors, branchmerge, force, partial, |
21080
04540a8499a3
merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents:
21024
diff
changeset
|
774 acceptremote, followcopies): |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
775 "Calculate the actions needed to merge mctx into wctx using ancestors" |
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
776 |
21128
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
777 if len(ancestors) == 1: # default |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
778 actions = manifestmerge(repo, wctx, mctx, ancestors[0], |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
779 branchmerge, force, |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
780 partial, acceptremote, followcopies) |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
781 |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
782 else: # only when merge.preferancestor=* - experimentalish code |
21171
33737ebc6f39
merge: tell the user when we are using bid merge
Mads Kiilerich <madski@unity3d.com>
parents:
21170
diff
changeset
|
783 repo.ui.status( |
33737ebc6f39
merge: tell the user when we are using bid merge
Mads Kiilerich <madski@unity3d.com>
parents:
21170
diff
changeset
|
784 _("note: merging %s and %s using bids from ancestors %s\n") % |
33737ebc6f39
merge: tell the user when we are using bid merge
Mads Kiilerich <madski@unity3d.com>
parents:
21170
diff
changeset
|
785 (wctx, mctx, _(' and ').join(str(anc) for anc in ancestors))) |
33737ebc6f39
merge: tell the user when we are using bid merge
Mads Kiilerich <madski@unity3d.com>
parents:
21170
diff
changeset
|
786 |
21128
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
787 # Call for bids |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
788 fbids = {} # mapping filename to bids (action method to list af actions) |
21128
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
789 for ancestor in ancestors: |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
790 repo.ui.note(_('\ncalculating bids for ancestor %s\n') % ancestor) |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
791 actions = manifestmerge(repo, wctx, mctx, ancestor, |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
792 branchmerge, force, |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
793 partial, acceptremote, followcopies) |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
794 for m, l in sorted(actions.items()): |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
795 for a in l: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
796 f, args, msg = a |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
797 repo.ui.debug(' %s: %s -> %s\n' % (f, msg, m)) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
798 if f in fbids: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
799 d = fbids[f] |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
800 if m in d: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
801 d[m].append(a) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
802 else: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
803 d[m] = [a] |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
804 else: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
805 fbids[f] = {m: [a]} |
21080
04540a8499a3
merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents:
21024
diff
changeset
|
806 |
21128
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
807 # Pick the best bid for each file |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
808 repo.ui.note(_('\nauction for merging merge bids\n')) |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
809 actions = dict((m, []) for m in actions.keys()) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
810 for f, bids in sorted(fbids.items()): |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
811 # bids is a mapping from action method to list af actions |
21128
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
812 # Consensus? |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
813 if len(bids) == 1: # all bids are the same kind of method |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
814 m, l = bids.items()[0] |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
815 if util.all(a == l[0] for a in l[1:]): # len(bids) is > 1 |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
816 repo.ui.note(" %s: consensus for %s\n" % (f, m)) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
817 actions[m].append(l[0]) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
818 continue |
21128
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
819 # If keep is an option, just do it. |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
820 if "k" in bids: |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
821 repo.ui.note(" %s: picking 'keep' action\n" % f) |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
822 actions['k'].append(bids["k"][0]) |
21128
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
823 continue |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
824 # If there are gets and they all agree [how could they not?], do it. |
21128
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
825 if "g" in bids: |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
826 ga0 = bids["g"][0] |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
827 if util.all(a == ga0 for a in bids["g"][1:]): |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
828 repo.ui.note(" %s: picking 'get' action\n" % f) |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
829 actions['g'].append(ga0) |
21128
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
830 continue |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
831 # TODO: Consider other simple actions such as mode changes |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
832 # Handle inefficient democrazy. |
21172
0f0059af920c
merge: improve notes for listing the bids for ambiguous merges
Mads Kiilerich <madski@unity3d.com>
parents:
21171
diff
changeset
|
833 repo.ui.note(_(' %s: multiple bids for merge action:\n') % f) |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
834 for m, l in sorted(bids.items()): |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
835 for _f, args, msg in l: |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
836 repo.ui.note(' %s -> %s\n' % (msg, m)) |
21128
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
837 # Pick random action. TODO: Instead, prompt user when resolving |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
838 m, l = bids.items()[0] |
21170
ea3972243320
merge: fix stray character in bid merge message
Mads Kiilerich <madski@unity3d.com>
parents:
21168
diff
changeset
|
839 repo.ui.warn(_(' %s: ambiguous merge - picked %s action\n') % |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
840 (f, m)) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
841 actions[m].append(l[0]) |
21128
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
842 continue |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
843 repo.ui.note(_('end of auction\n\n')) |
20640
52929dcdd512
merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents:
20639
diff
changeset
|
844 |
52929dcdd512
merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents:
20639
diff
changeset
|
845 # Prompt and create actions. TODO: Move this towards resolve phase. |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
846 for f, args, msg in actions['cd']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
847 if repo.ui.promptchoice( |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
848 _("local changed %s which remote deleted\n" |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
849 "use (c)hanged version or (d)elete?" |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
850 "$$ &Changed $$ &Delete") % f, 0): |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
851 actions['r'].append((f, None, "prompt delete")) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
852 else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
853 actions['a'].append((f, None, "prompt keep")) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
854 del actions['cd'][:] |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
855 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
856 for f, args, msg in actions['dc']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
857 flags, = args |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
858 if repo.ui.promptchoice( |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
859 _("remote changed %s which local deleted\n" |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
860 "use (c)hanged version or leave (d)eleted?" |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
861 "$$ &Changed $$ &Deleted") % f, 0) == 0: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
862 actions['g'].append((f, (flags,), "prompt recreating")) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
863 del actions['dc'][:] |
20640
52929dcdd512
merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents:
20639
diff
changeset
|
864 |
21080
04540a8499a3
merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents:
21024
diff
changeset
|
865 if wctx.rev() is None: |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
866 ractions, factions = _forgetremoved(wctx, mctx, branchmerge) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
867 actions['r'].extend(ractions) |
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
868 actions['f'].extend(factions) |
20640
52929dcdd512
merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents:
20639
diff
changeset
|
869 |
21545
43eecb4e23f8
merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents:
21524
diff
changeset
|
870 return actions |
18035
5881d5b7552f
merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents:
17889
diff
changeset
|
871 |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
872 def recordupdates(repo, actions, branchmerge): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
873 "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
|
874 # remove (must come first) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
875 for f, args, msg in actions['r']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
876 if branchmerge: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
877 repo.dirstate.remove(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
878 else: |
21389
e741972017d9
merge: change priority / ordering of merge actions
Mads Kiilerich <madski@unity3d.com>
parents:
21269
diff
changeset
|
879 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
|
880 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
881 # forget (must come first) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
882 for f, args, msg in actions['f']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
883 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
|
884 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
885 # re-add |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
886 for f, args, msg in actions['a']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
887 if not branchmerge: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
888 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
|
889 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
890 # exec change |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
891 for f, args, msg in actions['e']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
892 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
|
893 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
894 # keep |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
895 for f, args, msg in actions['k']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
896 pass |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
897 |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
898 # get |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
899 for f, args, msg in actions['g']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
900 if branchmerge: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
901 repo.dirstate.otherparent(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
902 else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
903 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
|
904 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
905 # merge |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
906 for f, args, msg in actions['m']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
907 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
|
908 if branchmerge: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
909 # 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
|
910 # 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
|
911 repo.dirstate.merge(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
912 if f1 != f2: # copy/rename |
3308
ecc1bf27378c
merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents:
3307
diff
changeset
|
913 if move: |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
914 repo.dirstate.remove(f1) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
915 if f1 != f: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
916 repo.dirstate.copy(f1, f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
917 else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
918 repo.dirstate.copy(f2, f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
919 else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
920 # 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
|
921 # 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
|
922 # 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
|
923 # 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
|
924 # modification. |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
925 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
|
926 repo.dirstate.normallookup(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
927 if move: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
928 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
|
929 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
930 # directory rename, move local |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
931 for f, args, msg in actions['dm']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
932 f0, flag = args |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
933 if f0 not in repo.dirstate: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
934 # untracked file moved |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
935 continue |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
936 if branchmerge: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
937 repo.dirstate.add(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
938 repo.dirstate.remove(f0) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
939 repo.dirstate.copy(f0, f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
940 else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
941 repo.dirstate.normal(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
942 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
|
943 |
21551
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
944 # directory rename, get |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
945 for f, args, msg in actions['dg']: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
946 f0, flag = args |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
947 if branchmerge: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
948 repo.dirstate.add(f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
949 repo.dirstate.copy(f0, f) |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
950 else: |
bde505f47141
merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
21545
diff
changeset
|
951 repo.dirstate.normal(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
952 |
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16683
diff
changeset
|
953 def update(repo, node, branchmerge, force, partial, ancestor=None, |
21524
47b97d9af27e
merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents:
21392
diff
changeset
|
954 mergeancestor=False, labels=None): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
955 """ |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
956 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
|
957 |
9716
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
958 node = the node to update to, or None if unspecified |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
959 branchmerge = whether to merge between branches |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
960 force = whether to force branch merging or file overwriting |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
961 partial = a function 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
|
962 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
|
963 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
|
964 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
|
965 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
|
966 as a temporary fix and should be avoided in general. |
9716
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
967 |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
968 The table below shows all the behaviors of the update command |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
969 given the -c and -C or no options, whether the working directory |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
970 is dirty, whether a revision is specified, and the relationship of |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
971 the parent rev to the target rev (linear, on the same named |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
972 branch, or on another named branch). |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
973 |
12279 | 974 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
|
975 |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
976 -c -C dirty rev | linear same cross |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
977 n n n n | ok (1) x |
9717
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
978 n n n y | ok ok ok |
19799
ab3e42225dbc
update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents:
19798
diff
changeset
|
979 n n y n | merge (2) (2) |
ab3e42225dbc
update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents:
19798
diff
changeset
|
980 n n y y | merge (3) (3) |
9716
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
981 n y * * | --- discard --- |
19799
ab3e42225dbc
update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents:
19798
diff
changeset
|
982 y n y * | --- (4) --- |
9716
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
983 y n n * | --- ok --- |
19799
ab3e42225dbc
update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents:
19798
diff
changeset
|
984 y y * * | --- (5) --- |
9716
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
985 |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
986 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
|
987 * = don't-care |
19798
76df01e56e7f
update: improve error message for clean non-linear update
Siddharth Agarwal <sid0@fb.com>
parents:
19482
diff
changeset
|
988 1 = abort: not a linear update (merge or update --check to force update) |
19800
4894e0d9462d
update: improve error message for dirty non-linear update with rev
Siddharth Agarwal <sid0@fb.com>
parents:
19799
diff
changeset
|
989 2 = abort: uncommitted changes (commit and merge, or update --clean to |
4894e0d9462d
update: improve error message for dirty non-linear update with rev
Siddharth Agarwal <sid0@fb.com>
parents:
19799
diff
changeset
|
990 discard changes) |
19799
ab3e42225dbc
update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents:
19798
diff
changeset
|
991 3 = abort: uncommitted changes (commit or update --clean to discard changes) |
19801
41abe2e3e3b7
update: standardize error message for dirty update --check
Siddharth Agarwal <sid0@fb.com>
parents:
19800
diff
changeset
|
992 4 = abort: uncommitted changes (checked in commands.py) |
19799
ab3e42225dbc
update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents:
19798
diff
changeset
|
993 5 = incompatible options (checked in commands.py) |
13162
115a9760c382
merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents:
13158
diff
changeset
|
994 |
115a9760c382
merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents:
13158
diff
changeset
|
995 Return the same tuple as applyupdates(). |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
996 """ |
2815
4870f795f681
Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents:
2814
diff
changeset
|
997 |
9717
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
998 onode = node |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
999 wlock = repo.wlock() |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1000 try: |
6747
f6c00b17387c
use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents:
6746
diff
changeset
|
1001 wc = repo[None] |
20279
5b4f963d21cc
merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20278
diff
changeset
|
1002 pl = wc.parents() |
5b4f963d21cc
merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20278
diff
changeset
|
1003 p1 = pl[0] |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1004 pas = [None] |
20279
5b4f963d21cc
merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20278
diff
changeset
|
1005 if ancestor: |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1006 pas = [repo[ancestor]] |
20279
5b4f963d21cc
merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20278
diff
changeset
|
1007 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1008 if node is None: |
20278
20ef533ffb01
merge: update comment for future devs
Sean Farley <sean.michael.farley@gmail.com>
parents:
19987
diff
changeset
|
1009 # Here is where we should consider bookmarks, divergent bookmarks, |
20ef533ffb01
merge: update comment for future devs
Sean Farley <sean.michael.farley@gmail.com>
parents:
19987
diff
changeset
|
1010 # foreground changesets (successors), and tip of current branch; |
20ef533ffb01
merge: update comment for future devs
Sean Farley <sean.michael.farley@gmail.com>
parents:
19987
diff
changeset
|
1011 # but currently we are only checking the branch tips. |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1012 try: |
16719
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16696
diff
changeset
|
1013 node = repo.branchtip(wc.branch()) |
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16696
diff
changeset
|
1014 except error.RepoLookupError: |
5570
78a6b985882f
update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents:
5489
diff
changeset
|
1015 if wc.branch() == "default": # no default branch! |
78a6b985882f
update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents:
5489
diff
changeset
|
1016 node = repo.lookup("tip") # update to tip |
78a6b985882f
update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents:
5489
diff
changeset
|
1017 else: |
78a6b985882f
update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents:
5489
diff
changeset
|
1018 raise util.Abort(_("branch %s not found") % wc.branch()) |
20280
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1019 |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1020 if p1.obsolete() and not p1.children(): |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1021 # allow updating to successors |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1022 successors = obsolete.successorssets(repo, p1.node()) |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1023 |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1024 # behavior of certain cases is as follows, |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1025 # |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1026 # divergent changesets: update to highest rev, similar to what |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1027 # is currently done when there are more than one head |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1028 # (i.e. 'tip') |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1029 # |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1030 # replaced changesets: same as divergent except we know there |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1031 # is no conflict |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1032 # |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1033 # pruned changeset: no update is done; though, we could |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1034 # consider updating to the first non-obsolete parent, |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1035 # similar to what is current done for 'hg prune' |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1036 |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1037 if successors: |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1038 # flatten the list here handles both divergent (len > 1) |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1039 # and the usual case (len = 1) |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1040 successors = [n for sub in successors for n in sub] |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1041 |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1042 # get the max revision for the given successors set, |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1043 # i.e. the 'tip' of a set |
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1044 node = repo.revs("max(%ln)", successors)[0] |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1045 pas = [p1] |
20280
95b9c6149e17
merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20279
diff
changeset
|
1046 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1047 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
|
1048 |
5b4f963d21cc
merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents:
20278
diff
changeset
|
1049 p2 = repo[node] |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1050 if pas[0] is None: |
21128
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
1051 if repo.ui.config("merge", "preferancestor") == '*': |
f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21082
diff
changeset
|
1052 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
|
1053 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
|
1054 else: |
21203
9f12d8665c7b
ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents:
21172
diff
changeset
|
1055 pas = [p1.ancestor(p2, warn=True)] |
13874
9d67277c9204
merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents:
13728
diff
changeset
|
1056 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1057 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2) |
3314 | 1058 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1059 ### check phase |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1060 if not overwrite and len(pl) > 1: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1061 raise util.Abort(_("outstanding uncommitted merges")) |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
1062 if branchmerge: |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1063 if pas == [p2]: |
11417
6f1d1ed3e19a
merge: improve merge with ancestor message
Matt Mackall <mpm@selenic.com>
parents:
11178
diff
changeset
|
1064 raise util.Abort(_("merging with a working directory ancestor" |
6f1d1ed3e19a
merge: improve merge with ancestor message
Matt Mackall <mpm@selenic.com>
parents:
11178
diff
changeset
|
1065 " has no effect")) |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1066 elif pas == [p1]: |
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16683
diff
changeset
|
1067 if not mergeancestor and p1.branch() == p2.branch(): |
15619
6c8573dd1b6b
merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents:
15538
diff
changeset
|
1068 raise util.Abort(_("nothing to merge"), |
6c8573dd1b6b
merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents:
15538
diff
changeset
|
1069 hint=_("use 'hg update' " |
6c8573dd1b6b
merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents:
15538
diff
changeset
|
1070 "or check 'hg heads'")) |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
1071 if not force and (wc.files() or wc.deleted()): |
19802
94c394653b2a
merge: standardize error message for dirty working dir
Siddharth Agarwal <sid0@fb.com>
parents:
19801
diff
changeset
|
1072 raise util.Abort(_("uncommitted changes"), |
15619
6c8573dd1b6b
merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents:
15538
diff
changeset
|
1073 hint=_("use 'hg status' to list changes")) |
18364
6252b4f1c4b4
subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents:
18360
diff
changeset
|
1074 for s in sorted(wc.substate): |
13437
6169493ac3f9
Do not allow merging with uncommitted changes in a subrepo
Oleg Stepanov <oleg.stepanov@jetbrains.com>
parents:
13400
diff
changeset
|
1075 if wc.sub(s).dirty(): |
19803
0f64af33fb63
merge: standardize error message for dirty subrepo
Siddharth Agarwal <sid0@fb.com>
parents:
19802
diff
changeset
|
1076 raise util.Abort(_("uncommitted changes in " |
13437
6169493ac3f9
Do not allow merging with uncommitted changes in a subrepo
Oleg Stepanov <oleg.stepanov@jetbrains.com>
parents:
13400
diff
changeset
|
1077 "subrepository '%s'") % s) |
6169493ac3f9
Do not allow merging with uncommitted changes in a subrepo
Oleg Stepanov <oleg.stepanov@jetbrains.com>
parents:
13400
diff
changeset
|
1078 |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
1079 elif not overwrite: |
19929
ab2362e1672e
merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
19803
diff
changeset
|
1080 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
|
1081 # 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
|
1082 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
|
1083 repo.hook('update', parent1=xp2, parent2='', error=0) |
ab2362e1672e
merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
19803
diff
changeset
|
1084 return 0, 0, 0, 0 |
ab2362e1672e
merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
19803
diff
changeset
|
1085 |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1086 if 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
|
1087 dirty = wc.dirty(missing=True) |
a59e575c6ff8
update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18895
diff
changeset
|
1088 if dirty or onode is None: |
a59e575c6ff8
update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18895
diff
changeset
|
1089 # Branching is a bit strange to ensure we do the minimal |
a59e575c6ff8
update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18895
diff
changeset
|
1090 # amount of call to obsolete.background. |
a59e575c6ff8
update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18895
diff
changeset
|
1091 foreground = obsolete.foreground(repo, [p1.node()]) |
a59e575c6ff8
update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18895
diff
changeset
|
1092 # 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
|
1093 if repo[node].node() in foreground: |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1094 pas = [p1] # allow updating to successors |
19799
ab3e42225dbc
update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents:
19798
diff
changeset
|
1095 elif dirty: |
ab3e42225dbc
update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents:
19798
diff
changeset
|
1096 msg = _("uncommitted changes") |
19800
4894e0d9462d
update: improve error message for dirty non-linear update with rev
Siddharth Agarwal <sid0@fb.com>
parents:
19799
diff
changeset
|
1097 if onode is None: |
4894e0d9462d
update: improve error message for dirty non-linear update with rev
Siddharth Agarwal <sid0@fb.com>
parents:
19799
diff
changeset
|
1098 hint = _("commit and merge, or update --clean to" |
4894e0d9462d
update: improve error message for dirty non-linear update with rev
Siddharth Agarwal <sid0@fb.com>
parents:
19799
diff
changeset
|
1099 " discard changes") |
4894e0d9462d
update: improve error message for dirty non-linear update with rev
Siddharth Agarwal <sid0@fb.com>
parents:
19799
diff
changeset
|
1100 else: |
4894e0d9462d
update: improve error message for dirty non-linear update with rev
Siddharth Agarwal <sid0@fb.com>
parents:
19799
diff
changeset
|
1101 hint = _("commit or update --clean to discard" |
4894e0d9462d
update: improve error message for dirty non-linear update with rev
Siddharth Agarwal <sid0@fb.com>
parents:
19799
diff
changeset
|
1102 " changes") |
19799
ab3e42225dbc
update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents:
19798
diff
changeset
|
1103 raise util.Abort(msg, hint=hint) |
18985
a59e575c6ff8
update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18895
diff
changeset
|
1104 else: # node is none |
19798
76df01e56e7f
update: improve error message for clean non-linear update
Siddharth Agarwal <sid0@fb.com>
parents:
19482
diff
changeset
|
1105 msg = _("not a linear update") |
76df01e56e7f
update: improve error message for clean non-linear update
Siddharth Agarwal <sid0@fb.com>
parents:
19482
diff
changeset
|
1106 hint = _("merge or update --check to force update") |
76df01e56e7f
update: improve error message for clean non-linear update
Siddharth Agarwal <sid0@fb.com>
parents:
19482
diff
changeset
|
1107 raise util.Abort(msg, hint=hint) |
18985
a59e575c6ff8
update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18895
diff
changeset
|
1108 else: |
a59e575c6ff8
update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18895
diff
changeset
|
1109 # Allow jumping branches if clean and specific rev given |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1110 pas = [p1] |
2814
0f787997e3c2
Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents:
2813
diff
changeset
|
1111 |
21080
04540a8499a3
merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents:
21024
diff
changeset
|
1112 followcopies = False |
04540a8499a3
merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents:
21024
diff
changeset
|
1113 if overwrite: |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1114 pas = [wc] |
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1115 elif pas == [p2]: # backwards |
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1116 pas = [wc.p1()] |
21080
04540a8499a3
merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents:
21024
diff
changeset
|
1117 elif not branchmerge and not wc.dirty(missing=True): |
04540a8499a3
merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents:
21024
diff
changeset
|
1118 pass |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1119 elif pas[0] and repo.ui.configbool("merge", "followcopies", True): |
21080
04540a8499a3
merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents:
21024
diff
changeset
|
1120 followcopies = True |
04540a8499a3
merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents:
21024
diff
changeset
|
1121 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1122 ### calculate phase |
21081
ffd7b6ce46ff
merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents:
21080
diff
changeset
|
1123 actions = calculateupdates(repo, wc, p2, pas, branchmerge, force, |
21080
04540a8499a3
merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents:
21024
diff
changeset
|
1124 partial, mergeancestor, followcopies) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1125 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1126 ### apply phase |
13550
1792b8a9422b
merge: back out single-parent fast-forward merge
Matt Mackall <mpm@selenic.com>
parents:
13536
diff
changeset
|
1127 if not branchmerge: # just jump to the new rev |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1128 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1129 if not partial: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1130 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2) |
19482
499fc471296b
update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents:
19285
diff
changeset
|
1131 # note that we're in the middle of an update |
499fc471296b
update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents:
19285
diff
changeset
|
1132 repo.vfs.write('updatestate', p2.hex()) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1133 |
21524
47b97d9af27e
merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents:
21392
diff
changeset
|
1134 stats = applyupdates(repo, actions, wc, p2, overwrite, labels=labels) |
2899
8743188f4d2e
merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents:
2898
diff
changeset
|
1135 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1136 if not partial: |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16534
diff
changeset
|
1137 repo.setparents(fp1, fp2) |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
1138 recordupdates(repo, actions, branchmerge) |
19482
499fc471296b
update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents:
19285
diff
changeset
|
1139 # update completed, clear state |
499fc471296b
update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents:
19285
diff
changeset
|
1140 util.unlink(repo.join('updatestate')) |
499fc471296b
update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents:
19285
diff
changeset
|
1141 |
13561
0ab0ceefddf2
merge: remove last traces of fastforward merging
Mads Kiilerich <mads@kiilerich.com>
parents:
13550
diff
changeset
|
1142 if not branchmerge: |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1143 repo.dirstate.setbranch(p2.branch()) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
1144 finally: |
8109
496ae1ea4698
switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
7848
diff
changeset
|
1145 wlock.release() |
10492
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10431
diff
changeset
|
1146 |
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10431
diff
changeset
|
1147 if not partial: |
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10431
diff
changeset
|
1148 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3]) |
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10431
diff
changeset
|
1149 return stats |