Skip to content

Commit

Permalink
gitattributes: fix relative path matching
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Feb 7, 2008
1 parent a0cf49c commit cf94ccd
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
6 changes: 3 additions & 3 deletions attr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 : "()");
}
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;

Expand Down Expand Up @@ -543,10 +543,10 @@ static int path_matches(const char *pathname, int pathlen,
if (*pattern == '/')
pattern++;
if (pathlen < baselen ||
(baselen && pathname[baselen - 1] != '/') ||
(baselen && pathname[baselen] != '/') ||
strncmp(pathname, base, baselen))
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)
Expand Down
49 changes: 49 additions & 0 deletions t/t0003-attributes.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit cf94ccd

Please sign in to comment.