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 <git@adamspiers.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Feb 19, 2013 at 11:56 UTC c19387e79947de9307af06ce92a83eaf786153b7
3 files changed +8 -3
builtin/check-ignore.c
+1 -1
@@ -89,7 +89,7 @@ static int check_ignore(const char *prefix, const char **pathspec)
89 ? strlen(prefix) : 0, path);
90 full_path = check_path_for_gitlink(full_path);
91 die_if_path_beyond_symlink(full_path, prefix);
92 - if (!seen[i] && path[0]) {
92 + if (!seen[i]) {
93 exclude = last_exclude_matching_path(&check, full_path,
94 -1, &dtype);
95 if (exclude) {
name-hash.c
+2 -2
@@ -24,11 +24,11 @@ static unsigned int hash_name(const char *name, int namelen)
24 {
25 unsigned int hash = 0x123;
26
27 - do {
27 + while (namelen--) {
28 unsigned char c = *name++;
29 c = icase_hash(c);
30 hash = hash*101 + c;
31 - } while (--namelen);
31 + }
32 return hash;
33 }
34
t/t0008-ignores.sh
+5
@@ -138,6 +138,7 @@ test_expect_success 'setup' '
138 cat <<-\EOF >.gitignore &&
139 one
140 ignored-*
141 + top-level-dir/
142 EOF
143 for dir in . a
144 do
@@ -177,6 +178,10 @@ test_expect_success 'setup' '
178 #
179 # test invalid inputs
180
181 +test_expect_success_multi '. corner-case' '' '
182 + test_check_ignore . 1
183 +'
184 +
185 test_expect_success_multi 'empty command line' '' '
186 test_check_ignore "" 128 &&
187 stderr_contains "fatal: no path specified"