config: correct '**' matching in includeIf patterns
The current wildmatch() call for includeIf's gitdir pattern does not pass the WM_PATHNAME flag. Without this flag, '*' is treated _almost_ the same as '**' (because '*' also matches slashes) with one exception: '/**/' can match a single slash. The pattern 'foo/**/bar' matches 'foo/bar'. But '/*/', which is essentially what wildmatch engine sees without WM_PATHNAME, has to match two slashes (and '*' matches nothing). Which means 'foo/*/bar' cannot match 'foo/bar'. It can only match 'foo//bar'. The result of this is the current wildmatch() call works most of the time until the user depends on '/**/' matching no path component. And also '*' matches slashes while it should not, but people probably haven't noticed this yet. The fix is straightforward. Reported-by: Jason Karns <jason.karns@gmail.com> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
aeb582a983
commit
19e7fdaa58
2
config.c
2
config.c
@ -242,7 +242,7 @@ again:
|
||||
}
|
||||
|
||||
ret = !wildmatch(pattern.buf + prefix, text.buf + prefix,
|
||||
icase ? WM_CASEFOLD : 0);
|
||||
WM_PATHNAME | (icase ? WM_CASEFOLD : 0));
|
||||
|
||||
if (!ret && !already_tried_absolute) {
|
||||
/*
|
||||
|
@ -229,6 +229,19 @@ test_expect_success 'conditional include, early config reading' '
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'conditional include with /**/' '
|
||||
REPO=foo/bar/repo &&
|
||||
git init $REPO &&
|
||||
cat >>$REPO/.git/config <<-\EOF &&
|
||||
[includeIf "gitdir:**/foo/**/bar/**"]
|
||||
path=bar7
|
||||
EOF
|
||||
echo "[test]seven=7" >$REPO/.git/bar7 &&
|
||||
echo 7 >expect &&
|
||||
git -C $REPO config test.seven >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success SYMLINKS 'conditional include, set up symlinked $HOME' '
|
||||
mkdir real-home &&
|
||||
ln -s real-home home &&
|
||||
|
Loading…
Reference in New Issue
Block a user