# HG changeset patch # User Matt Mackall # Date 1160458915 18000 # Node ID ecc1bf27378c1221755fe25ec412290ad57198dd # Parent f009a6f12a59492bdd81ecc1fd87a78b84b83127 merge: unify merge and copy actions diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -210,7 +210,7 @@ def manifestmerge(repo, p1, p2, pa, over a = ma.get(f, nullid) # are both different from the ancestor? if not overwrite and n != a and m2[f] != a: - act("versions differ", "m", f, fmerge(f)) + act("versions differ", "m", f, f, f, fmerge(f), False) # are we clobbering? # is remote's version newer? # or are we going back in time and clean? @@ -226,14 +226,13 @@ def manifestmerge(repo, p1, p2, pa, over elif f in copy: f2 = copy[f] if f in ma: # case 3,20 A/B/A - act("remote moved", "c", - f, f2, f2, fmerge(f, f2, f), True) + act("remote moved", "m", f, f2, f2, fmerge(f, f2, f), True) else: if f2 in m1: # case 2 A,B/B/B - act("local copied", "c", + act("local copied", "m", f, f2, f, fmerge(f, f2, f2), False) else: # case 4,21 A/B/B - act("local moved", "c", + act("local moved", "m", f, f2, f, fmerge(f, f2, f2), False) elif f in ma: if n != ma[f] and not overwrite: @@ -258,7 +257,7 @@ def manifestmerge(repo, p1, p2, pa, over if f2 not in m2: # already seen continue # rename case 1, A/A,B/A - act("remote copied", "c", f2, f, f, fmerge(f2, f, f2), False) + act("remote copied", "m", f2, f, f, fmerge(f2, f, f2), False) elif f in ma: if overwrite or backwards: act("recreating", "g", f, m2.execf(f)) @@ -289,20 +288,16 @@ def applyupdates(repo, action, wctx, mct repo.ui.warn(_("update failed to remove %s: %s!\n") % (f, inst.strerror)) removed +=1 - elif m == "c": # copy + elif m == "m": # merge f2, fd, flag, move = a[2:] - repo.ui.status(_("merging %s and %s to %s\n") % (f, f2, fd)) + if f != f2: + repo.ui.status(_("merging %s and %s to %s\n") % (f, f2, fd)) + else: + repo.ui.status(_("merging %s\n") % f) if filemerge(repo, f, f2, fd, wctx, mctx, move): unresolved += 1 util.set_exec(repo.wjoin(fd), flag) merged += 1 - elif m == "m": # merge - flag = a[2] - repo.ui.status(_("merging %s\n") % f) - if filemerge(repo, f, f, f, wctx, mctx, False): - unresolved += 1 - util.set_exec(repo.wjoin(f), flag) - merged += 1 elif m == "g": # get flag = a[2] repo.ui.note(_("getting %s\n") % f) @@ -332,21 +327,6 @@ def recordupdates(repo, action, branchme else: repo.dirstate.update([f], 'n') elif m == "m": # merge - flag = a[2] - if branchmerge: - # We've done a branch merge, mark this file as merged - # so that we properly record the merger later - repo.dirstate.update([f], 'm') - else: - # We've update-merged a locally modified file, so - # we set the dirstate to emulate a normal checkout - # of that file some time in the past. Thus our - # merge will appear as a normal local file - # modification. - fl = repo.file(f) - f_len = mctx.filectx(f).size() - repo.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1) - elif m == "c": # copy f2, fd, flag, move = a[2:] if branchmerge: # We've done a branch merge, mark this file as merged @@ -358,15 +338,15 @@ def recordupdates(repo, action, branchme # of that file some time in the past. Thus our # merge will appear as a normal local file # modification. - fl = repo.file(f) f_len = mctx.filectx(f).size() repo.dirstate.update([fd], 'n', st_size=f_len, st_mtime=-1) - if move: - repo.dirstate.update([f], 'r') - if f != fd: - repo.dirstate.copy(f, fd) - else: - repo.dirstate.copy(f2, fd) + if f != f2: # copy/rename + if move: + repo.dirstate.update([f], 'r') + if f != fd: + repo.dirstate.copy(f, fd) + else: + repo.dirstate.copy(f2, fd) def update(repo, node, branchmerge=False, force=False, partial=None, wlock=None, show_stats=True, remind=True): diff --git a/tests/test-rename-merge1.out b/tests/test-rename-merge1.out --- a/tests/test-rename-merge1.out +++ b/tests/test-rename-merge1.out @@ -4,7 +4,7 @@ merge resolving manifests overwrite None branchmerge True partial False ancestor f26ec4fc3fa3 local 8e765a822af2 remote af1939970a1c - a: remote moved -> c + a: remote moved -> m b2: remote created -> g merging a and b to b resolving a diff --git a/tests/test-rename-merge2.out b/tests/test-rename-merge2.out --- a/tests/test-rename-merge2.out +++ b/tests/test-rename-merge2.out @@ -5,7 +5,7 @@ resolving manifests overwrite None branchmerge True partial False ancestor e300d1c794ec local 735846fee2d7 remote 924404dff337 rev: versions differ -> m - a: remote copied -> c + a: remote copied -> m merging a and b to b resolving a my a@. other b@735846fee2d7 ancestor a@924404dff337 @@ -28,7 +28,7 @@ resolving manifests overwrite None branchmerge True partial False ancestor ac809aeed39a local f4db7e329e71 remote 924404dff337 a: remote is newer -> g - b: local copied -> c + b: local copied -> m rev: versions differ -> m getting a merging b and a to b @@ -51,7 +51,7 @@ test L:up a R:nm a b W: - 3 get resolving manifests overwrite None branchmerge True partial False ancestor e300d1c794ec local e03727d2d66b remote 924404dff337 - a: remote moved -> c + a: remote moved -> m rev: versions differ -> m merging a and b to b resolving a @@ -74,7 +74,7 @@ test L:nm a b R:up a W: - 4 get resolving manifests overwrite None branchmerge True partial False ancestor ecf3cb2a4219 local f4db7e329e71 remote 924404dff337 - b: local moved -> c + b: local moved -> m rev: versions differ -> m merging b and a to b resolving b @@ -96,7 +96,7 @@ resolving manifests overwrite None branchmerge True partial False ancestor 94b33a1b7f2d local 735846fee2d7 remote 924404dff337 rev: versions differ -> m - a: remote copied -> c + a: remote copied -> m merging a and b to b resolving a my a@. other b@735846fee2d7 ancestor a@924404dff337 @@ -118,7 +118,7 @@ test L:nc a b R: W: - 6 not resolving manifests overwrite None branchmerge True partial False ancestor ac809aeed39a local 97c705ade336 remote 924404dff337 - b: local copied -> c + b: local copied -> m rev: versions differ -> m merging b and a to b resolving b @@ -140,7 +140,7 @@ test L: R:nm a b W: - 7 get resolving manifests overwrite None branchmerge True partial False ancestor 94b33a1b7f2d local e03727d2d66b remote 924404dff337 - a: remote moved -> c + a: remote moved -> m rev: versions differ -> m merging a and b to b resolving a @@ -163,7 +163,7 @@ test L:nm a b R: W: - 8 not resolving manifests overwrite None branchmerge True partial False ancestor ecf3cb2a4219 local 97c705ade336 remote 924404dff337 - b: local moved -> c + b: local moved -> m rev: versions differ -> m merging b and a to b resolving b @@ -399,7 +399,7 @@ test L:up a R:um a b W: - 20 mer resolving manifests overwrite None branchmerge True partial False ancestor e300d1c794ec local 79cc6877a3b7 remote 924404dff337 - a: remote moved -> c + a: remote moved -> m rev: versions differ -> m merging a and b to b resolving a @@ -422,7 +422,7 @@ test L:um a b R:up a W: - 21 mer resolving manifests overwrite None branchmerge True partial False ancestor ec03c2ca8642 local f4db7e329e71 remote 924404dff337 - b: local moved -> c + b: local moved -> m rev: versions differ -> m merging b and a to b resolving b @@ -443,7 +443,7 @@ test L:nm a b R:up a c W: - 23 get resolving manifests overwrite None branchmerge True partial False ancestor ecf3cb2a4219 local 2b958612230f remote 924404dff337 - b: local moved -> c + b: local moved -> m rev: versions differ -> m c: remote created -> g merging b and a to b