merge-recursive: Delay modify/delete conflicts if D/F conflict present
authorElijah Newren <newren@gmail.com>
Mon, 20 Sep 2010 08:29:04 +0000 (02:29 -0600)
committerJunio C Hamano <gitster@pobox.com>
Thu, 30 Sep 2010 00:37:04 +0000 (17:37 -0700)
When handling merges with modify/delete conflicts, if the modified path is
involved in a D/F conflict, handle the issue in process_df_entry() rather
than process_entry().

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
merge-recursive.c
index 0ca54bd882e524a6b2b71c91c3ce10ea257eb153..ffcecc7f49ff5f723aa7ce14e3a0b9f5631484cd 100644 (file)
@@ -1249,6 +1249,10 @@ static int process_entry(struct merge_options *o,
                                output(o, 2, "Removing %s", path);
                        /* do not touch working file if it did not exist */
                        remove_file(o, 1, path, !a_sha);
+               } else if (string_list_has_string(&o->current_directory_set,
+                                                 path)) {
+                       entry->processed = 0;
+                       return 1; /* Assume clean till processed */
                } else {
                        /* Deleted in one and changed in the other */
                        clean_merge = 0;
@@ -1367,6 +1371,11 @@ static int process_df_entry(struct merge_options *o,
                        entry->processed = 0;
                        break;
                }
+       } else if (o_sha && (!a_sha || !b_sha)) {
+               /* Modify/delete; deleted side may have put a directory in the way */
+               clean_merge = 0;
+               handle_delete_modify(o, path,
+                                    a_sha, a_mode, b_sha, b_mode);
        } else if (!o_sha && !!a_sha != !!b_sha) {
                /* directory -> (directory, file) */
                const char *add_branch;