summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-12-16 17:39:06 -0800
committerJunio C Hamano <junkio@cox.net>2006-12-17 01:14:44 -0800
commit81a361be3b12f393d402c5da63191c11c18ea6a9 (patch)
tree5f0b4d5c59c5e3aab6820c516628c51b86e1fe4a
parentc33ab0dd100d91d417b5ed3378acbf3310c07cec (diff)
downloadgit-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.c2
-rwxr-xr-xt/t0000-basic.sh9
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