Mercurial > public > mercurial-scm > hg
diff mercurial/copies.py @ 16794:98687cdddcb1
merge: warn about file deleted in one branch and renamed in other (issue3074)
For divergent renames the following message is printed during merge:
note: possible conflict - file was renamed multiple times to:
newfile
file2
When a file is renamed in one branch and deleted in the other, the file still
exists after a merge. With this change a similar message is printed for mv+rm:
note: possible conflict - file was deleted and renamed to:
newfile
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Wed, 23 May 2012 20:50:16 +0200 |
parents | ad394c897b16 |
children | e9ae770eff1c |
line wrap: on
line diff
--- a/mercurial/copies.py Wed May 23 17:33:19 2012 +0200 +++ b/mercurial/copies.py Wed May 23 20:50:16 2012 +0200 @@ -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,10 +286,15 @@ for f in u2: checkcopies(f, m2, m1) + renamedelete = {} diverge2 = set() for of, fl in diverge.items(): 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] else: diverge2.update(fl) # reverse map for below @@ -302,7 +310,7 @@ del diverge2 if not fullcopy: - return copy, diverge + return copy, diverge, renamedelete repo.ui.debug(" checking for directory renames\n") @@ -337,7 +345,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 +362,4 @@ repo.ui.debug(" file %s -> %s\n" % (f, copy[f])) break - return copy, diverge + return copy, diverge, renamedelete