# HG changeset patch # User Matt Mackall # Date 1172614806 21600 # Node ID c95060a5391a084edc758c5d972f0cc7ca77b35b # Parent f5f171785e29c67b414023f2d1a7783ba0b4eb73 merge: fix renaming of subdirectories under renamed directories diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -184,7 +184,7 @@ def findcopies(repo, m1, m2, ma, limit): invalid[dsrc] = True del dirmove[dsrc] else: - dirmove[dsrc] = ddst + dirmove[dsrc + "/"] = ddst + "/" del d1, d2, invalid @@ -194,9 +194,10 @@ def findcopies(repo, m1, m2, ma, limit): # check unaccounted nonoverlapping files for f in u1 + u2: if f not in fullcopy: - d = os.path.dirname(f) - if d in dirmove: - copy[f] = dirmove[d] + "/" + os.path.basename(f) + for d in dirmove: + if f.startswith(d): + copy[f] = dirmove[d] + f[len(d):] + break return copy diff --git a/tests/test-rename-dir-merge2 b/tests/test-rename-dir-merge2 new file mode 100755 --- /dev/null +++ b/tests/test-rename-dir-merge2 @@ -0,0 +1,28 @@ +#!/bin/sh + +mkdir r1 +cd r1 +hg init +mkdir a +echo foo > a/f +hg add a +hg ci -m "a/f == foo" +cd .. + +hg clone r1 r2 +cd r2 +hg mv a b +echo foo1 > b/f +hg ci -m" a -> b, b/f == foo1" +cd .. + +cd r1 +mkdir a/aa +echo bar > a/aa/g +hg add a/aa +hg ci -m "a/aa/g" +hg pull ../r2 + +hg merge + +hg st -C diff --git a/tests/test-rename-dir-merge2.out b/tests/test-rename-dir-merge2.out new file mode 100644 --- /dev/null +++ b/tests/test-rename-dir-merge2.out @@ -0,0 +1,19 @@ +adding a/f +1 files updated, 0 files merged, 0 files removed, 0 files unresolved +copying a/f to b/f +removing a/f +adding a/aa/g +pulling from ../r2 +searching for changes +adding changesets +adding manifests +adding file changes +added 1 changesets with 1 changes to 1 files (+1 heads) +(run 'hg heads' to see heads, 'hg merge' to merge) +2 files updated, 0 files merged, 1 files removed, 0 files unresolved +(branch merge, don't forget to commit) +M b/f +A b/aa/g + a/aa/g +R a/aa/g +R a/f