If there were several files conflicting below a directory corresponding to a D/F conflict, and the file of that D/F conflict is in the way, we want it to be removed. Since files of D/F conflicts are handled last, they can be reinstated later and possibly with a new unique name. Signed-off-by: Elijah Newren <newren@xxxxxxxxx> --- merge-recursive.c | 18 +++++++++++++++--- t/t6036-recursive-corner-cases.sh | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/merge-recursive.c b/merge-recursive.c index d19c519..e3033f2 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -651,11 +651,23 @@ static int would_lose_untracked(const char *path) return !was_tracked(path) && file_exists(path); } -static int make_room_for_path(const char *path) +static int make_room_for_path(const struct merge_options *o, const char *path) { - int status; + int status, i; const char *msg = "failed to create path '%s'%s"; + /* Unlink any D/F conflict files that are in the way */ + for (i = 0; i < o->df_conflict_file_set.nr; i++) { + const char *df_path = o->df_conflict_file_set.items[i].string; + size_t pathlen = strlen(path); + size_t df_pathlen = strlen(df_path); + if (df_pathlen < pathlen && strncmp(path, df_path, df_pathlen) == 0) { + unlink(df_path); + break; + } + } + + /* Make sure leading directories are created */ status = safe_create_leading_directories_const(path); if (status) { if (status == -3) { @@ -723,7 +735,7 @@ static void update_file_flags(struct merge_options *o, } } - if (make_room_for_path(path) < 0) { + if (make_room_for_path(o, path) < 0) { update_wd = 0; free(buf); goto update_index; diff --git a/t/t6036-recursive-corner-cases.sh b/t/t6036-recursive-corner-cases.sh index 423fb62..dea2a65 100755 --- a/t/t6036-recursive-corner-cases.sh +++ b/t/t6036-recursive-corner-cases.sh @@ -477,7 +477,7 @@ test_expect_success 'setup differently handled merges of directory/file conflict git tag E2 ' -test_expect_failure 'git detects conflict and handles merge of D & E1 correctly' ' +test_expect_success 'git detects conflict and handles merge of D & E1 correctly' ' git reset --hard && git reset --hard && git clean -fdqx && -- 1.7.6.rc0.62.g2d69f -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html