merge_recursive: Fix renames across paths below D/F conflicts
[gitweb.git] / merge-recursive.c
index c8d5362191151bf6b2fb418277b761b5cc6dbeee..b0f055ecd49f215dd5fb5b8432247ca9504d1b47 100644 (file)
@@ -1019,14 +1019,25 @@ static int process_renames(struct merge_options *o,
 
                                if (mfi.clean &&
                                    sha_eq(mfi.sha, ren1->pair->two->sha1) &&
-                                   mfi.mode == ren1->pair->two->mode)
+                                   mfi.mode == ren1->pair->two->mode) {
                                        /*
                                         * This messaged is part of
                                         * t6022 test. If you change
                                         * it update the test too.
                                         */
                                        output(o, 3, "Skipped %s (merged same as existing)", ren1_dst);
-                               else {
+
+                                       /* There may be higher stage entries left
+                                        * in the index (e.g. due to a D/F
+                                        * conflict) that need to be resolved.
+                                        */
+                                       for (i = 1; i <= 3; i++) {
+                                               if (!ren1->dst_entry->stages[i].mode)
+                                                       continue;
+                                               ren1->dst_entry->processed = 0;
+                                               break;
+                                       }
+                               } else {
                                        if (mfi.merge || !mfi.clean)
                                                output(o, 1, "Renaming %s => %s", ren1_src, ren1_dst);
                                        if (mfi.merge)