changeset 28531:602add6ad9e5

copies: fix detection of divergent directory renames If we move all the files out of one directory, but into two different directories, we should not consider it a directory rename. The detection of this case was broken.
author Matt Mackall <mpm@selenic.com>
date Wed, 13 Jan 2016 10:10:05 -0600
parents add2ba16430e
children f6d1e92fdf8c
files mercurial/copies.py tests/test-rename-dir-merge.t
diffstat 2 files changed, 64 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -401,13 +401,13 @@
             continue
         elif dsrc in d1 and ddst in d1:
             # directory wasn't entirely moved locally
-            invalid.add(dsrc)
+            invalid.add(dsrc + "/")
         elif dsrc in d2 and ddst in d2:
             # directory wasn't entirely moved remotely
-            invalid.add(dsrc)
-        elif dsrc in dirmove and dirmove[dsrc] != ddst:
+            invalid.add(dsrc + "/")
+        elif dsrc + "/" in dirmove and dirmove[dsrc + "/"] != ddst + "/":
             # files from the same directory moved to two different places
-            invalid.add(dsrc)
+            invalid.add(dsrc + "/")
         else:
             # looks good so far
             dirmove[dsrc + "/"] = ddst + "/"
--- a/tests/test-rename-dir-merge.t
+++ b/tests/test-rename-dir-merge.t
@@ -231,3 +231,63 @@
   R a/f
 
   $ cd ..
+
+Test renames to separate directories
+
+  $ hg init a
+  $ cd a
+  $ mkdir a
+  $ touch a/s
+  $ touch a/t
+  $ hg ci -Am0
+  adding a/s
+  adding a/t
+
+Add more files
+
+  $ touch a/s2
+  $ touch a/t2
+  $ hg ci -Am1
+  adding a/s2
+  adding a/t2
+
+Do moves on a branch
+
+  $ hg up 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ mkdir s
+  $ mkdir t
+  $ hg mv a/s s
+  $ hg mv a/t t
+  $ hg ci -Am2
+  created new head
+  $ hg st --copies --change .
+  A s/s
+    a/s
+  A t/t
+    a/t
+  R a/s
+  R a/t
+
+Merge shouldn't move s2, t2
+
+  $ hg merge
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg st --copies
+  M a/s2
+  M a/t2
+
+Try the merge in the other direction. It may or may not be appropriate for
+status to list copies here.
+
+  $ hg up -C 1
+  4 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg merge
+  2 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg st --copies
+  M s/s
+  M t/t
+  R a/s
+  R a/t