##// END OF EJS Templates
merge: mark kept local files as readded on linear update (issue539)
Matt Mackall -
r7768:5bf5fd1e default
parent child Browse files
Show More
@@ -1,502 +1,506 b''
1 # merge.py - directory-level update/merge handling for Mercurial
1 # merge.py - directory-level update/merge handling for Mercurial
2 #
2 #
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms
5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference.
6 # of the GNU General Public License, incorporated herein by reference.
7
7
8 from node import nullid, nullrev, hex, bin
8 from node import nullid, nullrev, hex, bin
9 from i18n import _
9 from i18n import _
10 import errno, util, os, filemerge, copies, shutil
10 import errno, util, os, filemerge, copies, shutil
11
11
12 class mergestate(object):
12 class mergestate(object):
13 '''track 3-way merge state of individual files'''
13 '''track 3-way merge state of individual files'''
14 def __init__(self, repo):
14 def __init__(self, repo):
15 self._repo = repo
15 self._repo = repo
16 self._read()
16 self._read()
17 def reset(self, node):
17 def reset(self, node):
18 self._state = {}
18 self._state = {}
19 self._local = node
19 self._local = node
20 shutil.rmtree(self._repo.join("merge"), True)
20 shutil.rmtree(self._repo.join("merge"), True)
21 def _read(self):
21 def _read(self):
22 self._state = {}
22 self._state = {}
23 try:
23 try:
24 localnode = None
24 localnode = None
25 f = self._repo.opener("merge/state")
25 f = self._repo.opener("merge/state")
26 for i, l in enumerate(f):
26 for i, l in enumerate(f):
27 if i == 0:
27 if i == 0:
28 localnode = l[:-1]
28 localnode = l[:-1]
29 else:
29 else:
30 bits = l[:-1].split("\0")
30 bits = l[:-1].split("\0")
31 self._state[bits[0]] = bits[1:]
31 self._state[bits[0]] = bits[1:]
32 self._local = bin(localnode)
32 self._local = bin(localnode)
33 except IOError, err:
33 except IOError, err:
34 if err.errno != errno.ENOENT:
34 if err.errno != errno.ENOENT:
35 raise
35 raise
36 def _write(self):
36 def _write(self):
37 f = self._repo.opener("merge/state", "w")
37 f = self._repo.opener("merge/state", "w")
38 f.write(hex(self._local) + "\n")
38 f.write(hex(self._local) + "\n")
39 for d, v in self._state.iteritems():
39 for d, v in self._state.iteritems():
40 f.write("\0".join([d] + v) + "\n")
40 f.write("\0".join([d] + v) + "\n")
41 def add(self, fcl, fco, fca, fd, flags):
41 def add(self, fcl, fco, fca, fd, flags):
42 hash = util.sha1(fcl.path()).hexdigest()
42 hash = util.sha1(fcl.path()).hexdigest()
43 self._repo.opener("merge/" + hash, "w").write(fcl.data())
43 self._repo.opener("merge/" + hash, "w").write(fcl.data())
44 self._state[fd] = ['u', hash, fcl.path(), fca.path(),
44 self._state[fd] = ['u', hash, fcl.path(), fca.path(),
45 hex(fca.filenode()), fco.path(), flags]
45 hex(fca.filenode()), fco.path(), flags]
46 self._write()
46 self._write()
47 def __contains__(self, dfile):
47 def __contains__(self, dfile):
48 return dfile in self._state
48 return dfile in self._state
49 def __getitem__(self, dfile):
49 def __getitem__(self, dfile):
50 return self._state[dfile][0]
50 return self._state[dfile][0]
51 def __iter__(self):
51 def __iter__(self):
52 l = self._state.keys()
52 l = self._state.keys()
53 l.sort()
53 l.sort()
54 for f in l:
54 for f in l:
55 yield f
55 yield f
56 def mark(self, dfile, state):
56 def mark(self, dfile, state):
57 self._state[dfile][0] = state
57 self._state[dfile][0] = state
58 self._write()
58 self._write()
59 def resolve(self, dfile, wctx, octx):
59 def resolve(self, dfile, wctx, octx):
60 if self[dfile] == 'r':
60 if self[dfile] == 'r':
61 return 0
61 return 0
62 state, hash, lfile, afile, anode, ofile, flags = self._state[dfile]
62 state, hash, lfile, afile, anode, ofile, flags = self._state[dfile]
63 f = self._repo.opener("merge/" + hash)
63 f = self._repo.opener("merge/" + hash)
64 self._repo.wwrite(dfile, f.read(), flags)
64 self._repo.wwrite(dfile, f.read(), flags)
65 fcd = wctx[dfile]
65 fcd = wctx[dfile]
66 fco = octx[ofile]
66 fco = octx[ofile]
67 fca = self._repo.filectx(afile, fileid=anode)
67 fca = self._repo.filectx(afile, fileid=anode)
68 r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca)
68 r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca)
69 if not r:
69 if not r:
70 self.mark(dfile, 'r')
70 self.mark(dfile, 'r')
71 return r
71 return r
72
72
73 def _checkunknown(wctx, mctx):
73 def _checkunknown(wctx, mctx):
74 "check for collisions between unknown files and files in mctx"
74 "check for collisions between unknown files and files in mctx"
75 for f in wctx.unknown():
75 for f in wctx.unknown():
76 if f in mctx and mctx[f].cmp(wctx[f].data()):
76 if f in mctx and mctx[f].cmp(wctx[f].data()):
77 raise util.Abort(_("untracked file in working directory differs"
77 raise util.Abort(_("untracked file in working directory differs"
78 " from file in requested revision: '%s'") % f)
78 " from file in requested revision: '%s'") % f)
79
79
80 def _checkcollision(mctx):
80 def _checkcollision(mctx):
81 "check for case folding collisions in the destination context"
81 "check for case folding collisions in the destination context"
82 folded = {}
82 folded = {}
83 for fn in mctx:
83 for fn in mctx:
84 fold = fn.lower()
84 fold = fn.lower()
85 if fold in folded:
85 if fold in folded:
86 raise util.Abort(_("case-folding collision between %s and %s")
86 raise util.Abort(_("case-folding collision between %s and %s")
87 % (fn, folded[fold]))
87 % (fn, folded[fold]))
88 folded[fold] = fn
88 folded[fold] = fn
89
89
90 def _forgetremoved(wctx, mctx, branchmerge):
90 def _forgetremoved(wctx, mctx, branchmerge):
91 """
91 """
92 Forget removed files
92 Forget removed files
93
93
94 If we're jumping between revisions (as opposed to merging), and if
94 If we're jumping between revisions (as opposed to merging), and if
95 neither the working directory nor the target rev has the file,
95 neither the working directory nor the target rev has the file,
96 then we need to remove it from the dirstate, to prevent the
96 then we need to remove it from the dirstate, to prevent the
97 dirstate from listing the file when it is no longer in the
97 dirstate from listing the file when it is no longer in the
98 manifest.
98 manifest.
99
99
100 If we're merging, and the other revision has removed a file
100 If we're merging, and the other revision has removed a file
101 that is not present in the working directory, we need to mark it
101 that is not present in the working directory, we need to mark it
102 as removed.
102 as removed.
103 """
103 """
104
104
105 action = []
105 action = []
106 state = branchmerge and 'r' or 'f'
106 state = branchmerge and 'r' or 'f'
107 for f in wctx.deleted():
107 for f in wctx.deleted():
108 if f not in mctx:
108 if f not in mctx:
109 action.append((f, state))
109 action.append((f, state))
110
110
111 if not branchmerge:
111 if not branchmerge:
112 for f in wctx.removed():
112 for f in wctx.removed():
113 if f not in mctx:
113 if f not in mctx:
114 action.append((f, "f"))
114 action.append((f, "f"))
115
115
116 return action
116 return action
117
117
118 def manifestmerge(repo, p1, p2, pa, overwrite, partial):
118 def manifestmerge(repo, p1, p2, pa, overwrite, partial):
119 """
119 """
120 Merge p1 and p2 with ancestor ma and generate merge action list
120 Merge p1 and p2 with ancestor ma and generate merge action list
121
121
122 overwrite = whether we clobber working files
122 overwrite = whether we clobber working files
123 partial = function to filter file lists
123 partial = function to filter file lists
124 """
124 """
125
125
126 repo.ui.note(_("resolving manifests\n"))
126 repo.ui.note(_("resolving manifests\n"))
127 repo.ui.debug(_(" overwrite %s partial %s\n") % (overwrite, bool(partial)))
127 repo.ui.debug(_(" overwrite %s partial %s\n") % (overwrite, bool(partial)))
128 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (pa, p1, p2))
128 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (pa, p1, p2))
129
129
130 m1 = p1.manifest()
130 m1 = p1.manifest()
131 m2 = p2.manifest()
131 m2 = p2.manifest()
132 ma = pa.manifest()
132 ma = pa.manifest()
133 backwards = (pa == p2)
133 backwards = (pa == p2)
134 action = []
134 action = []
135 copy, copied, diverge = {}, {}, {}
135 copy, copied, diverge = {}, {}, {}
136
136
137 def fmerge(f, f2=None, fa=None):
137 def fmerge(f, f2=None, fa=None):
138 """merge flags"""
138 """merge flags"""
139 if not f2:
139 if not f2:
140 f2 = f
140 f2 = f
141 fa = f
141 fa = f
142 a, m, n = ma.flags(fa), m1.flags(f), m2.flags(f2)
142 a, m, n = ma.flags(fa), m1.flags(f), m2.flags(f2)
143 if m == n: # flags agree
143 if m == n: # flags agree
144 return m # unchanged
144 return m # unchanged
145 if m and n: # flags are set but don't agree
145 if m and n: # flags are set but don't agree
146 if not a: # both differ from parent
146 if not a: # both differ from parent
147 r = repo.ui.prompt(
147 r = repo.ui.prompt(
148 _(" conflicting flags for %s\n"
148 _(" conflicting flags for %s\n"
149 "(n)one, e(x)ec or sym(l)ink?") % f, "[nxl]", "n")
149 "(n)one, e(x)ec or sym(l)ink?") % f, "[nxl]", "n")
150 return r != "n" and r or ''
150 return r != "n" and r or ''
151 if m == a:
151 if m == a:
152 return n # changed from m to n
152 return n # changed from m to n
153 return m # changed from n to m
153 return m # changed from n to m
154 if m and m != a: # changed from a to m
154 if m and m != a: # changed from a to m
155 return m
155 return m
156 if n and n != a: # changed from a to n
156 if n and n != a: # changed from a to n
157 return n
157 return n
158 return '' # flag was cleared
158 return '' # flag was cleared
159
159
160 def act(msg, m, f, *args):
160 def act(msg, m, f, *args):
161 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
161 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
162 action.append((f, m) + args)
162 action.append((f, m) + args)
163
163
164 if pa and not (backwards or overwrite):
164 if pa and not (backwards or overwrite):
165 if repo.ui.configbool("merge", "followcopies", True):
165 if repo.ui.configbool("merge", "followcopies", True):
166 dirs = repo.ui.configbool("merge", "followdirs", True)
166 dirs = repo.ui.configbool("merge", "followdirs", True)
167 copy, diverge = copies.copies(repo, p1, p2, pa, dirs)
167 copy, diverge = copies.copies(repo, p1, p2, pa, dirs)
168 copied = dict.fromkeys(copy.values())
168 copied = dict.fromkeys(copy.values())
169 for of, fl in diverge.iteritems():
169 for of, fl in diverge.iteritems():
170 act("divergent renames", "dr", of, fl)
170 act("divergent renames", "dr", of, fl)
171
171
172 # Compare manifests
172 # Compare manifests
173 for f, n in m1.iteritems():
173 for f, n in m1.iteritems():
174 if partial and not partial(f):
174 if partial and not partial(f):
175 continue
175 continue
176 if f in m2:
176 if f in m2:
177 if overwrite or backwards:
177 if overwrite or backwards:
178 rflags = m2.flags(f)
178 rflags = m2.flags(f)
179 else:
179 else:
180 rflags = fmerge(f)
180 rflags = fmerge(f)
181 # are files different?
181 # are files different?
182 if n != m2[f]:
182 if n != m2[f]:
183 a = ma.get(f, nullid)
183 a = ma.get(f, nullid)
184 # are we clobbering?
184 # are we clobbering?
185 if overwrite:
185 if overwrite:
186 act("clobbering", "g", f, rflags)
186 act("clobbering", "g", f, rflags)
187 # or are we going back in time and clean?
187 # or are we going back in time and clean?
188 elif backwards:
188 elif backwards:
189 if not n[20:] or not p2[f].cmp(p1[f].data()):
189 if not n[20:] or not p2[f].cmp(p1[f].data()):
190 act("reverting", "g", f, rflags)
190 act("reverting", "g", f, rflags)
191 # are both different from the ancestor?
191 # are both different from the ancestor?
192 elif n != a and m2[f] != a:
192 elif n != a and m2[f] != a:
193 act("versions differ", "m", f, f, f, rflags, False)
193 act("versions differ", "m", f, f, f, rflags, False)
194 # is remote's version newer?
194 # is remote's version newer?
195 elif m2[f] != a:
195 elif m2[f] != a:
196 act("remote is newer", "g", f, rflags)
196 act("remote is newer", "g", f, rflags)
197 # local is newer, not overwrite, check mode bits
197 # local is newer, not overwrite, check mode bits
198 elif m1.flags(f) != rflags:
198 elif m1.flags(f) != rflags:
199 act("update permissions", "e", f, rflags)
199 act("update permissions", "e", f, rflags)
200 # contents same, check mode bits
200 # contents same, check mode bits
201 elif m1.flags(f) != rflags:
201 elif m1.flags(f) != rflags:
202 act("update permissions", "e", f, rflags)
202 act("update permissions", "e", f, rflags)
203 elif f in copied:
203 elif f in copied:
204 continue
204 continue
205 elif f in copy:
205 elif f in copy:
206 f2 = copy[f]
206 f2 = copy[f]
207 if f2 not in m2: # directory rename
207 if f2 not in m2: # directory rename
208 act("remote renamed directory to " + f2, "d",
208 act("remote renamed directory to " + f2, "d",
209 f, None, f2, m1.flags(f))
209 f, None, f2, m1.flags(f))
210 elif f2 in m1: # case 2 A,B/B/B
210 elif f2 in m1: # case 2 A,B/B/B
211 act("local copied to " + f2, "m",
211 act("local copied to " + f2, "m",
212 f, f2, f, fmerge(f, f2, f2), False)
212 f, f2, f, fmerge(f, f2, f2), False)
213 else: # case 4,21 A/B/B
213 else: # case 4,21 A/B/B
214 act("local moved to " + f2, "m",
214 act("local moved to " + f2, "m",
215 f, f2, f, fmerge(f, f2, f2), False)
215 f, f2, f, fmerge(f, f2, f2), False)
216 elif f in ma:
216 elif f in ma:
217 if n != ma[f] and not overwrite:
217 if n != ma[f] and not overwrite:
218 if repo.ui.prompt(
218 if repo.ui.prompt(
219 _(" local changed %s which remote deleted\n"
219 _(" local changed %s which remote deleted\n"
220 "use (c)hanged version or (d)elete?") % f,
220 "use (c)hanged version or (d)elete?") % f,
221 _("[cd]"), _("c")) == _("d"):
221 _("[cd]"), _("c")) == _("d"):
222 act("prompt delete", "r", f)
222 act("prompt delete", "r", f)
223 act("prompt keep", "a", f)
223 else:
224 else:
224 act("other deleted", "r", f)
225 act("other deleted", "r", f)
225 else:
226 else:
226 # file is created on branch or in working directory
227 # file is created on branch or in working directory
227 if (overwrite and n[20:] != "u") or (backwards and not n[20:]):
228 if (overwrite and n[20:] != "u") or (backwards and not n[20:]):
228 act("remote deleted", "r", f)
229 act("remote deleted", "r", f)
229
230
230 for f, n in m2.iteritems():
231 for f, n in m2.iteritems():
231 if partial and not partial(f):
232 if partial and not partial(f):
232 continue
233 continue
233 if f in m1:
234 if f in m1:
234 continue
235 continue
235 if f in copied:
236 if f in copied:
236 continue
237 continue
237 if f in copy:
238 if f in copy:
238 f2 = copy[f]
239 f2 = copy[f]
239 if f2 not in m1: # directory rename
240 if f2 not in m1: # directory rename
240 act("local renamed directory to " + f2, "d",
241 act("local renamed directory to " + f2, "d",
241 None, f, f2, m2.flags(f))
242 None, f, f2, m2.flags(f))
242 elif f2 in m2: # rename case 1, A/A,B/A
243 elif f2 in m2: # rename case 1, A/A,B/A
243 act("remote copied to " + f, "m",
244 act("remote copied to " + f, "m",
244 f2, f, f, fmerge(f2, f, f2), False)
245 f2, f, f, fmerge(f2, f, f2), False)
245 else: # case 3,20 A/B/A
246 else: # case 3,20 A/B/A
246 act("remote moved to " + f, "m",
247 act("remote moved to " + f, "m",
247 f2, f, f, fmerge(f2, f, f2), True)
248 f2, f, f, fmerge(f2, f, f2), True)
248 elif f in ma:
249 elif f in ma:
249 if overwrite or backwards:
250 if overwrite or backwards:
250 act("recreating", "g", f, m2.flags(f))
251 act("recreating", "g", f, m2.flags(f))
251 elif n != ma[f]:
252 elif n != ma[f]:
252 if repo.ui.prompt(
253 if repo.ui.prompt(
253 _("remote changed %s which local deleted\n"
254 _("remote changed %s which local deleted\n"
254 "use (c)hanged version or leave (d)eleted?") % f,
255 "use (c)hanged version or leave (d)eleted?") % f,
255 _("[cd]"), _("c")) == _("c"):
256 _("[cd]"), _("c")) == _("c"):
256 act("prompt recreating", "g", f, m2.flags(f))
257 act("prompt recreating", "g", f, m2.flags(f))
257 else:
258 else:
258 act("remote created", "g", f, m2.flags(f))
259 act("remote created", "g", f, m2.flags(f))
259
260
260 return action
261 return action
261
262
262 def actioncmp(a1, a2):
263 def actioncmp(a1, a2):
263 m1 = a1[1]
264 m1 = a1[1]
264 m2 = a2[1]
265 m2 = a2[1]
265 if m1 == m2:
266 if m1 == m2:
266 return cmp(a1, a2)
267 return cmp(a1, a2)
267 if m1 == 'r':
268 if m1 == 'r':
268 return -1
269 return -1
269 if m2 == 'r':
270 if m2 == 'r':
270 return 1
271 return 1
271 return cmp(a1, a2)
272 return cmp(a1, a2)
272
273
273 def applyupdates(repo, action, wctx, mctx):
274 def applyupdates(repo, action, wctx, mctx):
274 "apply the merge action list to the working directory"
275 "apply the merge action list to the working directory"
275
276
276 updated, merged, removed, unresolved = 0, 0, 0, 0
277 updated, merged, removed, unresolved = 0, 0, 0, 0
277 ms = mergestate(repo)
278 ms = mergestate(repo)
278 ms.reset(wctx.parents()[0].node())
279 ms.reset(wctx.parents()[0].node())
279 moves = []
280 moves = []
280 action.sort(actioncmp)
281 action.sort(actioncmp)
281
282
282 # prescan for merges
283 # prescan for merges
283 for a in action:
284 for a in action:
284 f, m = a[:2]
285 f, m = a[:2]
285 if m == 'm': # merge
286 if m == 'm': # merge
286 f2, fd, flags, move = a[2:]
287 f2, fd, flags, move = a[2:]
287 repo.ui.debug(_("preserving %s for resolve of %s\n") % (f, fd))
288 repo.ui.debug(_("preserving %s for resolve of %s\n") % (f, fd))
288 fcl = wctx[f]
289 fcl = wctx[f]
289 fco = mctx[f2]
290 fco = mctx[f2]
290 fca = fcl.ancestor(fco) or repo.filectx(f, fileid=nullrev)
291 fca = fcl.ancestor(fco) or repo.filectx(f, fileid=nullrev)
291 ms.add(fcl, fco, fca, fd, flags)
292 ms.add(fcl, fco, fca, fd, flags)
292 if f != fd and move:
293 if f != fd and move:
293 moves.append(f)
294 moves.append(f)
294
295
295 # remove renamed files after safely stored
296 # remove renamed files after safely stored
296 for f in moves:
297 for f in moves:
297 if util.lexists(repo.wjoin(f)):
298 if util.lexists(repo.wjoin(f)):
298 repo.ui.debug(_("removing %s\n") % f)
299 repo.ui.debug(_("removing %s\n") % f)
299 os.unlink(repo.wjoin(f))
300 os.unlink(repo.wjoin(f))
300
301
301 audit_path = util.path_auditor(repo.root)
302 audit_path = util.path_auditor(repo.root)
302
303
303 for a in action:
304 for a in action:
304 f, m = a[:2]
305 f, m = a[:2]
305 if f and f[0] == "/":
306 if f and f[0] == "/":
306 continue
307 continue
307 if m == "r": # remove
308 if m == "r": # remove
308 repo.ui.note(_("removing %s\n") % f)
309 repo.ui.note(_("removing %s\n") % f)
309 audit_path(f)
310 audit_path(f)
310 try:
311 try:
311 util.unlink(repo.wjoin(f))
312 util.unlink(repo.wjoin(f))
312 except OSError, inst:
313 except OSError, inst:
313 if inst.errno != errno.ENOENT:
314 if inst.errno != errno.ENOENT:
314 repo.ui.warn(_("update failed to remove %s: %s!\n") %
315 repo.ui.warn(_("update failed to remove %s: %s!\n") %
315 (f, inst.strerror))
316 (f, inst.strerror))
316 removed += 1
317 removed += 1
317 elif m == "m": # merge
318 elif m == "m": # merge
318 f2, fd, flags, move = a[2:]
319 f2, fd, flags, move = a[2:]
319 r = ms.resolve(fd, wctx, mctx)
320 r = ms.resolve(fd, wctx, mctx)
320 if r > 0:
321 if r > 0:
321 unresolved += 1
322 unresolved += 1
322 else:
323 else:
323 if r is None:
324 if r is None:
324 updated += 1
325 updated += 1
325 else:
326 else:
326 merged += 1
327 merged += 1
327 util.set_flags(repo.wjoin(fd), 'l' in flags, 'x' in flags)
328 util.set_flags(repo.wjoin(fd), 'l' in flags, 'x' in flags)
328 if f != fd and move and util.lexists(repo.wjoin(f)):
329 if f != fd and move and util.lexists(repo.wjoin(f)):
329 repo.ui.debug(_("removing %s\n") % f)
330 repo.ui.debug(_("removing %s\n") % f)
330 os.unlink(repo.wjoin(f))
331 os.unlink(repo.wjoin(f))
331 elif m == "g": # get
332 elif m == "g": # get
332 flags = a[2]
333 flags = a[2]
333 repo.ui.note(_("getting %s\n") % f)
334 repo.ui.note(_("getting %s\n") % f)
334 t = mctx.filectx(f).data()
335 t = mctx.filectx(f).data()
335 repo.wwrite(f, t, flags)
336 repo.wwrite(f, t, flags)
336 updated += 1
337 updated += 1
337 elif m == "d": # directory rename
338 elif m == "d": # directory rename
338 f2, fd, flags = a[2:]
339 f2, fd, flags = a[2:]
339 if f:
340 if f:
340 repo.ui.note(_("moving %s to %s\n") % (f, fd))
341 repo.ui.note(_("moving %s to %s\n") % (f, fd))
341 t = wctx.filectx(f).data()
342 t = wctx.filectx(f).data()
342 repo.wwrite(fd, t, flags)
343 repo.wwrite(fd, t, flags)
343 util.unlink(repo.wjoin(f))
344 util.unlink(repo.wjoin(f))
344 if f2:
345 if f2:
345 repo.ui.note(_("getting %s to %s\n") % (f2, fd))
346 repo.ui.note(_("getting %s to %s\n") % (f2, fd))
346 t = mctx.filectx(f2).data()
347 t = mctx.filectx(f2).data()
347 repo.wwrite(fd, t, flags)
348 repo.wwrite(fd, t, flags)
348 updated += 1
349 updated += 1
349 elif m == "dr": # divergent renames
350 elif m == "dr": # divergent renames
350 fl = a[2]
351 fl = a[2]
351 repo.ui.warn(_("warning: detected divergent renames of %s to:\n") % f)
352 repo.ui.warn(_("warning: detected divergent renames of %s to:\n") % f)
352 for nf in fl:
353 for nf in fl:
353 repo.ui.warn(" %s\n" % nf)
354 repo.ui.warn(" %s\n" % nf)
354 elif m == "e": # exec
355 elif m == "e": # exec
355 flags = a[2]
356 flags = a[2]
356 util.set_flags(repo.wjoin(f), 'l' in flags, 'x' in flags)
357 util.set_flags(repo.wjoin(f), 'l' in flags, 'x' in flags)
357
358
358 return updated, merged, removed, unresolved
359 return updated, merged, removed, unresolved
359
360
360 def recordupdates(repo, action, branchmerge):
361 def recordupdates(repo, action, branchmerge):
361 "record merge actions to the dirstate"
362 "record merge actions to the dirstate"
362
363
363 for a in action:
364 for a in action:
364 f, m = a[:2]
365 f, m = a[:2]
365 if m == "r": # remove
366 if m == "r": # remove
366 if branchmerge:
367 if branchmerge:
367 repo.dirstate.remove(f)
368 repo.dirstate.remove(f)
368 else:
369 else:
369 repo.dirstate.forget(f)
370 repo.dirstate.forget(f)
371 elif m == "a": # re-add
372 if not branchmerge:
373 repo.dirstate.add(f)
370 elif m == "f": # forget
374 elif m == "f": # forget
371 repo.dirstate.forget(f)
375 repo.dirstate.forget(f)
372 elif m == "e": # exec change
376 elif m == "e": # exec change
373 repo.dirstate.normallookup(f)
377 repo.dirstate.normallookup(f)
374 elif m == "g": # get
378 elif m == "g": # get
375 if branchmerge:
379 if branchmerge:
376 repo.dirstate.normaldirty(f)
380 repo.dirstate.normaldirty(f)
377 else:
381 else:
378 repo.dirstate.normal(f)
382 repo.dirstate.normal(f)
379 elif m == "m": # merge
383 elif m == "m": # merge
380 f2, fd, flag, move = a[2:]
384 f2, fd, flag, move = a[2:]
381 if branchmerge:
385 if branchmerge:
382 # We've done a branch merge, mark this file as merged
386 # We've done a branch merge, mark this file as merged
383 # so that we properly record the merger later
387 # so that we properly record the merger later
384 repo.dirstate.merge(fd)
388 repo.dirstate.merge(fd)
385 if f != f2: # copy/rename
389 if f != f2: # copy/rename
386 if move:
390 if move:
387 repo.dirstate.remove(f)
391 repo.dirstate.remove(f)
388 if f != fd:
392 if f != fd:
389 repo.dirstate.copy(f, fd)
393 repo.dirstate.copy(f, fd)
390 else:
394 else:
391 repo.dirstate.copy(f2, fd)
395 repo.dirstate.copy(f2, fd)
392 else:
396 else:
393 # We've update-merged a locally modified file, so
397 # We've update-merged a locally modified file, so
394 # we set the dirstate to emulate a normal checkout
398 # we set the dirstate to emulate a normal checkout
395 # of that file some time in the past. Thus our
399 # of that file some time in the past. Thus our
396 # merge will appear as a normal local file
400 # merge will appear as a normal local file
397 # modification.
401 # modification.
398 repo.dirstate.normallookup(fd)
402 repo.dirstate.normallookup(fd)
399 if move:
403 if move:
400 repo.dirstate.forget(f)
404 repo.dirstate.forget(f)
401 elif m == "d": # directory rename
405 elif m == "d": # directory rename
402 f2, fd, flag = a[2:]
406 f2, fd, flag = a[2:]
403 if not f2 and f not in repo.dirstate:
407 if not f2 and f not in repo.dirstate:
404 # untracked file moved
408 # untracked file moved
405 continue
409 continue
406 if branchmerge:
410 if branchmerge:
407 repo.dirstate.add(fd)
411 repo.dirstate.add(fd)
408 if f:
412 if f:
409 repo.dirstate.remove(f)
413 repo.dirstate.remove(f)
410 repo.dirstate.copy(f, fd)
414 repo.dirstate.copy(f, fd)
411 if f2:
415 if f2:
412 repo.dirstate.copy(f2, fd)
416 repo.dirstate.copy(f2, fd)
413 else:
417 else:
414 repo.dirstate.normal(fd)
418 repo.dirstate.normal(fd)
415 if f:
419 if f:
416 repo.dirstate.forget(f)
420 repo.dirstate.forget(f)
417
421
418 def update(repo, node, branchmerge, force, partial):
422 def update(repo, node, branchmerge, force, partial):
419 """
423 """
420 Perform a merge between the working directory and the given node
424 Perform a merge between the working directory and the given node
421
425
422 branchmerge = whether to merge between branches
426 branchmerge = whether to merge between branches
423 force = whether to force branch merging or file overwriting
427 force = whether to force branch merging or file overwriting
424 partial = a function to filter file lists (dirstate not updated)
428 partial = a function to filter file lists (dirstate not updated)
425 """
429 """
426
430
427 wlock = repo.wlock()
431 wlock = repo.wlock()
428 try:
432 try:
429 wc = repo[None]
433 wc = repo[None]
430 if node is None:
434 if node is None:
431 # tip of current branch
435 # tip of current branch
432 try:
436 try:
433 node = repo.branchtags()[wc.branch()]
437 node = repo.branchtags()[wc.branch()]
434 except KeyError:
438 except KeyError:
435 if wc.branch() == "default": # no default branch!
439 if wc.branch() == "default": # no default branch!
436 node = repo.lookup("tip") # update to tip
440 node = repo.lookup("tip") # update to tip
437 else:
441 else:
438 raise util.Abort(_("branch %s not found") % wc.branch())
442 raise util.Abort(_("branch %s not found") % wc.branch())
439 overwrite = force and not branchmerge
443 overwrite = force and not branchmerge
440 pl = wc.parents()
444 pl = wc.parents()
441 p1, p2 = pl[0], repo[node]
445 p1, p2 = pl[0], repo[node]
442 pa = p1.ancestor(p2)
446 pa = p1.ancestor(p2)
443 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
447 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
444 fastforward = False
448 fastforward = False
445
449
446 ### check phase
450 ### check phase
447 if not overwrite and len(pl) > 1:
451 if not overwrite and len(pl) > 1:
448 raise util.Abort(_("outstanding uncommitted merges"))
452 raise util.Abort(_("outstanding uncommitted merges"))
449 if branchmerge:
453 if branchmerge:
450 if pa == p2:
454 if pa == p2:
451 raise util.Abort(_("can't merge with ancestor"))
455 raise util.Abort(_("can't merge with ancestor"))
452 elif pa == p1:
456 elif pa == p1:
453 if p1.branch() != p2.branch():
457 if p1.branch() != p2.branch():
454 fastforward = True
458 fastforward = True
455 else:
459 else:
456 raise util.Abort(_("nothing to merge (use 'hg update'"
460 raise util.Abort(_("nothing to merge (use 'hg update'"
457 " or check 'hg heads')"))
461 " or check 'hg heads')"))
458 if not force and (wc.files() or wc.deleted()):
462 if not force and (wc.files() or wc.deleted()):
459 raise util.Abort(_("outstanding uncommitted changes"))
463 raise util.Abort(_("outstanding uncommitted changes"))
460 elif not overwrite:
464 elif not overwrite:
461 if pa == p1 or pa == p2: # linear
465 if pa == p1 or pa == p2: # linear
462 pass # all good
466 pass # all good
463 elif p1.branch() == p2.branch():
467 elif p1.branch() == p2.branch():
464 if wc.files() or wc.deleted():
468 if wc.files() or wc.deleted():
465 raise util.Abort(_("crosses branches (use 'hg merge' or "
469 raise util.Abort(_("crosses branches (use 'hg merge' or "
466 "'hg update -C' to discard changes)"))
470 "'hg update -C' to discard changes)"))
467 raise util.Abort(_("crosses branches (use 'hg merge' "
471 raise util.Abort(_("crosses branches (use 'hg merge' "
468 "or 'hg update -C')"))
472 "or 'hg update -C')"))
469 elif wc.files() or wc.deleted():
473 elif wc.files() or wc.deleted():
470 raise util.Abort(_("crosses named branches (use "
474 raise util.Abort(_("crosses named branches (use "
471 "'hg update -C' to discard changes)"))
475 "'hg update -C' to discard changes)"))
472 else:
476 else:
473 # Allow jumping branches if there are no changes
477 # Allow jumping branches if there are no changes
474 overwrite = True
478 overwrite = True
475
479
476 ### calculate phase
480 ### calculate phase
477 action = []
481 action = []
478 if not force:
482 if not force:
479 _checkunknown(wc, p2)
483 _checkunknown(wc, p2)
480 if not util.checkcase(repo.path):
484 if not util.checkcase(repo.path):
481 _checkcollision(p2)
485 _checkcollision(p2)
482 action += _forgetremoved(wc, p2, branchmerge)
486 action += _forgetremoved(wc, p2, branchmerge)
483 action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
487 action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
484
488
485 ### apply phase
489 ### apply phase
486 if not branchmerge: # just jump to the new rev
490 if not branchmerge: # just jump to the new rev
487 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
491 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
488 if not partial:
492 if not partial:
489 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
493 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
490
494
491 stats = applyupdates(repo, action, wc, p2)
495 stats = applyupdates(repo, action, wc, p2)
492
496
493 if not partial:
497 if not partial:
494 recordupdates(repo, action, branchmerge)
498 recordupdates(repo, action, branchmerge)
495 repo.dirstate.setparents(fp1, fp2)
499 repo.dirstate.setparents(fp1, fp2)
496 if not branchmerge and not fastforward:
500 if not branchmerge and not fastforward:
497 repo.dirstate.setbranch(p2.branch())
501 repo.dirstate.setbranch(p2.branch())
498 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
502 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
499
503
500 return stats
504 return stats
501 finally:
505 finally:
502 del wlock
506 del wlock
@@ -1,600 +1,601 b''
1 created new head
1 created new head
2 --------------
2 --------------
3 test L:up a R:nc a b W: - 1 get local a to b
3 test L:up a R:nc a b W: - 1 get local a to b
4 --------------
4 --------------
5 resolving manifests
5 resolving manifests
6 overwrite None partial False
6 overwrite None partial False
7 ancestor 924404dff337 local e300d1c794ec+ remote 735846fee2d7
7 ancestor 924404dff337 local e300d1c794ec+ remote 735846fee2d7
8 searching for copies back to rev 1
8 searching for copies back to rev 1
9 unmatched files in other:
9 unmatched files in other:
10 b
10 b
11 all copies found (* = to merge, ! = divergent):
11 all copies found (* = to merge, ! = divergent):
12 b -> a *
12 b -> a *
13 checking for directory renames
13 checking for directory renames
14 rev: versions differ -> m
14 rev: versions differ -> m
15 a: remote copied to b -> m
15 a: remote copied to b -> m
16 preserving a for resolve of b
16 preserving a for resolve of b
17 preserving rev for resolve of rev
17 preserving rev for resolve of rev
18 picked tool 'python ../merge' for b (binary False symlink False)
18 picked tool 'python ../merge' for b (binary False symlink False)
19 merging a and b to b
19 merging a and b to b
20 my b@e300d1c794ec+ other b@735846fee2d7 ancestor a@924404dff337
20 my b@e300d1c794ec+ other b@735846fee2d7 ancestor a@924404dff337
21 premerge successful
21 premerge successful
22 picked tool 'python ../merge' for rev (binary False symlink False)
22 picked tool 'python ../merge' for rev (binary False symlink False)
23 merging rev
23 merging rev
24 my rev@e300d1c794ec+ other rev@735846fee2d7 ancestor rev@924404dff337
24 my rev@e300d1c794ec+ other rev@735846fee2d7 ancestor rev@924404dff337
25 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
25 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
26 (branch merge, don't forget to commit)
26 (branch merge, don't forget to commit)
27 --------------
27 --------------
28 M b
28 M b
29 a
29 a
30 C a
30 C a
31 --------------
31 --------------
32
32
33 created new head
33 created new head
34 --------------
34 --------------
35 test L:nc a b R:up a W: - 2 get rem change to a and b
35 test L:nc a b R:up a W: - 2 get rem change to a and b
36 --------------
36 --------------
37 resolving manifests
37 resolving manifests
38 overwrite None partial False
38 overwrite None partial False
39 ancestor 924404dff337 local ac809aeed39a+ remote f4db7e329e71
39 ancestor 924404dff337 local ac809aeed39a+ remote f4db7e329e71
40 searching for copies back to rev 1
40 searching for copies back to rev 1
41 unmatched files in local:
41 unmatched files in local:
42 b
42 b
43 all copies found (* = to merge, ! = divergent):
43 all copies found (* = to merge, ! = divergent):
44 b -> a *
44 b -> a *
45 checking for directory renames
45 checking for directory renames
46 a: remote is newer -> g
46 a: remote is newer -> g
47 b: local copied to a -> m
47 b: local copied to a -> m
48 rev: versions differ -> m
48 rev: versions differ -> m
49 preserving b for resolve of b
49 preserving b for resolve of b
50 preserving rev for resolve of rev
50 preserving rev for resolve of rev
51 getting a
51 getting a
52 picked tool 'python ../merge' for b (binary False symlink False)
52 picked tool 'python ../merge' for b (binary False symlink False)
53 merging b and a to b
53 merging b and a to b
54 my b@ac809aeed39a+ other a@f4db7e329e71 ancestor a@924404dff337
54 my b@ac809aeed39a+ other a@f4db7e329e71 ancestor a@924404dff337
55 premerge successful
55 premerge successful
56 picked tool 'python ../merge' for rev (binary False symlink False)
56 picked tool 'python ../merge' for rev (binary False symlink False)
57 merging rev
57 merging rev
58 my rev@ac809aeed39a+ other rev@f4db7e329e71 ancestor rev@924404dff337
58 my rev@ac809aeed39a+ other rev@f4db7e329e71 ancestor rev@924404dff337
59 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
59 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
60 (branch merge, don't forget to commit)
60 (branch merge, don't forget to commit)
61 --------------
61 --------------
62 M a
62 M a
63 M b
63 M b
64 a
64 a
65 --------------
65 --------------
66
66
67 created new head
67 created new head
68 --------------
68 --------------
69 test L:up a R:nm a b W: - 3 get local a change to b, remove a
69 test L:up a R:nm a b W: - 3 get local a change to b, remove a
70 --------------
70 --------------
71 resolving manifests
71 resolving manifests
72 overwrite None partial False
72 overwrite None partial False
73 ancestor 924404dff337 local e300d1c794ec+ remote e03727d2d66b
73 ancestor 924404dff337 local e300d1c794ec+ remote e03727d2d66b
74 searching for copies back to rev 1
74 searching for copies back to rev 1
75 unmatched files in other:
75 unmatched files in other:
76 b
76 b
77 all copies found (* = to merge, ! = divergent):
77 all copies found (* = to merge, ! = divergent):
78 b -> a *
78 b -> a *
79 checking for directory renames
79 checking for directory renames
80 rev: versions differ -> m
80 rev: versions differ -> m
81 a: remote moved to b -> m
81 a: remote moved to b -> m
82 preserving a for resolve of b
82 preserving a for resolve of b
83 preserving rev for resolve of rev
83 preserving rev for resolve of rev
84 removing a
84 removing a
85 picked tool 'python ../merge' for b (binary False symlink False)
85 picked tool 'python ../merge' for b (binary False symlink False)
86 merging a and b to b
86 merging a and b to b
87 my b@e300d1c794ec+ other b@e03727d2d66b ancestor a@924404dff337
87 my b@e300d1c794ec+ other b@e03727d2d66b ancestor a@924404dff337
88 premerge successful
88 premerge successful
89 picked tool 'python ../merge' for rev (binary False symlink False)
89 picked tool 'python ../merge' for rev (binary False symlink False)
90 merging rev
90 merging rev
91 my rev@e300d1c794ec+ other rev@e03727d2d66b ancestor rev@924404dff337
91 my rev@e300d1c794ec+ other rev@e03727d2d66b ancestor rev@924404dff337
92 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
92 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
93 (branch merge, don't forget to commit)
93 (branch merge, don't forget to commit)
94 --------------
94 --------------
95 M b
95 M b
96 a
96 a
97 --------------
97 --------------
98
98
99 created new head
99 created new head
100 --------------
100 --------------
101 test L:nm a b R:up a W: - 4 get remote change to b
101 test L:nm a b R:up a W: - 4 get remote change to b
102 --------------
102 --------------
103 resolving manifests
103 resolving manifests
104 overwrite None partial False
104 overwrite None partial False
105 ancestor 924404dff337 local ecf3cb2a4219+ remote f4db7e329e71
105 ancestor 924404dff337 local ecf3cb2a4219+ remote f4db7e329e71
106 searching for copies back to rev 1
106 searching for copies back to rev 1
107 unmatched files in local:
107 unmatched files in local:
108 b
108 b
109 all copies found (* = to merge, ! = divergent):
109 all copies found (* = to merge, ! = divergent):
110 b -> a *
110 b -> a *
111 checking for directory renames
111 checking for directory renames
112 b: local moved to a -> m
112 b: local moved to a -> m
113 rev: versions differ -> m
113 rev: versions differ -> m
114 preserving b for resolve of b
114 preserving b for resolve of b
115 preserving rev for resolve of rev
115 preserving rev for resolve of rev
116 picked tool 'python ../merge' for b (binary False symlink False)
116 picked tool 'python ../merge' for b (binary False symlink False)
117 merging b and a to b
117 merging b and a to b
118 my b@ecf3cb2a4219+ other a@f4db7e329e71 ancestor a@924404dff337
118 my b@ecf3cb2a4219+ other a@f4db7e329e71 ancestor a@924404dff337
119 premerge successful
119 premerge successful
120 picked tool 'python ../merge' for rev (binary False symlink False)
120 picked tool 'python ../merge' for rev (binary False symlink False)
121 merging rev
121 merging rev
122 my rev@ecf3cb2a4219+ other rev@f4db7e329e71 ancestor rev@924404dff337
122 my rev@ecf3cb2a4219+ other rev@f4db7e329e71 ancestor rev@924404dff337
123 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
123 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
124 (branch merge, don't forget to commit)
124 (branch merge, don't forget to commit)
125 --------------
125 --------------
126 M b
126 M b
127 a
127 a
128 --------------
128 --------------
129
129
130 created new head
130 created new head
131 --------------
131 --------------
132 test L: R:nc a b W: - 5 get b
132 test L: R:nc a b W: - 5 get b
133 --------------
133 --------------
134 resolving manifests
134 resolving manifests
135 overwrite None partial False
135 overwrite None partial False
136 ancestor 924404dff337 local 94b33a1b7f2d+ remote 735846fee2d7
136 ancestor 924404dff337 local 94b33a1b7f2d+ remote 735846fee2d7
137 searching for copies back to rev 1
137 searching for copies back to rev 1
138 unmatched files in other:
138 unmatched files in other:
139 b
139 b
140 all copies found (* = to merge, ! = divergent):
140 all copies found (* = to merge, ! = divergent):
141 b -> a
141 b -> a
142 checking for directory renames
142 checking for directory renames
143 rev: versions differ -> m
143 rev: versions differ -> m
144 b: remote created -> g
144 b: remote created -> g
145 preserving rev for resolve of rev
145 preserving rev for resolve of rev
146 getting b
146 getting b
147 picked tool 'python ../merge' for rev (binary False symlink False)
147 picked tool 'python ../merge' for rev (binary False symlink False)
148 merging rev
148 merging rev
149 my rev@94b33a1b7f2d+ other rev@735846fee2d7 ancestor rev@924404dff337
149 my rev@94b33a1b7f2d+ other rev@735846fee2d7 ancestor rev@924404dff337
150 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
150 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
151 (branch merge, don't forget to commit)
151 (branch merge, don't forget to commit)
152 --------------
152 --------------
153 M b
153 M b
154 C a
154 C a
155 --------------
155 --------------
156
156
157 created new head
157 created new head
158 --------------
158 --------------
159 test L:nc a b R: W: - 6 nothing
159 test L:nc a b R: W: - 6 nothing
160 --------------
160 --------------
161 resolving manifests
161 resolving manifests
162 overwrite None partial False
162 overwrite None partial False
163 ancestor 924404dff337 local ac809aeed39a+ remote 97c705ade336
163 ancestor 924404dff337 local ac809aeed39a+ remote 97c705ade336
164 searching for copies back to rev 1
164 searching for copies back to rev 1
165 unmatched files in local:
165 unmatched files in local:
166 b
166 b
167 all copies found (* = to merge, ! = divergent):
167 all copies found (* = to merge, ! = divergent):
168 b -> a
168 b -> a
169 checking for directory renames
169 checking for directory renames
170 rev: versions differ -> m
170 rev: versions differ -> m
171 preserving rev for resolve of rev
171 preserving rev for resolve of rev
172 picked tool 'python ../merge' for rev (binary False symlink False)
172 picked tool 'python ../merge' for rev (binary False symlink False)
173 merging rev
173 merging rev
174 my rev@ac809aeed39a+ other rev@97c705ade336 ancestor rev@924404dff337
174 my rev@ac809aeed39a+ other rev@97c705ade336 ancestor rev@924404dff337
175 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
175 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
176 (branch merge, don't forget to commit)
176 (branch merge, don't forget to commit)
177 --------------
177 --------------
178 C a
178 C a
179 C b
179 C b
180 --------------
180 --------------
181
181
182 created new head
182 created new head
183 --------------
183 --------------
184 test L: R:nm a b W: - 7 get b
184 test L: R:nm a b W: - 7 get b
185 --------------
185 --------------
186 resolving manifests
186 resolving manifests
187 overwrite None partial False
187 overwrite None partial False
188 ancestor 924404dff337 local 94b33a1b7f2d+ remote e03727d2d66b
188 ancestor 924404dff337 local 94b33a1b7f2d+ remote e03727d2d66b
189 searching for copies back to rev 1
189 searching for copies back to rev 1
190 unmatched files in other:
190 unmatched files in other:
191 b
191 b
192 all copies found (* = to merge, ! = divergent):
192 all copies found (* = to merge, ! = divergent):
193 b -> a
193 b -> a
194 checking for directory renames
194 checking for directory renames
195 a: other deleted -> r
195 a: other deleted -> r
196 rev: versions differ -> m
196 rev: versions differ -> m
197 b: remote created -> g
197 b: remote created -> g
198 preserving rev for resolve of rev
198 preserving rev for resolve of rev
199 removing a
199 removing a
200 getting b
200 getting b
201 picked tool 'python ../merge' for rev (binary False symlink False)
201 picked tool 'python ../merge' for rev (binary False symlink False)
202 merging rev
202 merging rev
203 my rev@94b33a1b7f2d+ other rev@e03727d2d66b ancestor rev@924404dff337
203 my rev@94b33a1b7f2d+ other rev@e03727d2d66b ancestor rev@924404dff337
204 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
204 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
205 (branch merge, don't forget to commit)
205 (branch merge, don't forget to commit)
206 --------------
206 --------------
207 M b
207 M b
208 --------------
208 --------------
209
209
210 created new head
210 created new head
211 --------------
211 --------------
212 test L:nm a b R: W: - 8 nothing
212 test L:nm a b R: W: - 8 nothing
213 --------------
213 --------------
214 resolving manifests
214 resolving manifests
215 overwrite None partial False
215 overwrite None partial False
216 ancestor 924404dff337 local ecf3cb2a4219+ remote 97c705ade336
216 ancestor 924404dff337 local ecf3cb2a4219+ remote 97c705ade336
217 searching for copies back to rev 1
217 searching for copies back to rev 1
218 unmatched files in local:
218 unmatched files in local:
219 b
219 b
220 all copies found (* = to merge, ! = divergent):
220 all copies found (* = to merge, ! = divergent):
221 b -> a
221 b -> a
222 checking for directory renames
222 checking for directory renames
223 rev: versions differ -> m
223 rev: versions differ -> m
224 preserving rev for resolve of rev
224 preserving rev for resolve of rev
225 picked tool 'python ../merge' for rev (binary False symlink False)
225 picked tool 'python ../merge' for rev (binary False symlink False)
226 merging rev
226 merging rev
227 my rev@ecf3cb2a4219+ other rev@97c705ade336 ancestor rev@924404dff337
227 my rev@ecf3cb2a4219+ other rev@97c705ade336 ancestor rev@924404dff337
228 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
228 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
229 (branch merge, don't forget to commit)
229 (branch merge, don't forget to commit)
230 --------------
230 --------------
231 C b
231 C b
232 --------------
232 --------------
233
233
234 created new head
234 created new head
235 --------------
235 --------------
236 test L:um a b R:um a b W: - 9 do merge with ancestor in a
236 test L:um a b R:um a b W: - 9 do merge with ancestor in a
237 --------------
237 --------------
238 resolving manifests
238 resolving manifests
239 overwrite None partial False
239 overwrite None partial False
240 ancestor 924404dff337 local ec03c2ca8642+ remote 79cc6877a3b7
240 ancestor 924404dff337 local ec03c2ca8642+ remote 79cc6877a3b7
241 searching for copies back to rev 1
241 searching for copies back to rev 1
242 b: versions differ -> m
242 b: versions differ -> m
243 rev: versions differ -> m
243 rev: versions differ -> m
244 preserving b for resolve of b
244 preserving b for resolve of b
245 preserving rev for resolve of rev
245 preserving rev for resolve of rev
246 picked tool 'python ../merge' for b (binary False symlink False)
246 picked tool 'python ../merge' for b (binary False symlink False)
247 merging b
247 merging b
248 my b@ec03c2ca8642+ other b@79cc6877a3b7 ancestor a@924404dff337
248 my b@ec03c2ca8642+ other b@79cc6877a3b7 ancestor a@924404dff337
249 picked tool 'python ../merge' for rev (binary False symlink False)
249 picked tool 'python ../merge' for rev (binary False symlink False)
250 merging rev
250 merging rev
251 my rev@ec03c2ca8642+ other rev@79cc6877a3b7 ancestor rev@924404dff337
251 my rev@ec03c2ca8642+ other rev@79cc6877a3b7 ancestor rev@924404dff337
252 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
252 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
253 (branch merge, don't forget to commit)
253 (branch merge, don't forget to commit)
254 --------------
254 --------------
255 M b
255 M b
256 --------------
256 --------------
257
257
258 created new head
258 created new head
259 --------------
259 --------------
260 test L:nm a b R:nm a c W: - 11 get c, keep b
260 test L:nm a b R:nm a c W: - 11 get c, keep b
261 --------------
261 --------------
262 resolving manifests
262 resolving manifests
263 overwrite None partial False
263 overwrite None partial False
264 ancestor 924404dff337 local ecf3cb2a4219+ remote e6abcc1a30c2
264 ancestor 924404dff337 local ecf3cb2a4219+ remote e6abcc1a30c2
265 searching for copies back to rev 1
265 searching for copies back to rev 1
266 unmatched files in local:
266 unmatched files in local:
267 b
267 b
268 unmatched files in other:
268 unmatched files in other:
269 c
269 c
270 all copies found (* = to merge, ! = divergent):
270 all copies found (* = to merge, ! = divergent):
271 c -> a !
271 c -> a !
272 b -> a !
272 b -> a !
273 checking for directory renames
273 checking for directory renames
274 a: divergent renames -> dr
274 a: divergent renames -> dr
275 rev: versions differ -> m
275 rev: versions differ -> m
276 c: remote created -> g
276 c: remote created -> g
277 preserving rev for resolve of rev
277 preserving rev for resolve of rev
278 warning: detected divergent renames of a to:
278 warning: detected divergent renames of a to:
279 b
279 b
280 c
280 c
281 getting c
281 getting c
282 picked tool 'python ../merge' for rev (binary False symlink False)
282 picked tool 'python ../merge' for rev (binary False symlink False)
283 merging rev
283 merging rev
284 my rev@ecf3cb2a4219+ other rev@e6abcc1a30c2 ancestor rev@924404dff337
284 my rev@ecf3cb2a4219+ other rev@e6abcc1a30c2 ancestor rev@924404dff337
285 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
285 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
286 (branch merge, don't forget to commit)
286 (branch merge, don't forget to commit)
287 --------------
287 --------------
288 M c
288 M c
289 C b
289 C b
290 --------------
290 --------------
291
291
292 created new head
292 created new head
293 --------------
293 --------------
294 test L:nc a b R:up b W: - 12 merge b no ancestor
294 test L:nc a b R:up b W: - 12 merge b no ancestor
295 --------------
295 --------------
296 resolving manifests
296 resolving manifests
297 overwrite None partial False
297 overwrite None partial False
298 ancestor 924404dff337 local ac809aeed39a+ remote af30c7647fc7
298 ancestor 924404dff337 local ac809aeed39a+ remote af30c7647fc7
299 searching for copies back to rev 1
299 searching for copies back to rev 1
300 b: versions differ -> m
300 b: versions differ -> m
301 rev: versions differ -> m
301 rev: versions differ -> m
302 preserving b for resolve of b
302 preserving b for resolve of b
303 preserving rev for resolve of rev
303 preserving rev for resolve of rev
304 picked tool 'python ../merge' for b (binary False symlink False)
304 picked tool 'python ../merge' for b (binary False symlink False)
305 merging b
305 merging b
306 my b@ac809aeed39a+ other b@af30c7647fc7 ancestor b@000000000000
306 my b@ac809aeed39a+ other b@af30c7647fc7 ancestor b@000000000000
307 picked tool 'python ../merge' for rev (binary False symlink False)
307 picked tool 'python ../merge' for rev (binary False symlink False)
308 merging rev
308 merging rev
309 my rev@ac809aeed39a+ other rev@af30c7647fc7 ancestor rev@924404dff337
309 my rev@ac809aeed39a+ other rev@af30c7647fc7 ancestor rev@924404dff337
310 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
310 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
311 (branch merge, don't forget to commit)
311 (branch merge, don't forget to commit)
312 --------------
312 --------------
313 M b
313 M b
314 C a
314 C a
315 --------------
315 --------------
316
316
317 created new head
317 created new head
318 --------------
318 --------------
319 test L:up b R:nm a b W: - 13 merge b no ancestor
319 test L:up b R:nm a b W: - 13 merge b no ancestor
320 --------------
320 --------------
321 resolving manifests
321 resolving manifests
322 overwrite None partial False
322 overwrite None partial False
323 ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
323 ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
324 searching for copies back to rev 1
324 searching for copies back to rev 1
325 a: other deleted -> r
325 a: other deleted -> r
326 b: versions differ -> m
326 b: versions differ -> m
327 rev: versions differ -> m
327 rev: versions differ -> m
328 preserving b for resolve of b
328 preserving b for resolve of b
329 preserving rev for resolve of rev
329 preserving rev for resolve of rev
330 removing a
330 removing a
331 picked tool 'python ../merge' for b (binary False symlink False)
331 picked tool 'python ../merge' for b (binary False symlink False)
332 merging b
332 merging b
333 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
333 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
334 picked tool 'python ../merge' for rev (binary False symlink False)
334 picked tool 'python ../merge' for rev (binary False symlink False)
335 merging rev
335 merging rev
336 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
336 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
337 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
337 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
338 (branch merge, don't forget to commit)
338 (branch merge, don't forget to commit)
339 --------------
339 --------------
340 M b
340 M b
341 --------------
341 --------------
342
342
343 created new head
343 created new head
344 --------------
344 --------------
345 test L:nc a b R:up a b W: - 14 merge b no ancestor
345 test L:nc a b R:up a b W: - 14 merge b no ancestor
346 --------------
346 --------------
347 resolving manifests
347 resolving manifests
348 overwrite None partial False
348 overwrite None partial False
349 ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
349 ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
350 searching for copies back to rev 1
350 searching for copies back to rev 1
351 a: remote is newer -> g
351 a: remote is newer -> g
352 b: versions differ -> m
352 b: versions differ -> m
353 rev: versions differ -> m
353 rev: versions differ -> m
354 preserving b for resolve of b
354 preserving b for resolve of b
355 preserving rev for resolve of rev
355 preserving rev for resolve of rev
356 getting a
356 getting a
357 picked tool 'python ../merge' for b (binary False symlink False)
357 picked tool 'python ../merge' for b (binary False symlink False)
358 merging b
358 merging b
359 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
359 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
360 picked tool 'python ../merge' for rev (binary False symlink False)
360 picked tool 'python ../merge' for rev (binary False symlink False)
361 merging rev
361 merging rev
362 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
362 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
363 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
363 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
364 (branch merge, don't forget to commit)
364 (branch merge, don't forget to commit)
365 --------------
365 --------------
366 M a
366 M a
367 M b
367 M b
368 --------------
368 --------------
369
369
370 created new head
370 created new head
371 --------------
371 --------------
372 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
372 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
373 --------------
373 --------------
374 resolving manifests
374 resolving manifests
375 overwrite None partial False
375 overwrite None partial False
376 ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
376 ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
377 searching for copies back to rev 1
377 searching for copies back to rev 1
378 a: other deleted -> r
378 a: other deleted -> r
379 b: versions differ -> m
379 b: versions differ -> m
380 rev: versions differ -> m
380 rev: versions differ -> m
381 preserving b for resolve of b
381 preserving b for resolve of b
382 preserving rev for resolve of rev
382 preserving rev for resolve of rev
383 removing a
383 removing a
384 picked tool 'python ../merge' for b (binary False symlink False)
384 picked tool 'python ../merge' for b (binary False symlink False)
385 merging b
385 merging b
386 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
386 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
387 picked tool 'python ../merge' for rev (binary False symlink False)
387 picked tool 'python ../merge' for rev (binary False symlink False)
388 merging rev
388 merging rev
389 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
389 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
390 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
390 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
391 (branch merge, don't forget to commit)
391 (branch merge, don't forget to commit)
392 --------------
392 --------------
393 M b
393 M b
394 --------------
394 --------------
395
395
396 created new head
396 created new head
397 --------------
397 --------------
398 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
398 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
399 --------------
399 --------------
400 resolving manifests
400 resolving manifests
401 overwrite None partial False
401 overwrite None partial False
402 ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
402 ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
403 searching for copies back to rev 1
403 searching for copies back to rev 1
404 a: remote is newer -> g
404 a: remote is newer -> g
405 b: versions differ -> m
405 b: versions differ -> m
406 rev: versions differ -> m
406 rev: versions differ -> m
407 preserving b for resolve of b
407 preserving b for resolve of b
408 preserving rev for resolve of rev
408 preserving rev for resolve of rev
409 getting a
409 getting a
410 picked tool 'python ../merge' for b (binary False symlink False)
410 picked tool 'python ../merge' for b (binary False symlink False)
411 merging b
411 merging b
412 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
412 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
413 picked tool 'python ../merge' for rev (binary False symlink False)
413 picked tool 'python ../merge' for rev (binary False symlink False)
414 merging rev
414 merging rev
415 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
415 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
416 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
416 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
417 (branch merge, don't forget to commit)
417 (branch merge, don't forget to commit)
418 --------------
418 --------------
419 M a
419 M a
420 M b
420 M b
421 --------------
421 --------------
422
422
423 created new head
423 created new head
424 --------------
424 --------------
425 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
425 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
426 --------------
426 --------------
427 resolving manifests
427 resolving manifests
428 overwrite None partial False
428 overwrite None partial False
429 ancestor 924404dff337 local 0b76e65c8289+ remote 735846fee2d7
429 ancestor 924404dff337 local 0b76e65c8289+ remote 735846fee2d7
430 searching for copies back to rev 1
430 searching for copies back to rev 1
431 b: versions differ -> m
431 b: versions differ -> m
432 rev: versions differ -> m
432 rev: versions differ -> m
433 preserving b for resolve of b
433 preserving b for resolve of b
434 preserving rev for resolve of rev
434 preserving rev for resolve of rev
435 picked tool 'python ../merge' for b (binary False symlink False)
435 picked tool 'python ../merge' for b (binary False symlink False)
436 merging b
436 merging b
437 my b@0b76e65c8289+ other b@735846fee2d7 ancestor b@000000000000
437 my b@0b76e65c8289+ other b@735846fee2d7 ancestor b@000000000000
438 picked tool 'python ../merge' for rev (binary False symlink False)
438 picked tool 'python ../merge' for rev (binary False symlink False)
439 merging rev
439 merging rev
440 my rev@0b76e65c8289+ other rev@735846fee2d7 ancestor rev@924404dff337
440 my rev@0b76e65c8289+ other rev@735846fee2d7 ancestor rev@924404dff337
441 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
441 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
442 (branch merge, don't forget to commit)
442 (branch merge, don't forget to commit)
443 --------------
443 --------------
444 M b
444 M b
445 C a
445 C a
446 --------------
446 --------------
447
447
448 created new head
448 created new head
449 --------------
449 --------------
450 test L:nm a b R:up a b W: - 18 merge b no ancestor
450 test L:nm a b R:up a b W: - 18 merge b no ancestor
451 --------------
451 --------------
452 resolving manifests
452 resolving manifests
453 overwrite None partial False
453 overwrite None partial False
454 ancestor 924404dff337 local ecf3cb2a4219+ remote 8dbce441892a
454 ancestor 924404dff337 local ecf3cb2a4219+ remote 8dbce441892a
455 searching for copies back to rev 1
455 searching for copies back to rev 1
456 b: versions differ -> m
456 b: versions differ -> m
457 rev: versions differ -> m
457 rev: versions differ -> m
458 remote changed a which local deleted
458 remote changed a which local deleted
459 use (c)hanged version or leave (d)eleted? c
459 use (c)hanged version or leave (d)eleted? c
460 a: prompt recreating -> g
460 a: prompt recreating -> g
461 preserving b for resolve of b
461 preserving b for resolve of b
462 preserving rev for resolve of rev
462 preserving rev for resolve of rev
463 getting a
463 getting a
464 picked tool 'python ../merge' for b (binary False symlink False)
464 picked tool 'python ../merge' for b (binary False symlink False)
465 merging b
465 merging b
466 my b@ecf3cb2a4219+ other b@8dbce441892a ancestor b@000000000000
466 my b@ecf3cb2a4219+ other b@8dbce441892a ancestor b@000000000000
467 picked tool 'python ../merge' for rev (binary False symlink False)
467 picked tool 'python ../merge' for rev (binary False symlink False)
468 merging rev
468 merging rev
469 my rev@ecf3cb2a4219+ other rev@8dbce441892a ancestor rev@924404dff337
469 my rev@ecf3cb2a4219+ other rev@8dbce441892a ancestor rev@924404dff337
470 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
470 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
471 (branch merge, don't forget to commit)
471 (branch merge, don't forget to commit)
472 --------------
472 --------------
473 M a
473 M a
474 M b
474 M b
475 --------------
475 --------------
476
476
477 created new head
477 created new head
478 --------------
478 --------------
479 test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
479 test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
480 --------------
480 --------------
481 resolving manifests
481 resolving manifests
482 overwrite None partial False
482 overwrite None partial False
483 ancestor 924404dff337 local 0b76e65c8289+ remote e03727d2d66b
483 ancestor 924404dff337 local 0b76e65c8289+ remote e03727d2d66b
484 searching for copies back to rev 1
484 searching for copies back to rev 1
485 local changed a which remote deleted
485 local changed a which remote deleted
486 use (c)hanged version or (d)elete? c
486 use (c)hanged version or (d)elete? c
487 a: prompt keep -> a
487 b: versions differ -> m
488 b: versions differ -> m
488 rev: versions differ -> m
489 rev: versions differ -> m
489 preserving b for resolve of b
490 preserving b for resolve of b
490 preserving rev for resolve of rev
491 preserving rev for resolve of rev
491 picked tool 'python ../merge' for b (binary False symlink False)
492 picked tool 'python ../merge' for b (binary False symlink False)
492 merging b
493 merging b
493 my b@0b76e65c8289+ other b@e03727d2d66b ancestor b@000000000000
494 my b@0b76e65c8289+ other b@e03727d2d66b ancestor b@000000000000
494 picked tool 'python ../merge' for rev (binary False symlink False)
495 picked tool 'python ../merge' for rev (binary False symlink False)
495 merging rev
496 merging rev
496 my rev@0b76e65c8289+ other rev@e03727d2d66b ancestor rev@924404dff337
497 my rev@0b76e65c8289+ other rev@e03727d2d66b ancestor rev@924404dff337
497 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
498 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
498 (branch merge, don't forget to commit)
499 (branch merge, don't forget to commit)
499 --------------
500 --------------
500 M b
501 M b
501 C a
502 C a
502 --------------
503 --------------
503
504
504 created new head
505 created new head
505 --------------
506 --------------
506 test L:up a R:um a b W: - 20 merge a and b to b, remove a
507 test L:up a R:um a b W: - 20 merge a and b to b, remove a
507 --------------
508 --------------
508 resolving manifests
509 resolving manifests
509 overwrite None partial False
510 overwrite None partial False
510 ancestor 924404dff337 local e300d1c794ec+ remote 79cc6877a3b7
511 ancestor 924404dff337 local e300d1c794ec+ remote 79cc6877a3b7
511 searching for copies back to rev 1
512 searching for copies back to rev 1
512 unmatched files in other:
513 unmatched files in other:
513 b
514 b
514 all copies found (* = to merge, ! = divergent):
515 all copies found (* = to merge, ! = divergent):
515 b -> a *
516 b -> a *
516 checking for directory renames
517 checking for directory renames
517 rev: versions differ -> m
518 rev: versions differ -> m
518 a: remote moved to b -> m
519 a: remote moved to b -> m
519 preserving a for resolve of b
520 preserving a for resolve of b
520 preserving rev for resolve of rev
521 preserving rev for resolve of rev
521 removing a
522 removing a
522 picked tool 'python ../merge' for b (binary False symlink False)
523 picked tool 'python ../merge' for b (binary False symlink False)
523 merging a and b to b
524 merging a and b to b
524 my b@e300d1c794ec+ other b@79cc6877a3b7 ancestor a@924404dff337
525 my b@e300d1c794ec+ other b@79cc6877a3b7 ancestor a@924404dff337
525 picked tool 'python ../merge' for rev (binary False symlink False)
526 picked tool 'python ../merge' for rev (binary False symlink False)
526 merging rev
527 merging rev
527 my rev@e300d1c794ec+ other rev@79cc6877a3b7 ancestor rev@924404dff337
528 my rev@e300d1c794ec+ other rev@79cc6877a3b7 ancestor rev@924404dff337
528 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
529 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
529 (branch merge, don't forget to commit)
530 (branch merge, don't forget to commit)
530 --------------
531 --------------
531 M b
532 M b
532 a
533 a
533 --------------
534 --------------
534
535
535 created new head
536 created new head
536 --------------
537 --------------
537 test L:um a b R:up a W: - 21 merge a and b to b
538 test L:um a b R:up a W: - 21 merge a and b to b
538 --------------
539 --------------
539 resolving manifests
540 resolving manifests
540 overwrite None partial False
541 overwrite None partial False
541 ancestor 924404dff337 local ec03c2ca8642+ remote f4db7e329e71
542 ancestor 924404dff337 local ec03c2ca8642+ remote f4db7e329e71
542 searching for copies back to rev 1
543 searching for copies back to rev 1
543 unmatched files in local:
544 unmatched files in local:
544 b
545 b
545 all copies found (* = to merge, ! = divergent):
546 all copies found (* = to merge, ! = divergent):
546 b -> a *
547 b -> a *
547 checking for directory renames
548 checking for directory renames
548 b: local moved to a -> m
549 b: local moved to a -> m
549 rev: versions differ -> m
550 rev: versions differ -> m
550 preserving b for resolve of b
551 preserving b for resolve of b
551 preserving rev for resolve of rev
552 preserving rev for resolve of rev
552 picked tool 'python ../merge' for b (binary False symlink False)
553 picked tool 'python ../merge' for b (binary False symlink False)
553 merging b and a to b
554 merging b and a to b
554 my b@ec03c2ca8642+ other a@f4db7e329e71 ancestor a@924404dff337
555 my b@ec03c2ca8642+ other a@f4db7e329e71 ancestor a@924404dff337
555 picked tool 'python ../merge' for rev (binary False symlink False)
556 picked tool 'python ../merge' for rev (binary False symlink False)
556 merging rev
557 merging rev
557 my rev@ec03c2ca8642+ other rev@f4db7e329e71 ancestor rev@924404dff337
558 my rev@ec03c2ca8642+ other rev@f4db7e329e71 ancestor rev@924404dff337
558 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
559 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
559 (branch merge, don't forget to commit)
560 (branch merge, don't forget to commit)
560 --------------
561 --------------
561 M b
562 M b
562 a
563 a
563 --------------
564 --------------
564
565
565 created new head
566 created new head
566 --------------
567 --------------
567 test L:nm a b R:up a c W: - 23 get c, keep b
568 test L:nm a b R:up a c W: - 23 get c, keep b
568 --------------
569 --------------
569 resolving manifests
570 resolving manifests
570 overwrite None partial False
571 overwrite None partial False
571 ancestor 924404dff337 local ecf3cb2a4219+ remote 2b958612230f
572 ancestor 924404dff337 local ecf3cb2a4219+ remote 2b958612230f
572 searching for copies back to rev 1
573 searching for copies back to rev 1
573 unmatched files in local:
574 unmatched files in local:
574 b
575 b
575 unmatched files in other:
576 unmatched files in other:
576 c
577 c
577 all copies found (* = to merge, ! = divergent):
578 all copies found (* = to merge, ! = divergent):
578 b -> a *
579 b -> a *
579 checking for directory renames
580 checking for directory renames
580 b: local moved to a -> m
581 b: local moved to a -> m
581 rev: versions differ -> m
582 rev: versions differ -> m
582 c: remote created -> g
583 c: remote created -> g
583 preserving b for resolve of b
584 preserving b for resolve of b
584 preserving rev for resolve of rev
585 preserving rev for resolve of rev
585 picked tool 'python ../merge' for b (binary False symlink False)
586 picked tool 'python ../merge' for b (binary False symlink False)
586 merging b and a to b
587 merging b and a to b
587 my b@ecf3cb2a4219+ other a@2b958612230f ancestor a@924404dff337
588 my b@ecf3cb2a4219+ other a@2b958612230f ancestor a@924404dff337
588 premerge successful
589 premerge successful
589 getting c
590 getting c
590 picked tool 'python ../merge' for rev (binary False symlink False)
591 picked tool 'python ../merge' for rev (binary False symlink False)
591 merging rev
592 merging rev
592 my rev@ecf3cb2a4219+ other rev@2b958612230f ancestor rev@924404dff337
593 my rev@ecf3cb2a4219+ other rev@2b958612230f ancestor rev@924404dff337
593 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
594 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
594 (branch merge, don't forget to commit)
595 (branch merge, don't forget to commit)
595 --------------
596 --------------
596 M b
597 M b
597 a
598 a
598 M c
599 M c
599 --------------
600 --------------
600
601
General Comments 0
You need to be logged in to leave comments. Login now