diff options
author | Junio C Hamano <junkio@cox.net> | 2006-12-16 17:39:06 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-12-17 01:14:44 -0800 |
commit | 81a361be3b12f393d402c5da63191c11c18ea6a9 (patch) | |
tree | 5f0b4d5c59c5e3aab6820c516628c51b86e1fe4a | |
parent | c33ab0dd100d91d417b5ed3378acbf3310c07cec (diff) | |
download | git-81a361be3b12f393d402c5da63191c11c18ea6a9.tar.gz |
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>
-rw-r--r-- | read-cache.c | 2 | ||||
-rwxr-xr-x | t/t0000-basic.sh | 9 |
2 files changed, 10 insertions, 1 deletions
diff --git a/read-cache.c b/read-cache.c index 983e68b892..b8d83ccd9f 100644 --- a/read-cache.c +++ b/read-cache.c @@ -517,7 +517,7 @@ static int has_dir_name(const struct cache_entry *ce, int pos, int ok_to_replace 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 3260d1d7a7..0cd1c41866 100755 --- a/t/t0000-basic.sh +++ b/t/t0000-basic.sh @@ -272,4 +272,13 @@ test_expect_success \ 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 |