diff -r 7f5a0eba3768 -r 6c35b53cd28b mercurial/merge.py --- a/mercurial/merge.py Wed Dec 26 11:16:18 2012 -0600 +++ b/mercurial/merge.py Wed Dec 26 14:50:17 2012 -0800 @@ -213,14 +213,15 @@ repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m)) action.append((f, m) + args) - action, copy = [], {} + action, copy, movewithdir = [], {}, {} if overwrite: pa = p1 elif pa == p2: # backwards pa = p1.p1() elif pa and repo.ui.configbool("merge", "followcopies", True): - copy, diverge, renamedelete = copies.mergecopies(repo, p1, p2, pa) + ret = copies.mergecopies(repo, p1, p2, pa) + copy, movewithdir, diverge, renamedelete = ret for of, fl in diverge.iteritems(): act("divergent renames", "dr", of, fl) for of, fl in renamedelete.iteritems(): @@ -233,6 +234,7 @@ m1, m2, ma = p1.manifest(), p2.manifest(), pa.manifest() copied = set(copy.values()) + copied.update(movewithdir.values()) if '.hgsubstate' in m1: # check whether sub state is modified @@ -259,14 +261,14 @@ act("versions differ", "m", f, f, f, rflags, False) elif f in copied: # files we'll deal with on m2 side pass - elif f in copy: + elif f in movewithdir: # directory rename + f2 = movewithdir[f] + act("remote renamed directory to " + f2, "d", f, None, f2, + m1.flags(f)) + elif f in copy: # case 2 A,B/B/B or case 4,21 A/B/B f2 = copy[f] - if f2 not in m2: # directory rename - act("remote renamed directory to " + f2, "d", - f, None, f2, m1.flags(f)) - else: # case 2 A,B/B/B or case 4,21 A/B/B - act("local copied/moved to " + f2, "m", - f, f2, f, fmerge(f, f2, f2), False) + act("local copied/moved to " + f2, "m", f, f2, f, + fmerge(f, f2, f2), False) elif f in ma: # clean, a different, no remote if n != ma[f]: if repo.ui.promptchoice( @@ -286,12 +288,13 @@ continue if f in m1 or f in copied: # files already visited continue - if f in copy: + if f in movewithdir: + f2 = movewithdir[f] + act("local renamed directory to " + f2, "d", None, f, f2, + m2.flags(f)) + elif f in copy: f2 = copy[f] - if f2 not in m1: # directory rename - act("local renamed directory to " + f2, "d", - None, f, f2, m2.flags(f)) - elif f2 in m2: # rename case 1, A/A,B/A + if f2 in m2: # rename case 1, A/A,B/A act("remote copied to " + f, "m", f2, f, f, fmerge(f2, f, f2), False) else: # case 3,20 A/B/A