diff -r 51e7c83e05ee -r 43a9e02a7b7f mercurial/merge.py --- a/mercurial/merge.py Mon Nov 28 05:45:22 2016 +0000 +++ b/mercurial/merge.py Mon Dec 05 17:40:01 2016 +0100 @@ -794,7 +794,7 @@ if matcher is not None and matcher.always(): matcher = None - copy, movewithdir, diverge, renamedelete = {}, {}, {}, {} + copy, movewithdir, diverge, renamedelete, dirmove = {}, {}, {}, {}, {} # manifests fetched in order are going to be faster, so prime the caches [x.manifest() for x in @@ -802,7 +802,7 @@ if followcopies: ret = copies.mergecopies(repo, wctx, p2, pa) - copy, movewithdir, diverge, renamedelete = ret + copy, movewithdir, diverge, renamedelete, dirmove = ret repo.ui.note(_("resolving manifests\n")) repo.ui.debug(" branchmerge: %s, force: %s, partial: %s\n" @@ -921,7 +921,16 @@ actions[f] = ('cm', (fl2, pa.node()), "remote created, get or merge") elif n2 != ma[f]: - if acceptremote: + df = None + for d in dirmove: + if f.startswith(d): + # new file added in a directory that was moved + df = dirmove[d] + f[len(d):] + break + if df in m1: + actions[df] = ('m', (df, f, f, False, pa.node()), + "local directory rename - respect move from " + f) + elif acceptremote: actions[f] = ('c', (fl2,), "remote recreating") else: actions[f] = ('dc', (None, f, f, False, pa.node()),