--- 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
--- 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)
--- 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
--- 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
--- 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
--- 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
--- 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
--- 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 ..
--- 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