gitattributes: fix relative path matching

There was an embarrassing pair of off-by-one miscounting that
failed to match path "a/b/c" when "a/.gitattributes" tried to
name it with relative path "b/c".

This fixes it.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2008-02-07 00:02:08 -08:00
parent a0cf49c16a
commit cf94ccda35
2 changed files with 52 additions and 3 deletions

6
attr.c
View File

@ -406,7 +406,7 @@ static void debug_info(const char *what, struct attr_stack *elem)
{ {
fprintf(stderr, "%s: %s\n", what, elem->origin ? elem->origin : "()"); fprintf(stderr, "%s: %s\n", what, elem->origin ? elem->origin : "()");
} }
static void debug_set(const char *what, const char *match, struct git_attr *attr, void *v) static void debug_set(const char *what, const char *match, struct git_attr *attr, const void *v)
{ {
const char *value = v; const char *value = v;
@ -543,10 +543,10 @@ static int path_matches(const char *pathname, int pathlen,
if (*pattern == '/') if (*pattern == '/')
pattern++; pattern++;
if (pathlen < baselen || if (pathlen < baselen ||
(baselen && pathname[baselen - 1] != '/') || (baselen && pathname[baselen] != '/') ||
strncmp(pathname, base, baselen)) strncmp(pathname, base, baselen))
return 0; return 0;
return fnmatch(pattern, pathname + baselen, FNM_PATHNAME) == 0; return fnmatch(pattern, pathname + baselen + 1, FNM_PATHNAME) == 0;
} }
static int fill_one(const char *what, struct match_attr *a, int rem) static int fill_one(const char *what, struct match_attr *a, int rem)

49
t/t0003-attributes.sh Executable file
View File

@ -0,0 +1,49 @@
#!/bin/sh
test_description=gitattributes
. ./test-lib.sh
attr_check () {
path="$1"
expect="$2"
git check-attr test -- "$path" >actual &&
echo "$path: test: $2" >expect &&
diff -u expect actual
}
test_expect_success 'setup' '
mkdir -p a/b/d a/c &&
(
echo "f test=f"
) >.gitattributes &&
(
echo "g test=a/g" &&
echo "b/g test=a/b/g"
) >a/.gitattributes &&
(
echo "h test=a/b/h" &&
echo "d/* test=a/b/d/*"
) >a/b/.gitattributes
'
test_expect_success 'attribute test' '
attr_check f f &&
attr_check a/f f &&
attr_check a/c/f f &&
attr_check a/g a/g &&
attr_check a/b/g a/b/g &&
attr_check b/g unspecified &&
attr_check a/b/h a/b/h &&
attr_check a/b/d/g "a/b/d/*"
'
test_done