Skip to content

Commit

Permalink
merge-recursive: handle D/F conflict case more carefully.
Browse files Browse the repository at this point in the history
When a path D that originally was blob in the ancestor was
modified on our branch while it was removed on the other branch,
we keep stages 1 and 2, and leave our version in the working
tree.  If the other branch created a path D/F, however, that
path can cleanly be resolved in the index (after all, the
ancestor nor we do not have it and only the other side added),
but it cannot be checked out.  The issue is the same when the
other branch had D and we had renamed it to D/F, or the ancestor
had D/F instead of D (so there are four combinations).

Do not stop the merge, but leave both D and D/F paths in the
index so that the user can clear things up.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Apr 10, 2007
1 parent ac7f0f4 commit 4d50895
Showing 1 changed file with 26 additions and 3 deletions.
29 changes: 26 additions & 3 deletions merge-recursive.c
Original file line number Diff line number Diff line change
Expand Up @@ -596,9 +596,31 @@ static void update_file_flags(const unsigned char *sha,

if (S_ISREG(mode) || (!has_symlinks && S_ISLNK(mode))) {
int fd;
if (mkdir_p(path, 0777))
die("failed to create path %s: %s", path, strerror(errno));
unlink(path);
int status;
const char *msg = "failed to create path '%s'%s";

status = mkdir_p(path, 0777);
if (status) {
if (status == -3) {
/* something else exists */
error(msg, path, ": perhaps a D/F conflict?");
update_wd = 0;
goto update_index;
}
die(msg, path, "");
}
if (unlink(path)) {
if (errno == EISDIR) {
/* something else exists */
error(msg, path, ": perhaps a D/F conflict?");
update_wd = 0;
goto update_index;
}
if (errno != ENOENT)
die("failed to unlink %s "
"in preparation to update: %s",
path, strerror(errno));
}
if (mode & 0100)
mode = 0777;
else
Expand All @@ -620,6 +642,7 @@ static void update_file_flags(const unsigned char *sha,
die("do not know what to do with %06o %s '%s'",
mode, sha1_to_hex(sha), path);
}
update_index:
if (update_cache)
add_cacheinfo(mode, sha, path, 0, update_wd, ADD_CACHE_OK_TO_ADD);
}
Expand Down

0 comments on commit 4d50895

Please sign in to comment.