mirror of
https://github.com/git/git.git
synced 2024-11-23 18:05:29 +08:00
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:
parent
a0cf49c16a
commit
cf94ccda35
6
attr.c
6
attr.c
@ -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;
|
||||
|
||||
@ -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)
|
||||
|
49
t/t0003-attributes.sh
Executable file
49
t/t0003-attributes.sh
Executable 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
|
Loading…
Reference in New Issue
Block a user