Skip to content
This repository was archived by the owner on Nov 9, 2017. It is now read-only.

Commit c19387e

Browse files
committed
name-hash: allow hashing an empty string
Usually we do not pass an empty string to the function hash_name() because we almost always ask for hash values for a path that is a candidate to be added to the index. However, check-ignore (and most likely check-attr, but I didn't check) apparently has a callchain to ask the hash value for an empty path when it was given a "." from the top-level directory to ask "Is the path . excluded by default?" Make sure that hash_name() does not overrun the end of the given pathname even when it is empty. Remove a sweep-the-issue-under-the-rug conditional in check-ignore that avoided to pass an empty string to the callchain while at it. It is a valid question to ask for check-ignore if the top-level is set to be ignored by default, even though the answer is most likely no, if only because there is currently no way to specify such an entry in the .gitignore file. But it is an unusual thing to ask and it is not worth optimizing for it by special casing at the top level of the call chain. Signed-off-by: Adam Spiers <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 6866654 commit c19387e

File tree

3 files changed

+8
-3
lines changed

3 files changed

+8
-3
lines changed

builtin/check-ignore.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ static int check_ignore(const char *prefix, const char **pathspec)
8989
? strlen(prefix) : 0, path);
9090
full_path = check_path_for_gitlink(full_path);
9191
die_if_path_beyond_symlink(full_path, prefix);
92-
if (!seen[i] && path[0]) {
92+
if (!seen[i]) {
9393
exclude = last_exclude_matching_path(&check, full_path,
9494
-1, &dtype);
9595
if (exclude) {

name-hash.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ static unsigned int hash_name(const char *name, int namelen)
2424
{
2525
unsigned int hash = 0x123;
2626

27-
do {
27+
while (namelen--) {
2828
unsigned char c = *name++;
2929
c = icase_hash(c);
3030
hash = hash*101 + c;
31-
} while (--namelen);
31+
}
3232
return hash;
3333
}
3434

t/t0008-ignores.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ test_expect_success 'setup' '
138138
cat <<-\EOF >.gitignore &&
139139
one
140140
ignored-*
141+
top-level-dir/
141142
EOF
142143
for dir in . a
143144
do
@@ -177,6 +178,10 @@ test_expect_success 'setup' '
177178
#
178179
# test invalid inputs
179180

181+
test_expect_success_multi '. corner-case' '' '
182+
test_check_ignore . 1
183+
'
184+
180185
test_expect_success_multi 'empty command line' '' '
181186
test_check_ignore "" 128 &&
182187
stderr_contains "fatal: no path specified"

0 commit comments

Comments
 (0)