annotate mercurial/merge.py @ 20642:0dc7a50345c2

merge: use the right ancestor when both sides copied the same file The tests shows no real changes because of this ... but there must be some weird corner cases where using the right ancestor for the merge planning is better than using the wrong one.
author Mads Kiilerich <madski@unity3d.com>
date Tue, 25 Feb 2014 20:29:46 +0100
parents 52929dcdd512
children c1a52dd56eb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
1 # merge.py - directory-level update/merge handling for Mercurial
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
2 #
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8152
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9783
diff changeset
6 # GNU General Public License version 2 or any later version.
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
7
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
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
10 from node import nullid, nullrev, hex, bin
3891
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3877
diff changeset
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"
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
50 def __init__(self, repo):
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
51 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
52 self._dirty = False
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
53 self._read()
20591
02c60e380fd0 merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20590
diff changeset
54 def reset(self, node=None, other=None):
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
55 self._state = {}
7848
89e05c02a4af resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents: 7768
diff changeset
56 if node:
89e05c02a4af resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents: 7768
diff changeset
57 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
58 self._other = other
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
59 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
60 self._dirty = False
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
61 def _read(self):
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
62 self._state = {}
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
63 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
64 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
65 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
66 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
67 elif rtype == 'O':
02c60e380fd0 merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20590
diff changeset
68 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
69 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
70 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
71 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
72 elif not rtype.islower():
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
73 raise util.Abort(_('unsupported merge state record:'
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
74 % rtype))
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 self._dirty = False
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 def _readrecords(self):
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
77 v1records = self._readrecordsv1()
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
78 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
79 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
80 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
81 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
82 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
83 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
84 # 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
85 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
86 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
87 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
88 # 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
89 # 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
90 # 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
91 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
92 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
93 # 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
94 # 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
95 # 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
96 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
97 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
98 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
99 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
100 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
101 return v1records
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
102 else:
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
103 return v2records
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
104 def _readrecordsv1(self):
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
105 records = []
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
106 try:
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
107 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
108 for i, l in enumerate(f):
4b92591c69a7 merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents: 6518
diff changeset
109 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
110 records.append(('L', l[:-1]))
6530
4b92591c69a7 merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents: 6518
diff changeset
111 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
112 records.append(('F', l[:-1]))
13400
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13323
diff changeset
113 f.close()
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
114 except IOError, err:
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
115 if err.errno != errno.ENOENT:
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
116 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
117 return records
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
118 def _readrecordsv2(self):
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
119 records = []
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
120 try:
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
121 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
122 data = f.read()
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
123 off = 0
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
124 end = len(data)
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
125 while off < end:
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
126 rtype = data[off]
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
127 off += 1
20607
abd448767465 merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents: 20594
diff changeset
128 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
129 off += 4
20607
abd448767465 merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents: 20594
diff changeset
130 record = data[off:(off + length)]
abd448767465 merge: fix spelling of length
Olle Lundberg <geek@nerd.sh>
parents: 20594
diff changeset
131 off += length
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
132 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
133 f.close()
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
134 except IOError, err:
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
135 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
136 raise
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
137 return records
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
138 def commit(self):
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
139 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
140 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
141 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
142 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
143 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
144 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
145 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
146 self._dirty = False
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
147 def _writerecords(self, records):
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
148 self._writerecordsv1(records)
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
149 self._writerecordsv2(records)
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
150 def _writerecordsv1(self, records):
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
151 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
152 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
153 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
154 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
155 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
156 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
157 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
158 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
159 f.close()
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
160 def _writerecordsv2(self, records):
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
161 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
162 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
163 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
164 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
165 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
166 f.close()
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
167 def add(self, fcl, fco, fca, fd):
6517
fcfb6a0a0a84 python-2.6: use sha wrapper from util for new merge code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6512
diff changeset
168 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
169 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
170 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
171 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
172 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
173 fcl.flags()]
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
174 self._dirty = True
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
175 def __contains__(self, dfile):
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
176 return dfile in self._state
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
177 def __getitem__(self, dfile):
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
178 return self._state[dfile][0]
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
179 def __iter__(self):
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
180 l = self._state.keys()
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
181 l.sort()
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
182 for f in l:
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
183 yield f
19285
feaf5749d7a4 merge: add a files method to the mergestate class
Bryan O'Sullivan <bryano@fb.com>
parents: 19226
diff changeset
184 def files(self):
feaf5749d7a4 merge: add a files method to the mergestate class
Bryan O'Sullivan <bryano@fb.com>
parents: 19226
diff changeset
185 return self._state.keys()
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
186 def mark(self, dfile, state):
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
187 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
188 self._dirty = True
20594
ba619c50a355 resolve: use "other" changeset from merge state (issue4163)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20593
diff changeset
189 def resolve(self, dfile, wctx):
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
190 if self[dfile] == 'r':
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
191 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
192 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
193 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
194 octx = self._repo[self._other]
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
195 fcd = wctx[dfile]
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
196 fco = octx[ofile]
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
197 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
198 # "premerge" x flags
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
199 flo = fco.flags()
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
200 fla = fca.flags()
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
201 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
202 if fca.node() == nullid:
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
203 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
204 afile)
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
205 elif flags == fla:
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
206 flags = flo
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
207 # restore local
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
208 f = self._repo.opener("merge/" + hash)
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
209 self._repo.wwrite(dfile, f.read(), flags)
13400
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13323
diff changeset
210 f.close()
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
211 r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca)
13536
fac040b7e822 merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents: 13437
diff changeset
212 if r is None:
fac040b7e822 merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents: 13437
diff changeset
213 # no real conflict
fac040b7e822 merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents: 13437
diff changeset
214 del self._state[dfile]
fac040b7e822 merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents: 13437
diff changeset
215 elif not r:
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
216 self.mark(dfile, 'r')
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
217 return r
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
218
16093
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16092
diff changeset
219 def _checkunknownfile(repo, wctx, mctx, f):
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16092
diff changeset
220 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
221 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
222 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
223 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
224 and mctx[f].cmp(wctx[f]))
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16092
diff changeset
225
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16092
diff changeset
226 def _checkunknown(repo, wctx, mctx):
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
227 "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
228
44fa047cef57 merge: report all files in _checkunknown
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 15774
diff changeset
229 error = False
16093
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16092
diff changeset
230 for f in mctx:
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16092
diff changeset
231 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
232 error = True
16093
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16092
diff changeset
233 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
234 if error:
44fa047cef57 merge: report all files in _checkunknown
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 15774
diff changeset
235 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
236 "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
237
6269
ffdf70e74623 merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents: 6268
diff changeset
238 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
239 """
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
240 Forget removed files
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
241
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
242 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
243 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
244 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
245 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
246 manifest.
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
247
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
248 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
249 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
250 as removed.
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
251 """
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
252
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
253 actions = []
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
254 state = branchmerge and 'r' or 'f'
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
255 for f in wctx.deleted():
6272
dd9bd227ae9a merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents: 6271
diff changeset
256 if f not in mctx:
18541
5ed6a375e9ca merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents: 18540
diff changeset
257 actions.append((f, state, None, "forget deleted"))
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
258
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
259 if not branchmerge:
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
260 for f in wctx.removed():
6272
dd9bd227ae9a merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents: 6271
diff changeset
261 if f not in mctx:
18541
5ed6a375e9ca merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents: 18540
diff changeset
262 actions.append((f, "f", None, "forget removed"))
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
263
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
264 return actions
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
265
20640
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
266 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
267 # build provisional merged manifest up
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
268 pmmf = set(wmf)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
269
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
270 def addop(f, args):
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
271 pmmf.add(f)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
272 def removeop(f, args):
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
273 pmmf.discard(f)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
274 def nop(f, args):
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
275 pass
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
276
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
277 def renameop(f, args):
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
278 f2, fd, flags = args
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
279 if f:
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
280 pmmf.discard(f)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
281 pmmf.add(fd)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
282 def mergeop(f, args):
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
283 f2, fd, move = args
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
284 if move:
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
285 pmmf.discard(f)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
286 pmmf.add(fd)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
287
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
288 opmap = {
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
289 "a": addop,
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
290 "d": renameop,
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
291 "dr": nop,
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
292 "e": nop,
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
293 "f": addop, # untracked file should be kept in working directory
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
294 "g": addop,
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
295 "m": mergeop,
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
296 "r": removeop,
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
297 "rd": nop,
20640
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
298 "cd": addop,
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
299 "dc": addop,
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
300 }
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
301 for f, m, args, msg in actions:
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
302 op = opmap.get(m)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
303 assert op, m
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
304 op(f, args)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
305
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
306 # 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
307 foldmap = {}
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
308 for f in sorted(pmmf):
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
309 fold = util.normcase(f)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
310 if fold in foldmap:
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
311 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
312 % (f, foldmap[fold]))
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
313 foldmap[fold] = f
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
314
18778
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
315 def manifestmerge(repo, wctx, p2, pa, branchmerge, force, partial,
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
316 acceptremote=False):
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
317 """
11817
d12fe809e1ee merge: fix typo in docstring
Alecs King <alecsk@gmail.com>
parents: 11759
diff changeset
318 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
319
18605
bcf29565d89f manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents: 18544
diff changeset
320 branchmerge and force are as passed in to update
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
321 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
322 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
323 """
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
324
18605
bcf29565d89f manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents: 18544
diff changeset
325 overwrite = force and not branchmerge
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
326 actions, copy, movewithdir = [], {}, {}
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
327
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
328 followcopies = False
8749
69caf50da4a0 merge: refactor some initialization, drop backwards var
Matt Mackall <mpm@selenic.com>
parents: 8748
diff changeset
329 if overwrite:
18611
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
330 pa = wctx
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
331 elif pa == p2: # backwards
18611
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
332 pa = wctx.p1()
18612
0b6e6eacc939 merge: don't call copies.mergecopies unless we need to
Bryan O'Sullivan <bryano@fb.com>
parents: 18611
diff changeset
333 elif not branchmerge and not wctx.dirty(missing=True):
0b6e6eacc939 merge: don't call copies.mergecopies unless we need to
Bryan O'Sullivan <bryano@fb.com>
parents: 18611
diff changeset
334 pass
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
335 elif pa and repo.ui.configbool("merge", "followcopies", True):
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
336 followcopies = True
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
337
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
338 # 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
339 [x.manifest() for x in
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
340 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
341
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
342 if followcopies:
18611
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
343 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
344 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
345 for of, fl in diverge.iteritems():
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
346 actions.append((of, "dr", (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
347 for of, fl in renamedelete.iteritems():
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
348 actions.append((of, "rd", (fl,), "rename and delete"))
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
349
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
350 repo.ui.note(_("resolving manifests\n"))
18605
bcf29565d89f manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents: 18544
diff changeset
351 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
352 % (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
353 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
354
18611
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
355 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
356 copied = set(copy.values())
18134
6c35b53cd28b copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents: 18042
diff changeset
357 copied.update(movewithdir.values())
3295
72d1e521da77 merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents: 3292
diff changeset
358
11470
34e33d50c26b subrepo: correctly handle update -C with modified subrepos (issue2022)
Matt Mackall <mpm@selenic.com>
parents: 11466
diff changeset
359 if '.hgsubstate' in m1:
9783
ee00ef6f9be7 submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
360 # 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
361 for s in sorted(wctx.substate):
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
362 if wctx.sub(s).dirty():
9783
ee00ef6f9be7 submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
363 m1['.hgsubstate'] += "+"
ee00ef6f9be7 submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
364 break
ee00ef6f9be7 submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
365
20640
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
366 aborts = []
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
367 # Compare manifests
18822
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
368 fdiff = dicthelpers.diff(m1, m2)
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
369 flagsdiff = m1.flagsdiff(m2)
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
370 diff12 = dicthelpers.join(fdiff, flagsdiff)
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
371
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
372 for f, (n12, fl12) in diff12.iteritems():
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
373 if n12:
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
374 n1, n2 = n12
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
375 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
376 n1 = n2 = m1.get(f, None)
ed676ed67a5c manifestmerge: handle workdir removed, remote removed with flags
Siddharth Agarwal <sid0@fb.com>
parents: 18876
diff changeset
377 if n1 is None:
ed676ed67a5c manifestmerge: handle workdir removed, remote removed with flags
Siddharth Agarwal <sid0@fb.com>
parents: 18876
diff changeset
378 # 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
379 # 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
380 # 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
381 # 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
382 continue
18822
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
383 if fl12:
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
384 fl1, fl2 = fl12
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
385 else: # flags didn't change, file contents did
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
386 fl1 = fl2 = m1.flags(f)
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
387
3248
751840e739a1 merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents: 3247
diff changeset
388 if partial and not partial(f):
751840e739a1 merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents: 3247
diff changeset
389 continue
18822
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
390 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
391 fa = f
0dc7a50345c2 merge: use the right ancestor when both sides copied the same file
Mads Kiilerich <madski@unity3d.com>
parents: 20640
diff changeset
392 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
393 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
394 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
395 # 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
396 # 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
397 fla = ma.flags(fa)
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
398 nol = 'l' not in fl1 + fl2 + fla
18822
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
399 if n2 == a and fl2 == fla:
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
400 pass # remote unchanged - keep local
18818
a0bff3d4f67b manifestmerge: rename n to n1 and n2
Siddharth Agarwal <sid0@fb.com>
parents: 18780
diff changeset
401 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
402 if n1 == n2: # optimization: keep local content
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
403 actions.append((f, "e", (fl2,), "update permissions"))
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
404 else:
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
405 actions.append((f, "g", (fl2,), "remote is newer"))
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
406 elif nol and n2 == a: # remote only changed 'x'
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
407 actions.append((f, "e", (fl2,), "update permissions"))
18818
a0bff3d4f67b manifestmerge: rename n to n1 and n2
Siddharth Agarwal <sid0@fb.com>
parents: 18780
diff changeset
408 elif nol and n1 == a: # local only changed 'x'
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
409 actions.append((f, "g", (fl1,), "remote is newer"))
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
410 else: # both changed something
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
411 actions.append((f, "m", (f, f, False), "versions differ"))
8752
f177bdab261b merge: simplify file revision comparison logic
Matt Mackall <mpm@selenic.com>
parents: 8751
diff changeset
412 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
413 pass
18822
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
414 elif n1 and f in movewithdir: # directory rename
18134
6c35b53cd28b copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents: 18042
diff changeset
415 f2 = movewithdir[f]
18823
b2a36e9b9ccc manifestmerge: drop redundant flags calls
Siddharth Agarwal <sid0@fb.com>
parents: 18822
diff changeset
416 actions.append((f, "d", (None, f2, fl1),
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
417 "remote renamed directory to " + f2))
18822
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
418 elif n1 and f in copy:
3249
f05c182430a0 merge: add rename following
Matt Mackall <mpm@selenic.com>
parents: 3248
diff changeset
419 f2 = copy[f]
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
420 actions.append((f, "m", (f2, f, False),
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
421 "local copied/moved to " + f2))
18822
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
422 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
423 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
424 if acceptremote:
1df033640a8e merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents: 20620
diff changeset
425 actions.append((f, "r", None, "remote delete"))
1df033640a8e merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents: 20620
diff changeset
426 else:
20640
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
427 actions.append((f, "cd", None, "prompt changed/deleted"))
18818
a0bff3d4f67b manifestmerge: rename n to n1 and n2
Siddharth Agarwal <sid0@fb.com>
parents: 18780
diff changeset
428 elif n1[20:] == "a": # added, no remote
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
429 actions.append((f, "f", None, "remote deleted"))
16094
0776a6cababe merge: don't use unknown()
Matt Mackall <mpm@selenic.com>
parents: 16093
diff changeset
430 else:
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
431 actions.append((f, "r", None, "other deleted"))
18822
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
432 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
433 f2 = movewithdir[f]
18823
b2a36e9b9ccc manifestmerge: drop redundant flags calls
Siddharth Agarwal <sid0@fb.com>
parents: 18822
diff changeset
434 actions.append((None, "d", (f, f2, fl2),
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
435 "local renamed directory to " + f2))
18822
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
436 elif n2 and f in copy:
3249
f05c182430a0 merge: add rename following
Matt Mackall <mpm@selenic.com>
parents: 3248
diff changeset
437 f2 = copy[f]
18339
aadefcee1f5e merge: remove "case" comments
Mads Kiilerich <mads@kiilerich.com>
parents: 18338
diff changeset
438 if f2 in m2:
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
439 actions.append((f2, "m", (f, f, False),
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
440 "remote copied to " + f))
18339
aadefcee1f5e merge: remove "case" comments
Mads Kiilerich <mads@kiilerich.com>
parents: 18338
diff changeset
441 else:
18544
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
442 actions.append((f2, "m", (f, f, True),
d0a8f09a22eb merge: inline act()
Mads Kiilerich <madski@unity3d.com>
parents: 18543
diff changeset
443 "remote moved to " + f))
18822
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
444 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
445 # 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
446 # following table:
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
447 #
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
448 # force branchmerge different | action
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
449 # n * n | get
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
450 # n * y | abort
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
451 # y n * | get
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
452 # y y n | get
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
453 # y y y | merge
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
454 #
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
455 # 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
456 # 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
457 if force and not branchmerge:
18823
b2a36e9b9ccc manifestmerge: drop redundant flags calls
Siddharth Agarwal <sid0@fb.com>
parents: 18822
diff changeset
458 actions.append((f, "g", (fl2,), "remote created"))
18339
aadefcee1f5e merge: remove "case" comments
Mads Kiilerich <mads@kiilerich.com>
parents: 18338
diff changeset
459 else:
18611
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
460 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
461 if force and branchmerge and different:
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
462 actions.append((f, "m", (f, f, False),
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
463 "remote differs from untracked local"))
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
464 elif not force and different:
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
465 aborts.append((f, "ud"))
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
466 else:
18823
b2a36e9b9ccc manifestmerge: drop redundant flags calls
Siddharth Agarwal <sid0@fb.com>
parents: 18822
diff changeset
467 actions.append((f, "g", (fl2,), "remote created"))
18822
381c0ef72a56 manifestmerge: use dicthelpers.diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18818
diff changeset
468 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
469 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
470 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
471 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
472 else:
e4d7cbc94219 merge: don't overwrite file untracked after remove, abort with 'untracked files'
Mads Kiilerich <madski@unity3d.com>
parents: 20280
diff changeset
473 # 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
474 if acceptremote:
1df033640a8e merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents: 20620
diff changeset
475 actions.append((f, "g", (m2.flags(f),),
1df033640a8e merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents: 20620
diff changeset
476 "remote recreating"))
1df033640a8e merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents: 20620
diff changeset
477 else:
20640
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
478 actions.append((f, "dc", (m2.flags(f),),
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
479 "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
480
18606
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
481 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
482 if m == "ud":
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
483 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
484 else: assert False, m
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
485 if aborts:
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
486 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
487 "from files in requested revision"))
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
488
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
489 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
490 # 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
491 if (not branchmerge and
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
492 (force or not wctx.dirty(missing=True, branch=False))):
20640
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
493 _checkcollision(repo, m2, [])
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
494 else:
20640
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
495 _checkcollision(repo, m1, actions)
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
496
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
497 return actions
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
498
8366
0bf0045000b5 some modernization cleanups, forward compatibility
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8312
diff changeset
499 def actionkey(a):
19987
ba6486076429 merge: move forgets to the beginning of the action list
Siddharth Agarwal <sid0@fb.com>
parents: 19951
diff changeset
500 return a[1] in "rf" and -1 or 0, a
6805
482581431dcd Sort removes first when applying updates (fixes issues 750 and 912)
Paul Moore <p.f.moore@gmail.com>
parents: 6762
diff changeset
501
18632
3e20079117c5 merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents: 18630
diff changeset
502 def getremove(repo, mctx, overwrite, args):
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
503 """apply usually-non-interactive updates to the working directory
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
504
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
505 mctx is the context to be merged into the working copy
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
506
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
507 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
508 """
18640
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
509 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
510 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
511 wjoin = repo.wjoin
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
512 fctx = mctx.filectx
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
513 wwrite = repo.wwrite
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
514 audit = repo.wopener.audit
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
515 i = 0
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
516 for arg in args:
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
517 f = arg[0]
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
518 if arg[1] == 'r':
18640
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
519 if verbose:
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
520 repo.ui.note(_("removing %s\n") % f)
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
521 audit(f)
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
522 try:
18640
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
523 unlink(wjoin(f), ignoremissing=True)
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
524 except OSError, inst:
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
525 repo.ui.warn(_("update failed to remove %s: %s!\n") %
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
526 (f, inst.strerror))
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
527 else:
18640
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
528 if verbose:
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
529 repo.ui.note(_("getting %s\n") % f)
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
530 wwrite(f, fctx(f).data(), arg[2][0])
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
531 if i == 100:
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
532 yield i, f
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
533 i = 0
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
534 i += 1
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
535 if i > 0:
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
536 yield i, f
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
537
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
538 def applyupdates(repo, actions, wctx, mctx, actx, overwrite):
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
539 """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
540
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
541 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
542 mctx is the context to be merged into the working copy
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
543 actx is the context of the common ancestor
13162
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
544
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
545 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
546 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
547 """
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
548
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
549 updated, merged, removed, unresolved = 0, 0, 0, 0
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
550 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
551 ms.reset(wctx.p1().node(), mctx.node())
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
552 moves = []
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
553 actions.sort(key=actionkey)
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
554
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
555 # prescan for merges
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
556 for a in actions:
18541
5ed6a375e9ca merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents: 18540
diff changeset
557 f, m, args, msg = a
5ed6a375e9ca merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents: 18540
diff changeset
558 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
18329
eb6ca96f4dd0 merge: consistently use "x" instead of 'x' for internal action types
Mads Kiilerich <mads@kiilerich.com>
parents: 18328
diff changeset
559 if m == "m": # merge
18540
139529b0a191 merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents: 18539
diff changeset
560 f2, fd, move = args
18332
6ba58ab719e5 merge: .hgsubstate is special as merge destination, not as merge source
Mads Kiilerich <mads@kiilerich.com>
parents: 18331
diff changeset
561 if fd == '.hgsubstate': # merged internally
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8753
diff changeset
562 continue
18541
5ed6a375e9ca merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents: 18540
diff changeset
563 repo.ui.debug(" preserving %s for resolve of %s\n" % (f, fd))
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
564 fcl = wctx[f]
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
565 fco = mctx[f2]
12008
fad5ed0ff997 merge: move reverse-merge logic out of filemerge (issue2342)
Matt Mackall <mpm@selenic.com>
parents: 11755
diff changeset
566 if mctx == actx: # backwards, use working dir parent as ancestor
12664
545ec1775021 merge: handle no file parent in backwards merge (issue2364)
Matt Mackall <mpm@selenic.com>
parents: 12401
diff changeset
567 if fcl.parents():
13878
a8d13ee0ce68 misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents: 13874
diff changeset
568 fca = fcl.p1()
12664
545ec1775021 merge: handle no file parent in backwards merge (issue2364)
Matt Mackall <mpm@selenic.com>
parents: 12401
diff changeset
569 else:
545ec1775021 merge: handle no file parent in backwards merge (issue2364)
Matt Mackall <mpm@selenic.com>
parents: 12401
diff changeset
570 fca = repo.filectx(f, fileid=nullrev)
12008
fad5ed0ff997 merge: move reverse-merge logic out of filemerge (issue2342)
Matt Mackall <mpm@selenic.com>
parents: 11755
diff changeset
571 else:
fad5ed0ff997 merge: move reverse-merge logic out of filemerge (issue2342)
Matt Mackall <mpm@selenic.com>
parents: 11755
diff changeset
572 fca = fcl.ancestor(fco, actx)
fad5ed0ff997 merge: move reverse-merge logic out of filemerge (issue2342)
Matt Mackall <mpm@selenic.com>
parents: 11755
diff changeset
573 if not fca:
fad5ed0ff997 merge: move reverse-merge logic out of filemerge (issue2342)
Matt Mackall <mpm@selenic.com>
parents: 11755
diff changeset
574 fca = repo.filectx(f, fileid=nullrev)
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
575 ms.add(fcl, fco, fca, fd)
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
576 if f != fd and move:
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
577 moves.append(f)
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
578
18328
2fee5119099b merge: consistently use repo.wopener.audit instead of creating a new auditor
Mads Kiilerich <mads@kiilerich.com>
parents: 18143
diff changeset
579 audit = repo.wopener.audit
14398
ae1f7a5373e8 applyupdates: audit unlinking of renamed files and directories
Adrian Buehlmann <adrian@cadifra.com>
parents: 14232
diff changeset
580
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
581 # remove renamed files after safely stored
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
582 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
583 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
584 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
585 audit(f)
18333
f6f23ecafc9b merge: use util.unlinkpath for removing moved files
Mads Kiilerich <mads@kiilerich.com>
parents: 18332
diff changeset
586 util.unlinkpath(repo.wjoin(f))
5042
f191bc3916f7 merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents: 4997
diff changeset
587
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
588 numupdates = len(actions)
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
589 workeractions = [a for a in actions if a[1] in 'gr']
19095
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
590 updateactions = [a for a in workeractions if a[1] == 'g']
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
591 updated = len(updateactions)
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
592 removeactions = [a for a in workeractions if a[1] == 'r']
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
593 removed = len(removeactions)
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
594 actions = [a for a in actions if a[1] not in 'gr']
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
595
18632
3e20079117c5 merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents: 18630
diff changeset
596 hgsub = [a[1] for a in workeractions if a[0] == '.hgsubstate']
3e20079117c5 merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents: 18630
diff changeset
597 if hgsub and hgsub[0] == 'r':
3e20079117c5 merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents: 18630
diff changeset
598 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
599
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
600 z = 0
18639
5774732bb5e5 merge: apply non-interactive working dir updates in parallel
Bryan O'Sullivan <bryano@fb.com>
parents: 18633
diff changeset
601 prog = worker.worker(repo.ui, 0.001, getremove, (repo, mctx, overwrite),
19095
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
602 removeactions)
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
603 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
604 z += i
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
605 repo.ui.progress(_('updating'), z, item=item, total=numupdates,
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
606 unit=_('files'))
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
607 prog = worker.worker(repo.ui, 0.001, getremove, (repo, mctx, overwrite),
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
608 updateactions)
18639
5774732bb5e5 merge: apply non-interactive working dir updates in parallel
Bryan O'Sullivan <bryano@fb.com>
parents: 18633
diff changeset
609 for i, item in prog:
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
610 z += i
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
611 repo.ui.progress(_('updating'), z, item=item, total=numupdates,
15041
3afe5edda4e3 merge: use repo.ui directly instead local variable
Martin Geisler <mg@aragost.com>
parents: 14980
diff changeset
612 unit=_('files'))
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
613
18632
3e20079117c5 merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents: 18630
diff changeset
614 if hgsub and hgsub[0] == 'g':
3e20079117c5 merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents: 18630
diff changeset
615 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
616
18640
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
617 _updating = _('updating')
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
618 _files = _('files')
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
619 progress = repo.ui.progress
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
620
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
621 for i, a in enumerate(actions):
18541
5ed6a375e9ca merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents: 18540
diff changeset
622 f, m, args, msg = a
18640
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
623 progress(_updating, z + i + 1, item=f, total=numupdates, unit=_files)
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
624 if m == "m": # merge
18780
0705ad73e878 applyupdates: assign variable before we try to use it (issue3855)
Kevin Bullock <kbullock@ringworld.org>
parents: 18778
diff changeset
625 f2, fd, move = args
18332
6ba58ab719e5 merge: .hgsubstate is special as merge destination, not as merge source
Mads Kiilerich <mads@kiilerich.com>
parents: 18331
diff changeset
626 if fd == '.hgsubstate': # subrepo states need updating
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16551
diff changeset
627 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx),
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16551
diff changeset
628 overwrite)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8753
diff changeset
629 continue
18328
2fee5119099b merge: consistently use repo.wopener.audit instead of creating a new auditor
Mads Kiilerich <mads@kiilerich.com>
parents: 18143
diff changeset
630 audit(fd)
20594
ba619c50a355 resolve: use "other" changeset from merge state (issue4163)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20593
diff changeset
631 r = ms.resolve(fd, wctx)
9030
3f56055ff1d7 compat: can't compare two values of unequal datatypes
Alejandro Santos <alejolp@alejolp.com>
parents: 8814
diff changeset
632 if r is not None and r > 0:
3249
f05c182430a0 merge: add rename following
Matt Mackall <mpm@selenic.com>
parents: 3248
diff changeset
633 unresolved += 1
3309
e8be5942335d merge: pull file copy/move out of filemerge
Matt Mackall <mpm@selenic.com>
parents: 3308
diff changeset
634 else:
3400
d2b55e3c4e25 merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents: 3372
diff changeset
635 if r is None:
d2b55e3c4e25 merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents: 3372
diff changeset
636 updated += 1
d2b55e3c4e25 merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents: 3372
diff changeset
637 else:
d2b55e3c4e25 merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents: 3372
diff changeset
638 merged += 1
3733
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
639 elif m == "d": # directory rename
18540
139529b0a191 merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents: 18539
diff changeset
640 f2, fd, flags = args
3733
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
641 if f:
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
642 repo.ui.note(_("moving %s to %s\n") % (f, fd))
20615
b96cb15ec9e0 merge: audit the right destination file when merging with dir rename
Mads Kiilerich <madski@unity3d.com>
parents: 20594
diff changeset
643 audit(fd)
18335
435909bf0257 merge: drop reference to file contents immediately after write
Mads Kiilerich <mads@kiilerich.com>
parents: 18334
diff changeset
644 repo.wwrite(fd, wctx.filectx(f).data(), flags)
13235
6bf39d88c857 rename util.unlink to unlinkpath
Adrian Buehlmann <adrian@cadifra.com>
parents: 13162
diff changeset
645 util.unlinkpath(repo.wjoin(f))
3733
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
646 if f2:
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
647 repo.ui.note(_("getting %s to %s\n") % (f2, fd))
18335
435909bf0257 merge: drop reference to file contents immediately after write
Mads Kiilerich <mads@kiilerich.com>
parents: 18334
diff changeset
648 repo.wwrite(fd, mctx.filectx(f2).data(), flags)
3733
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
649 updated += 1
4674
723e0ddb6ada merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents: 4635
diff changeset
650 elif m == "dr": # divergent renames
18540
139529b0a191 merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents: 18539
diff changeset
651 fl, = args
12757
62c8f7691bc3 merge: make 'diverging renames' diagnostic a more helpful note.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12746
diff changeset
652 repo.ui.warn(_("note: possible conflict - %s was renamed "
62c8f7691bc3 merge: make 'diverging renames' diagnostic a more helpful note.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12746
diff changeset
653 "multiple times to:\n") % f)
4674
723e0ddb6ada merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents: 4635
diff changeset
654 for nf in fl:
723e0ddb6ada merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents: 4635
diff changeset
655 repo.ui.warn(" %s\n" % nf)
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
656 elif m == "rd": # rename and delete
18540
139529b0a191 merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents: 18539
diff changeset
657 fl, = args
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
658 repo.ui.warn(_("note: possible conflict - %s was deleted "
98687cdddcb1 merge: warn about file deleted in one branch and renamed in other (issue3074)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 16719
diff changeset
659 "and renamed to:\n") % f)
98687cdddcb1 merge: warn about file deleted in one branch and renamed in other (issue3074)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 16719
diff changeset
660 for nf in fl:
98687cdddcb1 merge: warn about file deleted in one branch and renamed in other (issue3074)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 16719
diff changeset
661 repo.ui.warn(" %s\n" % nf)
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
662 elif m == "e": # exec
18540
139529b0a191 merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents: 18539
diff changeset
663 flags, = args
18328
2fee5119099b merge: consistently use repo.wopener.audit instead of creating a new auditor
Mads Kiilerich <mads@kiilerich.com>
parents: 18143
diff changeset
664 audit(f)
14232
df2399663392 rename util.set_flags to setflags
Adrian Buehlmann <adrian@cadifra.com>
parents: 14220
diff changeset
665 util.setflags(repo.wjoin(f), 'l' in flags, 'x' in flags)
18334
44bda93df90e merge: changing the mode of a file is also an update
Mads Kiilerich <mads@kiilerich.com>
parents: 18333
diff changeset
666 updated += 1
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
667 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
668 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
669
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
670 return updated, merged, removed, unresolved
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
671
18778
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
672 def calculateupdates(repo, tctx, mctx, ancestor, branchmerge, force, partial,
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
673 acceptremote=False):
18035
5881d5b7552f merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents: 17889
diff changeset
674 "Calculate the actions needed to merge mctx into tctx"
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
675 actions = []
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
676 actions += manifestmerge(repo, tctx, mctx,
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
677 ancestor,
18605
bcf29565d89f manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents: 18544
diff changeset
678 branchmerge, force,
18778
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
679 partial, acceptremote)
20640
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
680
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
681 # Filter out prompts.
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
682 newactions, prompts = [], []
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
683 for a in actions:
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
684 if a[1] in ("cd", "dc"):
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
685 prompts.append(a)
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
686 else:
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
687 newactions.append(a)
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
688 # Prompt and create actions. TODO: Move this towards resolve phase.
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
689 for f, m, args, msg in sorted(prompts):
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
690 if m == "cd":
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
691 if repo.ui.promptchoice(
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
692 _("local changed %s which remote deleted\n"
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
693 "use (c)hanged version or (d)elete?"
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
694 "$$ &Changed $$ &Delete") % f, 0):
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
695 newactions.append((f, "r", None, "prompt delete"))
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
696 else:
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
697 newactions.append((f, "a", None, "prompt keep"))
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
698 elif m == "dc":
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
699 flags, = args
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
700 if repo.ui.promptchoice(
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
701 _("remote changed %s which local deleted\n"
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
702 "use (c)hanged version or leave (d)eleted?"
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
703 "$$ &Changed $$ &Deleted") % f, 0) == 0:
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
704 newactions.append((f, "g", (flags,), "prompt recreating"))
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
705 else: assert False, m
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
706
18036
8b846dbc57b6 merge: support calculating merge actions against non-working contexts
David Schleimer <dschleimer@fb.com>
parents: 18035
diff changeset
707 if tctx.rev() is None:
20640
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
708 newactions += _forgetremoved(tctx, mctx, branchmerge)
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
709
52929dcdd512 merge: handle create+delete prompts in calculateupdates
Mads Kiilerich <madski@unity3d.com>
parents: 20639
diff changeset
710 return newactions
18035
5881d5b7552f merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents: 17889
diff changeset
711
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
712 def recordupdates(repo, actions, branchmerge):
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
713 "record merge actions to the dirstate"
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
714
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
715 for a in actions:
18541
5ed6a375e9ca merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents: 18540
diff changeset
716 f, m, args, msg = a
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
717 if m == "r": # remove
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
718 if branchmerge:
4904
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4884
diff changeset
719 repo.dirstate.remove(f)
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
720 else:
14434
cc8c09855d19 dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents: 14406
diff changeset
721 repo.dirstate.drop(f)
7768
5bf5fd1e2a74 merge: mark kept local files as readded on linear update (issue539)
Matt Mackall <mpm@selenic.com>
parents: 7631
diff changeset
722 elif m == "a": # re-add
5bf5fd1e2a74 merge: mark kept local files as readded on linear update (issue539)
Matt Mackall <mpm@selenic.com>
parents: 7631
diff changeset
723 if not branchmerge:
5bf5fd1e2a74 merge: mark kept local files as readded on linear update (issue539)
Matt Mackall <mpm@selenic.com>
parents: 7631
diff changeset
724 repo.dirstate.add(f)
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
725 elif m == "f": # forget
14434
cc8c09855d19 dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents: 14406
diff changeset
726 repo.dirstate.drop(f)
7569
89207edf3973 correctly update dirstate after update+mode change (issue1456)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7066
diff changeset
727 elif m == "e": # exec change
7630
a679bd371091 merge: fix execute bit update issue introduced by 89207edf3973
Patrick Mezard <pmezard@gmail.com>
parents: 7569
diff changeset
728 repo.dirstate.normallookup(f)
7569
89207edf3973 correctly update dirstate after update+mode change (issue1456)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7066
diff changeset
729 elif m == "g": # get
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
730 if branchmerge:
10968
7a0d096e221e dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10492
diff changeset
731 repo.dirstate.otherparent(f)
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
732 else:
4904
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4884
diff changeset
733 repo.dirstate.normal(f)
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
734 elif m == "m": # merge
18540
139529b0a191 merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents: 18539
diff changeset
735 f2, fd, move = args
3251
c93ce7f10f85 merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents: 3249
diff changeset
736 if branchmerge:
c93ce7f10f85 merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents: 3249
diff changeset
737 # We've done a branch merge, mark this file as merged
c93ce7f10f85 merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents: 3249
diff changeset
738 # so that we properly record the merger later
4904
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4884
diff changeset
739 repo.dirstate.merge(fd)
3372
ba7c74081861 merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents: 3371
diff changeset
740 if f != f2: # copy/rename
ba7c74081861 merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents: 3371
diff changeset
741 if move:
4904
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4884
diff changeset
742 repo.dirstate.remove(f)
3372
ba7c74081861 merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents: 3371
diff changeset
743 if f != fd:
ba7c74081861 merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents: 3371
diff changeset
744 repo.dirstate.copy(f, fd)
ba7c74081861 merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents: 3371
diff changeset
745 else:
ba7c74081861 merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents: 3371
diff changeset
746 repo.dirstate.copy(f2, fd)
3251
c93ce7f10f85 merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents: 3249
diff changeset
747 else:
c93ce7f10f85 merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents: 3249
diff changeset
748 # We've update-merged a locally modified file, so
c93ce7f10f85 merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents: 3249
diff changeset
749 # we set the dirstate to emulate a normal checkout
c93ce7f10f85 merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents: 3249
diff changeset
750 # of that file some time in the past. Thus our
c93ce7f10f85 merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents: 3249
diff changeset
751 # merge will appear as a normal local file
c93ce7f10f85 merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents: 3249
diff changeset
752 # modification.
11178
21a7ae13208f merge: avoid to break the dirstate copy status on moved files
Gilles Moris <gilles.moris@free.fr>
parents: 11101
diff changeset
753 if f2 == fd: # file not locally copied/moved
21a7ae13208f merge: avoid to break the dirstate copy status on moved files
Gilles Moris <gilles.moris@free.fr>
parents: 11101
diff changeset
754 repo.dirstate.normallookup(fd)
3308
ecc1bf27378c merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents: 3307
diff changeset
755 if move:
14434
cc8c09855d19 dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents: 14406
diff changeset
756 repo.dirstate.drop(f)
3733
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
757 elif m == "d": # directory rename
18540
139529b0a191 merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents: 18539
diff changeset
758 f2, fd, flag = args
4819
9797124581c9 merge: fix adding untracked files on directory rename (issue612)
Matt Mackall <mpm@selenic.com>
parents: 4748
diff changeset
759 if not f2 and f not in repo.dirstate:
9797124581c9 merge: fix adding untracked files on directory rename (issue612)
Matt Mackall <mpm@selenic.com>
parents: 4748
diff changeset
760 # untracked file moved
9797124581c9 merge: fix adding untracked files on directory rename (issue612)
Matt Mackall <mpm@selenic.com>
parents: 4748
diff changeset
761 continue
3733
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
762 if branchmerge:
4904
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4884
diff changeset
763 repo.dirstate.add(fd)
3733
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
764 if f:
4904
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4884
diff changeset
765 repo.dirstate.remove(f)
3733
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
766 repo.dirstate.copy(f, fd)
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
767 if f2:
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
768 repo.dirstate.copy(f2, fd)
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
769 else:
4904
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4884
diff changeset
770 repo.dirstate.normal(fd)
3733
9e67fecbfd16 merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents: 3732
diff changeset
771 if f:
14434
cc8c09855d19 dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents: 14406
diff changeset
772 repo.dirstate.drop(f)
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
773
16696
d1afbf03e69a rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents: 16683
diff changeset
774 def update(repo, node, branchmerge, force, partial, ancestor=None,
d1afbf03e69a rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents: 16683
diff changeset
775 mergeancestor=False):
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
776 """
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
777 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
778
9716
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
779 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
780 branchmerge = whether to merge between branches
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
781 force = whether to force branch merging or file overwriting
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
782 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
783 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
784 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
785 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
786 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
787 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
788
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
789 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
790 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
791 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
792 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
793 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
794
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 12032
diff changeset
795 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
796
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
797 -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
798 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
799 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
800 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
801 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
802 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
803 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
804 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
805 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
806
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
807 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
808 * = don't-care
19798
76df01e56e7f update: improve error message for clean non-linear update
Siddharth Agarwal <sid0@fb.com>
parents: 19482
diff changeset
809 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
810 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
811 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
812 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
813 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
814 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
815
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
816 Return the same tuple as applyupdates().
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
817 """
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
818
9717
68a1b9d0663e update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents: 9716
diff changeset
819 onode = node
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
820 wlock = repo.wlock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
821 try:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6746
diff changeset
822 wc = repo[None]
20279
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
823 pl = wc.parents()
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
824 p1 = pl[0]
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
825 pa = None
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
826 if ancestor:
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
827 pa = repo[ancestor]
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
828
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
829 if node is None:
20278
20ef533ffb01 merge: update comment for future devs
Sean Farley <sean.michael.farley@gmail.com>
parents: 19987
diff changeset
830 # 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
831 # 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
832 # 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
833 try:
16719
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16696
diff changeset
834 node = repo.branchtip(wc.branch())
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16696
diff changeset
835 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
836 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
837 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
838 else:
78a6b985882f update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents: 5489
diff changeset
839 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
840
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
841 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
842 # allow updating to successors
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
843 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
844
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
845 # 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
846 #
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
847 # 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
848 # 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
849 # (i.e. 'tip')
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
850 #
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
851 # 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
852 # is no conflict
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
853 #
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
854 # 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
855 # 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
856 # 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
857
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
858 if successors:
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
859 # 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
860 # 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
861 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
862
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
863 # 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
864 # 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
865 node = repo.revs("max(%ln)", successors)[0]
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
866 pa = p1
95b9c6149e17 merge: consider successor changesets for a bare update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20279
diff changeset
867
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
868 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
869
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
870 p2 = repo[node]
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
871 if pa is None:
13874
9d67277c9204 merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents: 13728
diff changeset
872 pa = p1.ancestor(p2)
9d67277c9204 merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents: 13728
diff changeset
873
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
874 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
3314
b16456909a0a merge: various tidying
Matt Mackall <mpm@selenic.com>
parents: 3312
diff changeset
875
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
876 ### check phase
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
877 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
878 raise util.Abort(_("outstanding uncommitted merges"))
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
879 if branchmerge:
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
880 if pa == p2:
11417
6f1d1ed3e19a merge: improve merge with ancestor message
Matt Mackall <mpm@selenic.com>
parents: 11178
diff changeset
881 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
882 " has no effect"))
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
883 elif pa == p1:
16696
d1afbf03e69a rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents: 16683
diff changeset
884 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
885 raise util.Abort(_("nothing to merge"),
6c8573dd1b6b merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents: 15538
diff changeset
886 hint=_("use 'hg update' "
6c8573dd1b6b merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents: 15538
diff changeset
887 "or check 'hg heads'"))
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
888 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
889 raise util.Abort(_("uncommitted changes"),
15619
6c8573dd1b6b merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents: 15538
diff changeset
890 hint=_("use 'hg status' to list changes"))
18364
6252b4f1c4b4 subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18360
diff changeset
891 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
892 if wc.sub(s).dirty():
19803
0f64af33fb63 merge: standardize error message for dirty subrepo
Siddharth Agarwal <sid0@fb.com>
parents: 19802
diff changeset
893 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
894 "subrepository '%s'") % s)
6169493ac3f9 Do not allow merging with uncommitted changes in a subrepo
Oleg Stepanov <oleg.stepanov@jetbrains.com>
parents: 13400
diff changeset
895
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
896 elif not overwrite:
19929
ab2362e1672e merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 19803
diff changeset
897 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
898 # 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
899 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
900 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
901 return 0, 0, 0, 0
ab2362e1672e merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 19803
diff changeset
902
19951
d51c4d85ec23 spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents: 19929
diff changeset
903 if pa 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
904 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
905 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
906 # 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
907 # 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
908 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
909 # 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
910 if repo[node].node() in foreground:
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
911 pa = 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
912 elif dirty:
ab3e42225dbc update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents: 19798
diff changeset
913 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
914 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
915 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
916 " discard changes")
4894e0d9462d update: improve error message for dirty non-linear update with rev
Siddharth Agarwal <sid0@fb.com>
parents: 19799
diff changeset
917 else:
4894e0d9462d update: improve error message for dirty non-linear update with rev
Siddharth Agarwal <sid0@fb.com>
parents: 19799
diff changeset
918 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
919 " changes")
19799
ab3e42225dbc update: add error message for dirty non-linear update with no rev
Siddharth Agarwal <sid0@fb.com>
parents: 19798
diff changeset
920 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
921 else: # node is none
19798
76df01e56e7f update: improve error message for clean non-linear update
Siddharth Agarwal <sid0@fb.com>
parents: 19482
diff changeset
922 msg = _("not a linear update")
76df01e56e7f update: improve error message for clean non-linear update
Siddharth Agarwal <sid0@fb.com>
parents: 19482
diff changeset
923 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
924 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
925 else:
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
926 # Allow jumping branches if clean and specific rev given
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
927 pa = p1
2814
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
928
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
929 ### calculate phase
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
930 actions = calculateupdates(repo, wc, p2, pa,
18778
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
931 branchmerge, force, partial, mergeancestor)
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
932
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
933 ### apply phase
13550
1792b8a9422b merge: back out single-parent fast-forward merge
Matt Mackall <mpm@selenic.com>
parents: 13536
diff changeset
934 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
935 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
936 if not partial:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
937 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
938 # 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
939 repo.vfs.write('updatestate', p2.hex())
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
940
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
941 stats = applyupdates(repo, actions, wc, p2, pa, overwrite)
2899
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
942
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
943 if not partial:
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16534
diff changeset
944 repo.setparents(fp1, fp2)
18330
b717f49833a2 merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents: 18329
diff changeset
945 recordupdates(repo, actions, branchmerge)
19482
499fc471296b update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents: 19285
diff changeset
946 # update completed, clear state
499fc471296b update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents: 19285
diff changeset
947 util.unlink(repo.join('updatestate'))
499fc471296b update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents: 19285
diff changeset
948
13561
0ab0ceefddf2 merge: remove last traces of fastforward merging
Mads Kiilerich <mads@kiilerich.com>
parents: 13550
diff changeset
949 if not branchmerge:
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
950 repo.dirstate.setbranch(p2.branch())
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
951 finally:
8109
496ae1ea4698 switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 7848
diff changeset
952 wlock.release()
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10431
diff changeset
953
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10431
diff changeset
954 if not partial:
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10431
diff changeset
955 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
956 return stats