# HG changeset patch # User Matt Mackall # Date 1338406299 18000 # Node ID ca025a920fa4afb90d694ca5395bf7bc4a81d943 # Parent 977c801238352df7dfb631cfc692d6db86f4ba1d# Parent e9ae770eff1c5728eb397e0bd413af6b93e78a5f merge with crew diff -r 977c80123835 -r ca025a920fa4 mercurial/copies.py --- a/mercurial/copies.py Wed May 30 14:21:58 2012 -0500 +++ b/mercurial/copies.py Wed May 30 14:31:39 2012 -0500 @@ -177,19 +177,22 @@ "diverge" is a mapping of source name -> list of destination names for divergent renames. + + "renamedelete" is a mapping of source name -> list of destination + names for files deleted in c1 that were renamed in c2 or vice-versa. """ # avoid silly behavior for update from empty dir if not c1 or not c2 or c1 == c2: - return {}, {} + return {}, {}, {} # avoid silly behavior for parent -> working dir if c2.node() is None and c1.node() == repo.dirstate.p1(): - return repo.dirstate.copies(), {} + return repo.dirstate.copies(), {}, {} limit = _findlimit(repo, c1.rev(), c2.rev()) if limit is None: # no common ancestor, no copies - return {}, {} + return {}, {}, {} m1 = c1.manifest() m2 = c2.manifest() ma = ca.manifest() @@ -283,26 +286,36 @@ for f in u2: checkcopies(f, m2, m1) + renamedelete = {} + renamedelete2 = set() diverge2 = set() for of, fl in diverge.items(): - if len(fl) == 1 or of in c2: + if len(fl) == 1 or of in c1 or of in c2: del diverge[of] # not actually divergent, or not a rename + if of not in c1 and of not in c2: + # renamed on one side, deleted on the other side, but filter + # out files that have been renamed and then deleted + renamedelete[of] = [f for f in fl if f in c1 or f in c2] + renamedelete2.update(fl) # reverse map for below else: diverge2.update(fl) # reverse map for below if fullcopy: - repo.ui.debug(" all copies found (* = to merge, ! = divergent):\n") + repo.ui.debug(" all copies found (* = to merge, ! = divergent, " + "% = renamed and deleted):\n") for f in fullcopy: note = "" if f in copy: note += "*" if f in diverge2: note += "!" + if f in renamedelete2: + note += "%" repo.ui.debug(" %s -> %s %s\n" % (f, fullcopy[f], note)) del diverge2 if not fullcopy: - return copy, diverge + return copy, diverge, renamedelete repo.ui.debug(" checking for directory renames\n") @@ -337,7 +350,7 @@ del d1, d2, invalid if not dirmove: - return copy, diverge + return copy, diverge, renamedelete for d in dirmove: repo.ui.debug(" dir %s -> %s\n" % (d, dirmove[d])) @@ -354,4 +367,4 @@ repo.ui.debug(" file %s -> %s\n" % (f, copy[f])) break - return copy, diverge + return copy, diverge, renamedelete diff -r 977c80123835 -r ca025a920fa4 mercurial/merge.py --- a/mercurial/merge.py Wed May 30 14:21:58 2012 -0500 +++ b/mercurial/merge.py Wed May 30 14:31:39 2012 -0500 @@ -198,9 +198,11 @@ elif pa == p2: # backwards pa = p1.p1() elif pa and repo.ui.configbool("merge", "followcopies", True): - copy, diverge = copies.mergecopies(repo, p1, p2, pa) + copy, diverge, renamedelete = copies.mergecopies(repo, p1, p2, pa) for of, fl in diverge.iteritems(): act("divergent renames", "dr", of, fl) + for of, fl in renamedelete.iteritems(): + act("rename and delete", "rd", of, fl) repo.ui.note(_("resolving manifests\n")) repo.ui.debug(" overwrite: %s, partial: %s\n" @@ -409,6 +411,12 @@ "multiple times to:\n") % f) for nf in fl: repo.ui.warn(" %s\n" % nf) + elif m == "rd": # rename and delete + fl = a[2] + repo.ui.warn(_("note: possible conflict - %s was deleted " + "and renamed to:\n") % f) + for nf in fl: + repo.ui.warn(" %s\n" % nf) elif m == "e": # exec flags = a[2] repo.wopener.audit(f) diff -r 977c80123835 -r ca025a920fa4 tests/test-copy-move-merge.t --- a/tests/test-copy-move-merge.t Wed May 30 14:21:58 2012 -0500 +++ b/tests/test-copy-move-merge.t Wed May 30 14:31:39 2012 -0500 @@ -24,7 +24,7 @@ unmatched files in other: b c - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): c -> a * b -> a * checking for directory renames diff -r 977c80123835 -r ca025a920fa4 tests/test-double-merge.t --- a/tests/test-double-merge.t Wed May 30 14:21:58 2012 -0500 +++ b/tests/test-double-merge.t Wed May 30 14:31:39 2012 -0500 @@ -29,7 +29,7 @@ searching for copies back to rev 1 unmatched files in other: bar - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): bar -> foo * checking for directory renames resolving manifests diff -r 977c80123835 -r ca025a920fa4 tests/test-graft.t --- a/tests/test-graft.t Wed May 30 14:21:58 2012 -0500 +++ b/tests/test-graft.t Wed May 30 14:31:39 2012 -0500 @@ -118,7 +118,7 @@ searching for copies back to rev 1 unmatched files in local: b - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b -> a * checking for directory renames resolving manifests diff -r 977c80123835 -r ca025a920fa4 tests/test-issue672.t --- a/tests/test-issue672.t Wed May 30 14:21:58 2012 -0500 +++ b/tests/test-issue672.t Wed May 30 14:31:39 2012 -0500 @@ -28,7 +28,7 @@ searching for copies back to rev 1 unmatched files in other: 1a - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): 1a -> 1 checking for directory renames resolving manifests @@ -59,7 +59,7 @@ searching for copies back to rev 1 unmatched files in local: 1a - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): 1a -> 1 * checking for directory renames resolving manifests @@ -82,7 +82,7 @@ searching for copies back to rev 1 unmatched files in other: 1a - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): 1a -> 1 * checking for directory renames resolving manifests diff -r 977c80123835 -r ca025a920fa4 tests/test-rename-dir-merge.t --- a/tests/test-rename-dir-merge.t Wed May 30 14:21:58 2012 -0500 +++ b/tests/test-rename-dir-merge.t Wed May 30 14:31:39 2012 -0500 @@ -30,7 +30,7 @@ unmatched files in other: b/a b/b - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b/a -> a/a b/b -> a/b checking for directory renames @@ -81,7 +81,7 @@ b/b unmatched files in other: a/c - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b/a -> a/a b/b -> a/b checking for directory renames diff -r 977c80123835 -r ca025a920fa4 tests/test-rename-merge1.t --- a/tests/test-rename-merge1.t Wed May 30 14:21:58 2012 -0500 +++ b/tests/test-rename-merge1.t Wed May 30 14:31:39 2012 -0500 @@ -28,7 +28,7 @@ unmatched files in other: b b2 - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): c2 -> a2 ! b -> a * b2 -> a2 ! @@ -95,9 +95,6 @@ $ hg up c761c6948de0 1 files updated, 0 files merged, 2 files removed, 0 files unresolved $ hg up - note: possible conflict - b was renamed multiple times to: - b3 - b4 2 files updated, 0 files merged, 1 files removed, 0 files unresolved Check for issue2642 @@ -126,6 +123,8 @@ $ cat f2 c0 + $ cd .. + Check for issue2089 $ hg init repo2089 @@ -155,3 +154,42 @@ $ cat f2 c2 + + $ cd .. + +Check for issue3074 + + $ hg init repo3074 + $ cd repo3074 + $ echo foo > file + $ hg add file + $ hg commit -m "added file" + $ hg mv file newfile + $ hg commit -m "renamed file" + $ hg update 0 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg rm file + $ hg commit -m "deleted file" + created new head + $ hg merge --debug + searching for copies back to rev 1 + unmatched files in other: + newfile + all copies found (* = to merge, ! = divergent, % = renamed and deleted): + newfile -> file % + checking for directory renames + file: rename and delete -> rd + resolving manifests + overwrite: False, partial: False + ancestor: 19d7f95df299, local: 0084274f6b67+, remote: 5d32493049f0 + newfile: remote created -> g + updating: file 1/2 files (50.00%) + note: possible conflict - file was deleted and renamed to: + newfile + updating: newfile 2/2 files (100.00%) + getting newfile + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg status + M newfile + $ cd .. diff -r 977c80123835 -r ca025a920fa4 tests/test-rename-merge2.t --- a/tests/test-rename-merge2.t Wed May 30 14:21:58 2012 -0500 +++ b/tests/test-rename-merge2.t Wed May 30 14:31:39 2012 -0500 @@ -80,7 +80,7 @@ searching for copies back to rev 1 unmatched files in other: b - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b -> a * checking for directory renames resolving manifests @@ -115,7 +115,7 @@ searching for copies back to rev 1 unmatched files in local: b - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b -> a * checking for directory renames resolving manifests @@ -153,7 +153,7 @@ searching for copies back to rev 1 unmatched files in other: b - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b -> a * checking for directory renames resolving manifests @@ -188,7 +188,7 @@ searching for copies back to rev 1 unmatched files in local: b - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b -> a * checking for directory renames resolving manifests @@ -222,7 +222,7 @@ searching for copies back to rev 1 unmatched files in other: b - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b -> a checking for directory renames resolving manifests @@ -252,7 +252,7 @@ searching for copies back to rev 1 unmatched files in local: b - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b -> a checking for directory renames resolving manifests @@ -279,7 +279,7 @@ searching for copies back to rev 1 unmatched files in other: b - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b -> a checking for directory renames resolving manifests @@ -311,7 +311,7 @@ searching for copies back to rev 1 unmatched files in local: b - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b -> a checking for directory renames resolving manifests @@ -369,7 +369,7 @@ b unmatched files in other: c - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): c -> a ! b -> a ! checking for directory renames @@ -648,7 +648,7 @@ searching for copies back to rev 1 unmatched files in other: b - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b -> a * checking for directory renames resolving manifests @@ -682,7 +682,7 @@ searching for copies back to rev 1 unmatched files in local: b - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b -> a * checking for directory renames resolving manifests @@ -720,7 +720,7 @@ b unmatched files in other: c - all copies found (* = to merge, ! = divergent): + all copies found (* = to merge, ! = divergent, % = renamed and deleted): b -> a * checking for directory renames resolving manifests