summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2018-02-27 18:33:53 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-02-27 18:33:53 (GMT)
commit2ac76d8d9dccaaecf3c01845d0f7c1808c75722b (patch)
treec41cfd61f019926cbf7699a4e6813b8c10f534da
parentee9db32d42a4b628157ecd395305d83cc630f7aa (diff)
parentc95525e90d2f3c75b879ce51fd17d263a6452de3 (diff)
downloadgit-2ac76d8d9dccaaecf3c01845d0f7c1808c75722b.zip
git-2ac76d8d9dccaaecf3c01845d0f7c1808c75722b.tar.gz
git-2ac76d8d9dccaaecf3c01845d0f7c1808c75722b.tar.bz2
Merge branch 'bp/name-hash-dirname-fix'
"git add" files in the same directory, but spelling the directory path in different cases on case insensitive filesystem, corrupted the name hash data structure and led to unexpected results. This has been corrected. * bp/name-hash-dirname-fix: name-hash: properly fold directory names in adjust_dirname_case()
-rw-r--r--name-hash.c6
-rwxr-xr-xt/t0050-filesystem.sh16
2 files changed, 18 insertions, 4 deletions
diff --git a/name-hash.c b/name-hash.c
index ada66f0..1638498 100644
--- a/name-hash.c
+++ b/name-hash.c
@@ -699,12 +699,12 @@ void adjust_dirname_case(struct index_state *istate, char *name)
if (*ptr == '/') {
struct dir_entry *dir;
- ptr++;
- dir = find_dir_entry(istate, name, ptr - name + 1);
+ dir = find_dir_entry(istate, name, ptr - name);
if (dir) {
memcpy((void *)startPtr, dir->name + (startPtr - name), ptr - startPtr);
- startPtr = ptr;
+ startPtr = ptr + 1;
}
+ ptr++;
}
}
}
diff --git a/t/t0050-filesystem.sh b/t/t0050-filesystem.sh
index b29d749..192c94e 100755
--- a/t/t0050-filesystem.sh
+++ b/t/t0050-filesystem.sh
@@ -80,7 +80,21 @@ test_expect_success 'merge (case change)' '
git merge topic
'
-
+test_expect_success CASE_INSENSITIVE_FS 'add directory (with different case)' '
+ git reset --hard initial &&
+ mkdir -p dir1/dir2 &&
+ echo >dir1/dir2/a &&
+ echo >dir1/dir2/b &&
+ git add dir1/dir2/a &&
+ git add dir1/DIR2/b &&
+ git ls-files >actual &&
+ cat >expected <<-\EOF &&
+ camelcase
+ dir1/dir2/a
+ dir1/dir2/b
+ EOF
+ test_cmp expected actual
+'
test_expect_failure CASE_INSENSITIVE_FS 'add (with different case)' '
git reset --hard initial &&