Skip to content

Commit

Permalink
name-hash: allow hashing an empty string
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Feb 19, 2013
1 parent 6866654 commit c19387e
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 3 deletions.
2 changes: 1 addition & 1 deletion builtin/check-ignore.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ static int check_ignore(const char *prefix, const char **pathspec)
? strlen(prefix) : 0, path);
full_path = check_path_for_gitlink(full_path);
die_if_path_beyond_symlink(full_path, prefix);
if (!seen[i] && path[0]) {
if (!seen[i]) {
exclude = last_exclude_matching_path(&check, full_path,
-1, &dtype);
if (exclude) {
Expand Down
4 changes: 2 additions & 2 deletions name-hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ static unsigned int hash_name(const char *name, int namelen)
{
unsigned int hash = 0x123;

do {
while (namelen--) {
unsigned char c = *name++;
c = icase_hash(c);
hash = hash*101 + c;
} while (--namelen);
}
return hash;
}

Expand Down
5 changes: 5 additions & 0 deletions t/t0008-ignores.sh
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ test_expect_success 'setup' '
cat <<-\EOF >.gitignore &&
one
ignored-*
top-level-dir/
EOF
for dir in . a
do
Expand Down Expand Up @@ -177,6 +178,10 @@ test_expect_success 'setup' '
#
# test invalid inputs

test_expect_success_multi '. corner-case' '' '
test_check_ignore . 1
'

test_expect_success_multi 'empty command line' '' '
test_check_ignore "" 128 &&
stderr_contains "fatal: no path specified"
Expand Down

0 comments on commit c19387e

Please sign in to comment.