Fix check_file_directory_conflict(). When replacing an existing file A with a directory A that has a file A/B in it in the index, 'update-index --replace --add A/B' did not properly remove the file to make room for the new directory. There was a trivial logic error, most likely a cut & paste one, dating back to quite early days of git. Signed-off-by: Junio C Hamano <junkio@cox.net>
diff --git a/read-cache.c b/read-cache.c index 983e68b..b8d83cc 100644 --- a/read-cache.c +++ b/read-cache.c
@@ -517,7 +517,7 @@ pos = cache_name_pos(name, ntohs(create_ce_flags(len, stage))); if (pos >= 0) { retval = -1; - if (ok_to_replace) + if (!ok_to_replace) break; remove_cache_entry_at(pos); continue;
diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh index 3260d1d..0cd1c41 100755 --- a/t/t0000-basic.sh +++ b/t/t0000-basic.sh
@@ -272,4 +272,13 @@ wc -l) && test $numparent = 1' +test_expect_success 'update-index D/F conflict' ' + mv path0 tmp && + mv path2 path0 && + mv tmp path2 && + git update-index --add --replace path2 path0/file2 && + numpath0=$(git ls-files path0 | wc -l) && + test $numpath0 = 1 +' + test_done