1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-27 23:56:20 +02:00

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:
Nguyễn Thái Ngọc Duy 2019-03-26 16:41:01 +07:00 committed by Junio C Hamano
parent aeb582a983
commit 19e7fdaa58
2 changed files with 14 additions and 1 deletions

View File

@ -242,7 +242,7 @@ static int include_by_gitdir(const struct config_options *opts,
}
ret = !wildmatch(pattern.buf + prefix, text.buf + prefix,
icase ? WM_CASEFOLD : 0);
WM_PATHNAME | (icase ? WM_CASEFOLD : 0));
if (!ret && !already_tried_absolute) {
/*

View File

@ -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 &&