name-hash: allow hashing an empty string
authorJunio C Hamano <gitster@pobox.com>
Tue, 19 Feb 2013 19:56:44 +0000 (11:56 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 19 Feb 2013 22:00:12 +0000 (14:00 -0800)
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>
builtin/check-ignore.c
name-hash.c
t/t0008-ignores.sh
index 709535ce09fd3876e48e6e7b81bc2f6654e04c1e..0240f99b57a2f81320b84951bf6dc89ab60d6282 100644 (file)
@@ -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);
                                        ? 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) {
                        exclude = last_exclude_matching_path(&check, full_path,
                                                             -1, &dtype);
                        if (exclude) {
index d8d25c23e99dddd9bd0bf83d73f2ae136d7307b5..942c45962252eba4c6f88b4f4f7593c9247749ae 100644 (file)
@@ -24,11 +24,11 @@ static unsigned int hash_name(const char *name, int namelen)
 {
        unsigned int hash = 0x123;
 
 {
        unsigned int hash = 0x123;
 
-       do {
+       while (namelen--) {
                unsigned char c = *name++;
                c = icase_hash(c);
                hash = hash*101 + c;
                unsigned char c = *name++;
                c = icase_hash(c);
                hash = hash*101 + c;
-       } while (--namelen);
+       }
        return hash;
 }
 
        return hash;
 }
 
index ebe7c701fece257db1defdbbcd2b43105956875b..9c1bde1fd6e6424f7af732556656a9daf9be350b 100755 (executable)
@@ -138,6 +138,7 @@ test_expect_success 'setup' '
        cat <<-\EOF >.gitignore &&
                one
                ignored-*
        cat <<-\EOF >.gitignore &&
                one
                ignored-*
+               top-level-dir/
        EOF
        for dir in . a
        do
        EOF
        for dir in . a
        do
@@ -177,6 +178,10 @@ test_expect_success 'setup' '
 #
 # test invalid inputs
 
 #
 # 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"
 test_expect_success_multi 'empty command line' '' '
        test_check_ignore "" 128 &&
        stderr_contains "fatal: no path specified"