##// END OF EJS Templates
merge with main
Thomas Arendsen Hein -
r3408:4e0c08f0 merge default
parent child Browse files
Show More
@@ -1,412 +1,416 b''
1 1 # merge.py - directory-level update/merge handling for Mercurial
2 2 #
3 3 # Copyright 2006 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms
6 6 # of the GNU General Public License, incorporated herein by reference.
7 7
8 8 from node import *
9 9 from i18n import gettext as _
10 10 from demandload import *
11 11 demandload(globals(), "errno util os tempfile")
12 12
13 13 def filemerge(repo, fw, fo, wctx, mctx):
14 14 """perform a 3-way merge in the working directory
15 15
16 16 fw = filename in the working directory
17 17 fo = filename in other parent
18 18 wctx, mctx = working and merge changecontexts
19 19 """
20 20
21 21 def temp(prefix, ctx):
22 22 pre = "%s~%s." % (os.path.basename(ctx.path()), prefix)
23 23 (fd, name) = tempfile.mkstemp(prefix=pre)
24 24 f = os.fdopen(fd, "wb")
25 25 repo.wwrite(ctx.path(), ctx.data(), f)
26 26 f.close()
27 27 return name
28 28
29 29 fcm = wctx.filectx(fw)
30 30 fco = mctx.filectx(fo)
31 31
32 32 if not fco.cmp(fcm.data()): # files identical?
33 return 0
33 return None
34 34
35 35 fca = fcm.ancestor(fco)
36 36 if not fca:
37 37 fca = repo.filectx(fw, fileid=-1)
38 38 a = repo.wjoin(fw)
39 39 b = temp("base", fca)
40 40 c = temp("other", fco)
41 41
42 42 if fw != fo:
43 43 repo.ui.status(_("merging %s and %s\n") % (fw, fo))
44 44 else:
45 45 repo.ui.status(_("merging %s\n") % fw)
46 46
47 47 repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca))
48 48
49 49 cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge")
50 50 or "hgmerge")
51 51 r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root,
52 52 environ={'HG_FILE': fw,
53 53 'HG_MY_NODE': str(wctx.parents()[0]),
54 54 'HG_OTHER_NODE': str(mctx)})
55 55 if r:
56 56 repo.ui.warn(_("merging %s failed!\n") % fw)
57 57
58 58 os.unlink(b)
59 59 os.unlink(c)
60 60 return r
61 61
62 62 def checkunknown(wctx, mctx):
63 63 "check for collisions between unknown files and files in mctx"
64 64 man = mctx.manifest()
65 65 for f in wctx.unknown():
66 66 if f in man:
67 67 if mctx.filectx(f).cmp(wctx.filectx(f).data()):
68 68 raise util.Abort(_("'%s' already exists in the working"
69 69 " dir and differs from remote") % f)
70 70
71 71 def forgetremoved(wctx, mctx):
72 72 """
73 73 Forget removed files
74 74
75 75 If we're jumping between revisions (as opposed to merging), and if
76 76 neither the working directory nor the target rev has the file,
77 77 then we need to remove it from the dirstate, to prevent the
78 78 dirstate from listing the file when it is no longer in the
79 79 manifest.
80 80 """
81 81
82 82 action = []
83 83 man = mctx.manifest()
84 84 for f in wctx.deleted() + wctx.removed():
85 85 if f not in man:
86 86 action.append((f, "f"))
87 87
88 88 return action
89 89
90 90 def nonoverlap(d1, d2, d3):
91 91 "Return list of elements in d1 not in d2 or d3"
92 92
93 93 l = []
94 94 for d in d1:
95 95 if d not in d3 and d not in d2:
96 96 l.append(d)
97 97
98 98 l.sort()
99 99 return l
100 100
101 101 def findold(fctx, limit):
102 102 "find files that path was copied from, back to linkrev limit"
103 103
104 104 old = {}
105 105 orig = fctx.path()
106 106 visit = [fctx]
107 107 while visit:
108 108 fc = visit.pop()
109 109 if fc.rev() < limit:
110 110 continue
111 111 if fc.path() != orig and fc.path() not in old:
112 112 old[fc.path()] = 1
113 113 visit += fc.parents()
114 114
115 115 old = old.keys()
116 116 old.sort()
117 117 return old
118 118
119 119 def findcopies(repo, m1, m2, ma, limit):
120 120 """
121 121 Find moves and copies between m1 and m2 back to limit linkrev
122 122 """
123 123
124 124 if not repo.ui.configbool("merge", "followcopies", True):
125 125 return {}
126 126
127 127 # avoid silly behavior for update from empty dir
128 128 if not m1:
129 129 return {}
130 130
131 131 dcopies = repo.dirstate.copies()
132 132 copy = {}
133 133 match = {}
134 134 u1 = nonoverlap(m1, m2, ma)
135 135 u2 = nonoverlap(m2, m1, ma)
136 136 ctx = util.cachefunc(lambda f,n: repo.filectx(f, fileid=n[:20]))
137 137
138 138 def checkpair(c, f2, man):
139 139 ''' check if an apparent pair actually matches '''
140 140 c2 = ctx(f2, man[f2])
141 141 ca = c.ancestor(c2)
142 142 if ca and ca.path() == c.path() or ca.path() == c2.path():
143 143 copy[c.path()] = f2
144 144 copy[f2] = c.path()
145 145
146 146 for f in u1:
147 147 c = ctx(dcopies.get(f, f), m1[f])
148 148 for of in findold(c, limit):
149 149 if of in m2:
150 150 checkpair(c, of, m2)
151 151 else:
152 152 match.setdefault(of, []).append(f)
153 153
154 154 for f in u2:
155 155 c = ctx(f, m2[f])
156 156 for of in findold(c, limit):
157 157 if of in m1:
158 158 checkpair(c, of, m1)
159 159 elif of in match:
160 160 for mf in match[of]:
161 161 checkpair(c, mf, m1)
162 162
163 163 return copy
164 164
165 165 def manifestmerge(repo, p1, p2, pa, overwrite, partial):
166 166 """
167 167 Merge p1 and p2 with ancestor ma and generate merge action list
168 168
169 169 overwrite = whether we clobber working files
170 170 partial = function to filter file lists
171 171 """
172 172
173 173 repo.ui.note(_("resolving manifests\n"))
174 174 repo.ui.debug(_(" overwrite %s partial %s\n") % (overwrite, bool(partial)))
175 175 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (pa, p1, p2))
176 176
177 177 m1 = p1.manifest()
178 178 m2 = p2.manifest()
179 179 ma = pa.manifest()
180 180 backwards = (pa == p2)
181 181 action = []
182 182 copy = {}
183 183
184 184 def fmerge(f, f2=None, fa=None):
185 185 """merge executable flags"""
186 186 if not f2:
187 187 f2 = f
188 188 fa = f
189 189 a, b, c = ma.execf(fa), m1.execf(f), m2.execf(f2)
190 190 return ((a^b) | (a^c)) ^ a
191 191
192 192 def act(msg, m, f, *args):
193 193 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
194 194 action.append((f, m) + args)
195 195
196 196 if not (backwards or overwrite):
197 197 copy = findcopies(repo, m1, m2, ma, pa.rev())
198 198
199 199 # Compare manifests
200 200 for f, n in m1.iteritems():
201 201 if partial and not partial(f):
202 202 continue
203 203 if f in m2:
204 204 # are files different?
205 205 if n != m2[f]:
206 206 a = ma.get(f, nullid)
207 207 # are both different from the ancestor?
208 208 if not overwrite and n != a and m2[f] != a:
209 209 act("versions differ", "m", f, f, f, fmerge(f), False)
210 210 # are we clobbering?
211 211 # is remote's version newer?
212 212 # or are we going back in time and clean?
213 213 elif overwrite or m2[f] != a or (backwards and not n[20:]):
214 214 act("remote is newer", "g", f, m2.execf(f))
215 215 # local is newer, not overwrite, check mode bits
216 216 elif fmerge(f) != m1.execf(f):
217 217 act("update permissions", "e", f, m2.execf(f))
218 218 # contents same, check mode bits
219 219 elif m1.execf(f) != m2.execf(f):
220 220 if overwrite or fmerge(f) != m1.execf(f):
221 221 act("update permissions", "e", f, m2.execf(f))
222 222 elif f in copy:
223 223 f2 = copy[f]
224 224 if f in ma: # case 3,20 A/B/A
225 225 act("remote moved", "m", f, f2, f2, fmerge(f, f2, f), True)
226 226 else:
227 227 if f2 in m1: # case 2 A,B/B/B
228 228 act("local copied", "m",
229 229 f, f2, f, fmerge(f, f2, f2), False)
230 230 else: # case 4,21 A/B/B
231 231 act("local moved", "m",
232 232 f, f2, f, fmerge(f, f2, f2), False)
233 233 elif f in ma:
234 234 if n != ma[f] and not overwrite:
235 235 if repo.ui.prompt(
236 236 (_(" local changed %s which remote deleted\n") % f) +
237 237 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("d"):
238 238 act("prompt delete", "r", f)
239 239 else:
240 240 act("other deleted", "r", f)
241 241 else:
242 242 # file is created on branch or in working directory
243 243 if (overwrite and n[20:] != "u") or (backwards and not n[20:]):
244 244 act("remote deleted", "r", f)
245 245
246 246 for f, n in m2.iteritems():
247 247 if partial and not partial(f):
248 248 continue
249 249 if f in m1:
250 250 continue
251 251 if f in copy:
252 252 f2 = copy[f]
253 253 if f2 not in m2: # already seen
254 254 continue
255 255 # rename case 1, A/A,B/A
256 256 act("remote copied", "m", f2, f, f, fmerge(f2, f, f2), False)
257 257 elif f in ma:
258 258 if overwrite or backwards:
259 259 act("recreating", "g", f, m2.execf(f))
260 260 elif n != ma[f]:
261 261 if repo.ui.prompt(
262 262 (_("remote changed %s which local deleted\n") % f) +
263 263 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("k"):
264 264 act("prompt recreating", "g", f, m2.execf(f))
265 265 else:
266 266 act("remote created", "g", f, m2.execf(f))
267 267
268 268 return action
269 269
270 270 def applyupdates(repo, action, wctx, mctx):
271 271 "apply the merge action list to the working directory"
272 272
273 273 updated, merged, removed, unresolved = 0, 0, 0, 0
274 274 action.sort()
275 275 for a in action:
276 276 f, m = a[:2]
277 277 if f[0] == "/":
278 278 continue
279 279 if m == "r": # remove
280 280 repo.ui.note(_("removing %s\n") % f)
281 281 util.audit_path(f)
282 282 try:
283 283 util.unlink(repo.wjoin(f))
284 284 except OSError, inst:
285 285 if inst.errno != errno.ENOENT:
286 286 repo.ui.warn(_("update failed to remove %s: %s!\n") %
287 287 (f, inst.strerror))
288 288 removed +=1
289 289 elif m == "m": # merge
290 290 f2, fd, flag, move = a[2:]
291 if filemerge(repo, f, f2, wctx, mctx):
291 r = filemerge(repo, f, f2, wctx, mctx)
292 if r > 0:
292 293 unresolved += 1
293 294 else:
294 merged += 1
295 if r is None:
296 updated += 1
297 else:
298 merged += 1
295 299 if f != fd:
296 300 repo.ui.debug(_("copying %s to %s\n") % (f, fd))
297 301 repo.wwrite(fd, repo.wread(f))
298 302 if move:
299 303 repo.ui.debug(_("removing %s\n") % f)
300 304 os.unlink(repo.wjoin(f))
301 305 util.set_exec(repo.wjoin(fd), flag)
302 306 elif m == "g": # get
303 307 flag = a[2]
304 308 repo.ui.note(_("getting %s\n") % f)
305 309 t = mctx.filectx(f).data()
306 310 repo.wwrite(f, t)
307 311 util.set_exec(repo.wjoin(f), flag)
308 312 updated += 1
309 313 elif m == "e": # exec
310 314 flag = a[2]
311 315 util.set_exec(repo.wjoin(f), flag)
312 316
313 317 return updated, merged, removed, unresolved
314 318
315 319 def recordupdates(repo, action, branchmerge):
316 320 "record merge actions to the dirstate"
317 321
318 322 for a in action:
319 323 f, m = a[:2]
320 324 if m == "r": # remove
321 325 if branchmerge:
322 326 repo.dirstate.update([f], 'r')
323 327 else:
324 328 repo.dirstate.forget([f])
325 329 elif m == "f": # forget
326 330 repo.dirstate.forget([f])
327 331 elif m == "g": # get
328 332 if branchmerge:
329 333 repo.dirstate.update([f], 'n', st_mtime=-1)
330 334 else:
331 335 repo.dirstate.update([f], 'n')
332 336 elif m == "m": # merge
333 337 f2, fd, flag, move = a[2:]
334 338 if branchmerge:
335 339 # We've done a branch merge, mark this file as merged
336 340 # so that we properly record the merger later
337 341 repo.dirstate.update([fd], 'm')
338 342 if f != f2: # copy/rename
339 343 if move:
340 344 repo.dirstate.update([f], 'r')
341 345 if f != fd:
342 346 repo.dirstate.copy(f, fd)
343 347 else:
344 348 repo.dirstate.copy(f2, fd)
345 349 else:
346 350 # We've update-merged a locally modified file, so
347 351 # we set the dirstate to emulate a normal checkout
348 352 # of that file some time in the past. Thus our
349 353 # merge will appear as a normal local file
350 354 # modification.
351 355 repo.dirstate.update([fd], 'n', st_size=-1, st_mtime=-1)
352 356 if move:
353 357 repo.dirstate.forget([f])
354 358
355 359 def update(repo, node, branchmerge, force, partial, wlock):
356 360 """
357 361 Perform a merge between the working directory and the given node
358 362
359 363 branchmerge = whether to merge between branches
360 364 force = whether to force branch merging or file overwriting
361 365 partial = a function to filter file lists (dirstate not updated)
362 366 wlock = working dir lock, if already held
363 367 """
364 368
365 369 if not wlock:
366 370 wlock = repo.wlock()
367 371
368 372 overwrite = force and not branchmerge
369 373 forcemerge = force and branchmerge
370 374 wc = repo.workingctx()
371 375 pl = wc.parents()
372 376 p1, p2 = pl[0], repo.changectx(node)
373 377 pa = p1.ancestor(p2)
374 378 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
375 379
376 380 ### check phase
377 381 if not overwrite and len(pl) > 1:
378 382 raise util.Abort(_("outstanding uncommitted merges"))
379 383 if pa == p1 or pa == p2: # is there a linear path from p1 to p2?
380 384 if branchmerge:
381 385 raise util.Abort(_("there is nothing to merge, just use "
382 386 "'hg update' or look at 'hg heads'"))
383 387 elif not (overwrite or branchmerge):
384 388 raise util.Abort(_("update spans branches, use 'hg merge' "
385 389 "or 'hg update -C' to lose changes"))
386 390 if branchmerge and not forcemerge:
387 391 if wc.modified() or wc.added() or wc.removed():
388 392 raise util.Abort(_("outstanding uncommitted changes"))
389 393
390 394 ### calculate phase
391 395 action = []
392 396 if not force:
393 397 checkunknown(wc, p2)
394 398 if not branchmerge:
395 399 action += forgetremoved(wc, p2)
396 400 action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
397 401
398 402 ### apply phase
399 403 if not branchmerge: # just jump to the new rev
400 404 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
401 405 if not partial:
402 406 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
403 407
404 408 stats = applyupdates(repo, action, wc, p2)
405 409
406 410 if not partial:
407 411 recordupdates(repo, action, branchmerge)
408 412 repo.dirstate.setparents(fp1, fp2)
409 413 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
410 414
411 415 return stats
412 416
@@ -1,23 +1,23 b''
1 1 1:016807e6fdaf
2 2 0:eb43f19ff115
3 3 016807e6fdaf tip
4 4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
5 5 eb43f19ff115
6 6 eb43f19ff115+
7 7 reverting file1
8 8 ? file1.orig
9 9 eb43f19ff115
10 10 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
11 11 ? file1.orig
12 12 016807e6fdaf tip
13 13 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
14 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
14 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
15 15 ? file1.orig
16 16 016807e6fdaf tip
17 17 ? file1.orig
18 18 016807e6fdaf tip
19 19 ? file1.orig
20 20 016807e6fdaf tip
21 21 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
22 22 ? file1.orig
23 23 016807e6fdaf tip
@@ -1,55 +1,55 b''
1 1 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
2 2 %% no merges expected
3 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 4 (branch merge, don't forget to commit)
5 5 diff -r d9e5953b9dec b
6 6 --- /dev/null
7 7 +++ b/b
8 8 @@ -0,0 +1,1 @@
9 9 +This is file b1
10 10 M b
11 11 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
12 12 %% merge should fail
13 13 abort: 'b' already exists in the working dir and differs from remote
14 14 %% merge of b expected
15 15 merging for b
16 16 merging b
17 17 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
18 18 (branch merge, don't forget to commit)
19 19 diff -r d9e5953b9dec b
20 20 --- /dev/null
21 21 +++ b/b
22 22 @@ -0,0 +1,1 @@
23 23 +This is file b2
24 24 M b
25 25 %%
26 26 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
27 27 Contents of b should be "this is file b1"
28 28 This is file b1
29 29 %% merge fails
30 30 abort: outstanding uncommitted changes
31 31 %% merge expected!
32 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
32 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
33 33 (branch merge, don't forget to commit)
34 34 diff -r c1dd73cbf59f b
35 35 --- a/b
36 36 +++ b/b
37 37 @@ -1,1 +1,1 @@ This is file b1
38 38 -This is file b1
39 39 +This is file b22
40 40 M b
41 41 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
42 42 %% merge of b should fail
43 43 abort: outstanding uncommitted changes
44 44 %% merge of b expected
45 45 merging for b
46 46 merging b
47 47 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
48 48 (branch merge, don't forget to commit)
49 49 diff -r c1dd73cbf59f b
50 50 --- a/b
51 51 +++ b/b
52 52 @@ -1,1 +1,1 @@ This is file b1
53 53 -This is file b1
54 54 +This is file b33
55 55 M b
@@ -1,414 +1,414 b''
1 1 --------------
2 2 test L:up a R:nc a b W: - 1 get local a to b
3 3 --------------
4 4 resolving manifests
5 5 overwrite None partial False
6 6 ancestor 924404dff337 local e300d1c794ec+ remote 735846fee2d7
7 7 rev: versions differ -> m
8 8 a: remote copied -> m
9 9 merging a and b
10 10 my a@e300d1c794ec+ other b@735846fee2d7 ancestor a@924404dff337
11 11 copying a to b
12 12 merging rev
13 13 my rev@e300d1c794ec+ other rev@735846fee2d7 ancestor rev@924404dff337
14 14 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
15 15 (branch merge, don't forget to commit)
16 16 --------------
17 17 M a
18 18 M b
19 19 a
20 20 --------------
21 21
22 22 --------------
23 23 test L:nc a b R:up a W: - 2 get rem change to a and b
24 24 --------------
25 25 resolving manifests
26 26 overwrite None partial False
27 27 ancestor 924404dff337 local ac809aeed39a+ remote f4db7e329e71
28 28 a: remote is newer -> g
29 29 b: local copied -> m
30 30 rev: versions differ -> m
31 31 getting a
32 32 merging b and a
33 33 my b@ac809aeed39a+ other a@f4db7e329e71 ancestor a@924404dff337
34 34 merging rev
35 35 my rev@ac809aeed39a+ other rev@f4db7e329e71 ancestor rev@924404dff337
36 36 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
37 37 (branch merge, don't forget to commit)
38 38 --------------
39 39 M a
40 40 M b
41 41 a
42 42 --------------
43 43
44 44 --------------
45 45 test L:up a R:nm a b W: - 3 get local a change to b, remove a
46 46 --------------
47 47 resolving manifests
48 48 overwrite None partial False
49 49 ancestor 924404dff337 local e300d1c794ec+ remote e03727d2d66b
50 50 a: remote moved -> m
51 51 rev: versions differ -> m
52 52 merging a and b
53 53 my a@e300d1c794ec+ other b@e03727d2d66b ancestor a@924404dff337
54 54 copying a to b
55 55 removing a
56 56 merging rev
57 57 my rev@e300d1c794ec+ other rev@e03727d2d66b ancestor rev@924404dff337
58 58 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
59 59 (branch merge, don't forget to commit)
60 60 --------------
61 61 M b
62 62 a
63 63 --------------
64 64
65 65 --------------
66 66 test L:nm a b R:up a W: - 4 get remote change to b
67 67 --------------
68 68 resolving manifests
69 69 overwrite None partial False
70 70 ancestor 924404dff337 local ecf3cb2a4219+ remote f4db7e329e71
71 71 b: local moved -> m
72 72 rev: versions differ -> m
73 73 merging b and a
74 74 my b@ecf3cb2a4219+ other a@f4db7e329e71 ancestor a@924404dff337
75 75 merging rev
76 76 my rev@ecf3cb2a4219+ other rev@f4db7e329e71 ancestor rev@924404dff337
77 77 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
78 78 (branch merge, don't forget to commit)
79 79 --------------
80 80 M b
81 81 a
82 82 --------------
83 83
84 84 --------------
85 85 test L: R:nc a b W: - 5 get b
86 86 --------------
87 87 resolving manifests
88 88 overwrite None partial False
89 89 ancestor 924404dff337 local 94b33a1b7f2d+ remote 735846fee2d7
90 90 rev: versions differ -> m
91 91 a: remote copied -> m
92 92 copying a to b
93 93 merging rev
94 94 my rev@94b33a1b7f2d+ other rev@735846fee2d7 ancestor rev@924404dff337
95 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
95 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
96 96 (branch merge, don't forget to commit)
97 97 --------------
98 98 M b
99 99 a
100 100 C a
101 101 --------------
102 102
103 103 --------------
104 104 test L:nc a b R: W: - 6 nothing
105 105 --------------
106 106 resolving manifests
107 107 overwrite None partial False
108 108 ancestor 924404dff337 local ac809aeed39a+ remote 97c705ade336
109 109 b: local copied -> m
110 110 rev: versions differ -> m
111 111 merging rev
112 112 my rev@ac809aeed39a+ other rev@97c705ade336 ancestor rev@924404dff337
113 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
113 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
114 114 (branch merge, don't forget to commit)
115 115 --------------
116 116 M b
117 117 a
118 118 C a
119 119 --------------
120 120
121 121 --------------
122 122 test L: R:nm a b W: - 7 get b
123 123 --------------
124 124 resolving manifests
125 125 overwrite None partial False
126 126 ancestor 924404dff337 local 94b33a1b7f2d+ remote e03727d2d66b
127 127 a: remote moved -> m
128 128 rev: versions differ -> m
129 129 copying a to b
130 130 removing a
131 131 merging rev
132 132 my rev@94b33a1b7f2d+ other rev@e03727d2d66b ancestor rev@924404dff337
133 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
133 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
134 134 (branch merge, don't forget to commit)
135 135 --------------
136 136 M b
137 137 a
138 138 --------------
139 139
140 140 --------------
141 141 test L:nm a b R: W: - 8 nothing
142 142 --------------
143 143 resolving manifests
144 144 overwrite None partial False
145 145 ancestor 924404dff337 local ecf3cb2a4219+ remote 97c705ade336
146 146 b: local moved -> m
147 147 rev: versions differ -> m
148 148 merging rev
149 149 my rev@ecf3cb2a4219+ other rev@97c705ade336 ancestor rev@924404dff337
150 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
150 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
151 151 (branch merge, don't forget to commit)
152 152 --------------
153 153 M b
154 154 a
155 155 --------------
156 156
157 157 --------------
158 158 test L:um a b R:um a b W: - 9 do merge with ancestor in a
159 159 --------------
160 160 resolving manifests
161 161 overwrite None partial False
162 162 ancestor 924404dff337 local ec03c2ca8642+ remote 79cc6877a3b7
163 163 b: versions differ -> m
164 164 rev: versions differ -> m
165 165 merging b
166 166 my b@ec03c2ca8642+ other b@79cc6877a3b7 ancestor a@924404dff337
167 167 merging rev
168 168 my rev@ec03c2ca8642+ other rev@79cc6877a3b7 ancestor rev@924404dff337
169 169 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
170 170 (branch merge, don't forget to commit)
171 171 --------------
172 172 M b
173 173 --------------
174 174
175 175 --------------
176 176 test L:nm a b R:nm a c W: - 11 get c, keep b
177 177 --------------
178 178 resolving manifests
179 179 overwrite None partial False
180 180 ancestor 924404dff337 local ecf3cb2a4219+ remote e6abcc1a30c2
181 181 rev: versions differ -> m
182 182 c: remote created -> g
183 183 getting c
184 184 merging rev
185 185 my rev@ecf3cb2a4219+ other rev@e6abcc1a30c2 ancestor rev@924404dff337
186 186 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
187 187 (branch merge, don't forget to commit)
188 188 --------------
189 189 M c
190 190 C b
191 191 --------------
192 192
193 193 --------------
194 194 test L:nc a b R:up b W: - 12 merge b no ancestor
195 195 --------------
196 196 resolving manifests
197 197 overwrite None partial False
198 198 ancestor 924404dff337 local ac809aeed39a+ remote af30c7647fc7
199 199 b: versions differ -> m
200 200 rev: versions differ -> m
201 201 merging b
202 202 my b@ac809aeed39a+ other b@af30c7647fc7 ancestor b@000000000000
203 203 merging rev
204 204 my rev@ac809aeed39a+ other rev@af30c7647fc7 ancestor rev@924404dff337
205 205 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
206 206 (branch merge, don't forget to commit)
207 207 --------------
208 208 M b
209 209 C a
210 210 --------------
211 211
212 212 --------------
213 213 test L:up b R:nm a b W: - 13 merge b no ancestor
214 214 --------------
215 215 resolving manifests
216 216 overwrite None partial False
217 217 ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
218 218 a: other deleted -> r
219 219 b: versions differ -> m
220 220 rev: versions differ -> m
221 221 removing a
222 222 merging b
223 223 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
224 224 merging rev
225 225 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
226 226 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
227 227 (branch merge, don't forget to commit)
228 228 --------------
229 229 M b
230 230 --------------
231 231
232 232 --------------
233 233 test L:nc a b R:up a b W: - 14 merge b no ancestor
234 234 --------------
235 235 resolving manifests
236 236 overwrite None partial False
237 237 ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
238 238 a: remote is newer -> g
239 239 b: versions differ -> m
240 240 rev: versions differ -> m
241 241 getting a
242 242 merging b
243 243 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
244 244 merging rev
245 245 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
246 246 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
247 247 (branch merge, don't forget to commit)
248 248 --------------
249 249 M a
250 250 M b
251 251 --------------
252 252
253 253 --------------
254 254 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
255 255 --------------
256 256 resolving manifests
257 257 overwrite None partial False
258 258 ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
259 259 a: other deleted -> r
260 260 b: versions differ -> m
261 261 rev: versions differ -> m
262 262 removing a
263 263 merging b
264 264 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
265 265 merging rev
266 266 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
267 267 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
268 268 (branch merge, don't forget to commit)
269 269 --------------
270 270 M b
271 271 --------------
272 272
273 273 --------------
274 274 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
275 275 --------------
276 276 resolving manifests
277 277 overwrite None partial False
278 278 ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
279 279 a: remote is newer -> g
280 280 b: versions differ -> m
281 281 rev: versions differ -> m
282 282 getting a
283 283 merging b
284 284 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
285 285 merging rev
286 286 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
287 287 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
288 288 (branch merge, don't forget to commit)
289 289 --------------
290 290 M a
291 291 M b
292 292 --------------
293 293
294 294 --------------
295 295 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
296 296 --------------
297 297 resolving manifests
298 298 overwrite None partial False
299 299 ancestor 924404dff337 local 0b76e65c8289+ remote 735846fee2d7
300 300 b: versions differ -> m
301 301 rev: versions differ -> m
302 302 merging b
303 303 my b@0b76e65c8289+ other b@735846fee2d7 ancestor b@000000000000
304 304 merging rev
305 305 my rev@0b76e65c8289+ other rev@735846fee2d7 ancestor rev@924404dff337
306 306 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
307 307 (branch merge, don't forget to commit)
308 308 --------------
309 309 M b
310 310 C a
311 311 --------------
312 312
313 313 --------------
314 314 test L:nm a b R:up a b W: - 18 merge b no ancestor
315 315 --------------
316 316 resolving manifests
317 317 overwrite None partial False
318 318 ancestor 924404dff337 local ecf3cb2a4219+ remote 8dbce441892a
319 319 b: versions differ -> m
320 320 rev: versions differ -> m
321 321 a: prompt recreating -> g
322 322 getting a
323 323 merging b
324 324 my b@ecf3cb2a4219+ other b@8dbce441892a ancestor b@000000000000
325 325 merging rev
326 326 my rev@ecf3cb2a4219+ other rev@8dbce441892a ancestor rev@924404dff337
327 327 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
328 328 (branch merge, don't forget to commit)
329 329 --------------
330 330 M a
331 331 M b
332 332 --------------
333 333
334 334 --------------
335 335 test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
336 336 --------------
337 337 resolving manifests
338 338 overwrite None partial False
339 339 ancestor 924404dff337 local 0b76e65c8289+ remote e03727d2d66b
340 340 b: versions differ -> m
341 341 rev: versions differ -> m
342 342 merging b
343 343 my b@0b76e65c8289+ other b@e03727d2d66b ancestor b@000000000000
344 344 merging rev
345 345 my rev@0b76e65c8289+ other rev@e03727d2d66b ancestor rev@924404dff337
346 346 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
347 347 (branch merge, don't forget to commit)
348 348 --------------
349 349 M b
350 350 C a
351 351 --------------
352 352
353 353 --------------
354 354 test L:up a R:um a b W: - 20 merge a and b to b, remove a
355 355 --------------
356 356 resolving manifests
357 357 overwrite None partial False
358 358 ancestor 924404dff337 local e300d1c794ec+ remote 79cc6877a3b7
359 359 a: remote moved -> m
360 360 rev: versions differ -> m
361 361 merging a and b
362 362 my a@e300d1c794ec+ other b@79cc6877a3b7 ancestor a@924404dff337
363 363 copying a to b
364 364 removing a
365 365 merging rev
366 366 my rev@e300d1c794ec+ other rev@79cc6877a3b7 ancestor rev@924404dff337
367 367 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
368 368 (branch merge, don't forget to commit)
369 369 --------------
370 370 M b
371 371 a
372 372 --------------
373 373
374 374 --------------
375 375 test L:um a b R:up a W: - 21 merge a and b to b
376 376 --------------
377 377 resolving manifests
378 378 overwrite None partial False
379 379 ancestor 924404dff337 local ec03c2ca8642+ remote f4db7e329e71
380 380 b: local moved -> m
381 381 rev: versions differ -> m
382 382 merging b and a
383 383 my b@ec03c2ca8642+ other a@f4db7e329e71 ancestor a@924404dff337
384 384 merging rev
385 385 my rev@ec03c2ca8642+ other rev@f4db7e329e71 ancestor rev@924404dff337
386 386 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
387 387 (branch merge, don't forget to commit)
388 388 --------------
389 389 M b
390 390 a
391 391 --------------
392 392
393 393 --------------
394 394 test L:nm a b R:up a c W: - 23 get c, keep b
395 395 --------------
396 396 resolving manifests
397 397 overwrite None partial False
398 398 ancestor 924404dff337 local ecf3cb2a4219+ remote 2b958612230f
399 399 b: local moved -> m
400 400 rev: versions differ -> m
401 401 c: remote created -> g
402 402 merging b and a
403 403 my b@ecf3cb2a4219+ other a@2b958612230f ancestor a@924404dff337
404 404 getting c
405 405 merging rev
406 406 my rev@ecf3cb2a4219+ other rev@2b958612230f ancestor rev@924404dff337
407 407 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
408 408 (branch merge, don't forget to commit)
409 409 --------------
410 410 M b
411 411 a
412 412 M c
413 413 --------------
414 414
@@ -1,136 +1,136 b''
1 1 adding a
2 2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
3 3 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 4 diff -r 33aaa84a386b a
5 5 --- a/a
6 6 +++ b/a
7 7 @@ -1,1 +1,1 @@ a
8 8 -a
9 9 +abc
10 10 adding b
11 11 M a
12 12 changeset: 0:33aaa84a386b
13 13 user: test
14 14 date: Mon Jan 12 13:46:40 1970 +0000
15 15 summary: 1
16 16
17 17 resolving manifests
18 18 overwrite False partial False
19 19 ancestor 33aaa84a386b local 33aaa84a386b+ remote 802f095af299
20 20 a: versions differ -> m
21 21 b: remote created -> g
22 22 merging a
23 23 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
24 24 getting b
25 25 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
26 26 changeset: 1:802f095af299
27 27 tag: tip
28 28 user: test
29 29 date: Mon Jan 12 13:46:40 1970 +0000
30 30 summary: 2
31 31
32 32 resolving manifests
33 33 overwrite False partial False
34 34 ancestor 33aaa84a386b local 802f095af299+ remote 33aaa84a386b
35 35 b: remote deleted -> r
36 36 removing b
37 37 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
38 38 changeset: 0:33aaa84a386b
39 39 user: test
40 40 date: Mon Jan 12 13:46:40 1970 +0000
41 41 summary: 1
42 42
43 43 abort: there is nothing to merge - use "hg update" instead
44 44 failed
45 45 changeset: 0:33aaa84a386b
46 46 user: test
47 47 date: Mon Jan 12 13:46:40 1970 +0000
48 48 summary: 1
49 49
50 50 resolving manifests
51 51 overwrite False partial False
52 52 ancestor 33aaa84a386b local 33aaa84a386b+ remote 802f095af299
53 53 a: versions differ -> m
54 54 b: remote created -> g
55 55 merging a
56 56 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
57 57 getting b
58 58 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
59 59 changeset: 1:802f095af299
60 60 tag: tip
61 61 user: test
62 62 date: Mon Jan 12 13:46:40 1970 +0000
63 63 summary: 2
64 64
65 65 changeset: 1:802f095af299
66 66 tag: tip
67 67 user: test
68 68 date: Mon Jan 12 13:46:40 1970 +0000
69 69 files: a b
70 70 description:
71 71 2
72 72
73 73
74 74 changeset: 0:33aaa84a386b
75 75 user: test
76 76 date: Mon Jan 12 13:46:40 1970 +0000
77 77 files: a
78 78 description:
79 79 1
80 80
81 81
82 82 diff -r 802f095af299 a
83 83 --- a/a
84 84 +++ b/a
85 85 @@ -1,1 +1,1 @@ a2
86 86 -a2
87 87 +abc
88 88 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
89 89 adding b
90 90 M a
91 91 changeset: 1:802f095af299
92 92 user: test
93 93 date: Mon Jan 12 13:46:40 1970 +0000
94 94 summary: 2
95 95
96 96 abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes
97 97 failed
98 98 abort: outstanding uncommitted changes
99 99 failed
100 100 resolving manifests
101 101 overwrite False partial False
102 102 ancestor 33aaa84a386b local 802f095af299+ remote 030602aee63d
103 103 a: versions differ -> m
104 104 b: versions differ -> m
105 105 merging a
106 106 my a@802f095af299+ other a@030602aee63d ancestor a@33aaa84a386b
107 107 merging b
108 108 my b@802f095af299+ other b@030602aee63d ancestor b@000000000000
109 109 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
110 110 (branch merge, don't forget to commit)
111 111 changeset: 1:802f095af299
112 112 user: test
113 113 date: Mon Jan 12 13:46:40 1970 +0000
114 114 summary: 2
115 115
116 116 changeset: 2:030602aee63d
117 117 tag: tip
118 118 parent: 0:33aaa84a386b
119 119 user: test
120 120 date: Mon Jan 12 13:46:40 1970 +0000
121 121 summary: 3
122 122
123 123 diff -r 802f095af299 a
124 124 --- a/a
125 125 +++ b/a
126 126 @@ -1,1 +1,1 @@ a2
127 127 -a2
128 128 +abc
129 129 adding a
130 130 pulling from ../a
131 131 requesting all changes
132 132 adding changesets
133 133 adding manifests
134 134 adding file changes
135 135 added 1 changesets with 1 changes to 1 files
136 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
136 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
General Comments 0
You need to be logged in to leave comments. Login now