mercurial/copies.py
changeset 46634 ad30b29bc23d
parent 46588 47557ea79fc7
child 46648 eca88f5fbcb2
--- a/mercurial/copies.py	Thu Mar 04 21:58:55 2021 +0100
+++ b/mercurial/copies.py	Thu Mar 04 16:06:55 2021 -0800
@@ -1096,11 +1096,17 @@
             b"   discovered dir src: '%s' -> dst: '%s'\n" % (d, dirmove[d])
         )
 
+    # Sort the directories in reverse order, so we find children first
+    # For example, if dir1/ was renamed to dir2/, and dir1/subdir1/
+    # was renamed to dir2/subdir2/, we want to move dir1/subdir1/file
+    # to dir2/subdir2/file (not dir2/subdir1/file)
+    dirmove_children_first = sorted(dirmove, reverse=True)
+
     movewithdir = {}
     # check unaccounted nonoverlapping files against directory moves
     for f in addedfilesfn():
         if f not in fullcopy:
-            for d in dirmove:
+            for d in dirmove_children_first:
                 if f.startswith(d):
                     # new file added in a directory that was moved, move it
                     df = dirmove[d] + f[len(d) :]