log: add exhaustive tests for pattern style options & config
Add exhaustive tests for how the different grep.patternType options &
the corresponding command-line options affect git-log.
Before this change it was possible to patch revision.c so that the
--basic-regexp option was synonymous with --extended-regexp, and
--perl-regexp wasn't recognized at all, and still have 100% of the
test suite pass.
This was because the first test being modified here, added in commit
34a4ae55b2
("log --grep: use the same helper to set -E/-F options as
"git grep"", 2012-10-03), didn't actually check whether we'd enabled
extended regular expressions as distinct from re-toggling non-fixed
string support.
Fix that by changing the pattern to a pattern that'll only match if
--extended-regexp option is provided, but won't match under the
default --basic-regexp option.
Other potential regressions were possible since there were no tests
for the rest of the combinations of grep.patternType configuration
toggles & corresponding git-log command-line options. Add exhaustive
tests for those.
The patterns being passed to fixed/basic/extended/PCRE are carefully
crafted to return the wrong thing if the grep engine were to pick any
other matching method than the one it's told to use.
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
3eb585c112
commit
9df46763ef
@ -262,7 +262,30 @@ test_expect_success 'log --grep -i' '
|
||||
|
||||
test_expect_success 'log -F -E --grep=<ere> uses ere' '
|
||||
echo second >expect &&
|
||||
git log -1 --pretty="tformat:%s" -F -E --grep=s.c.nd >actual &&
|
||||
# basic would need \(s\) to do the same
|
||||
git log -1 --pretty="tformat:%s" -F -E --grep="(s).c.nd" >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success PCRE 'log -F -E --perl-regexp --grep=<pcre> uses PCRE' '
|
||||
test_when_finished "rm -rf num_commits" &&
|
||||
git init num_commits &&
|
||||
(
|
||||
cd num_commits &&
|
||||
test_commit 1d &&
|
||||
test_commit 2e
|
||||
) &&
|
||||
|
||||
# In PCRE \d in [\d] is like saying "0-9", and matches the 2
|
||||
# in 2e...
|
||||
echo 2e >expect &&
|
||||
git -C num_commits log -1 --pretty="tformat:%s" -F -E --perl-regexp --grep="[\d]" >actual &&
|
||||
test_cmp expect actual &&
|
||||
|
||||
# ...in POSIX basic and extended it is the same as [d],
|
||||
# i.e. "d", which matches 1d, but does not match 2e.
|
||||
echo 1d >expect &&
|
||||
git -C num_commits log -1 --pretty="tformat:%s" -F -E --grep="[\d]" >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
@ -280,6 +303,79 @@ test_expect_success 'log with grep.patternType configuration and command line' '
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'log with various grep.patternType configurations & command-lines' '
|
||||
git init pattern-type &&
|
||||
(
|
||||
cd pattern-type &&
|
||||
test_commit 1 file A &&
|
||||
|
||||
# The tagname is overridden here because creating a
|
||||
# tag called "(1|2)" as test_commit would otherwise
|
||||
# implicitly do would fail on e.g. MINGW.
|
||||
test_commit "(1|2)" file B 2 &&
|
||||
|
||||
echo "(1|2)" >expect.fixed &&
|
||||
cp expect.fixed expect.basic &&
|
||||
cp expect.fixed expect.extended &&
|
||||
cp expect.fixed expect.perl &&
|
||||
|
||||
# A strcmp-like match with fixed.
|
||||
git -c grep.patternType=fixed log --pretty=tformat:%s \
|
||||
--grep="(1|2)" >actual.fixed &&
|
||||
|
||||
# POSIX basic matches (, | and ) literally.
|
||||
git -c grep.patternType=basic log --pretty=tformat:%s \
|
||||
--grep="(.|.)" >actual.basic &&
|
||||
|
||||
# POSIX extended needs to have | escaped to match it
|
||||
# literally, whereas under basic this is the same as
|
||||
# (|2), i.e. it would also match "1". This test checks
|
||||
# for extended by asserting that it is not matching
|
||||
# what basic would match.
|
||||
git -c grep.patternType=extended log --pretty=tformat:%s \
|
||||
--grep="\|2" >actual.extended &&
|
||||
if test_have_prereq PCRE
|
||||
then
|
||||
# Only PCRE would match [\d]\| with only
|
||||
# "(1|2)" due to [\d]. POSIX basic would match
|
||||
# both it and "1" since similarly to the
|
||||
# extended match above it is the same as
|
||||
# \([\d]\|\). POSIX extended would
|
||||
# match neither.
|
||||
git -c grep.patternType=perl log --pretty=tformat:%s \
|
||||
--grep="[\d]\|" >actual.perl &&
|
||||
test_cmp expect.perl actual.perl
|
||||
fi &&
|
||||
test_cmp expect.fixed actual.fixed &&
|
||||
test_cmp expect.basic actual.basic &&
|
||||
test_cmp expect.extended actual.extended &&
|
||||
|
||||
git log --pretty=tformat:%s -F \
|
||||
--grep="(1|2)" >actual.fixed.short-arg &&
|
||||
git log --pretty=tformat:%s -E \
|
||||
--grep="\|2" >actual.extended.short-arg &&
|
||||
test_cmp expect.fixed actual.fixed.short-arg &&
|
||||
test_cmp expect.extended actual.extended.short-arg &&
|
||||
|
||||
git log --pretty=tformat:%s --fixed-strings \
|
||||
--grep="(1|2)" >actual.fixed.long-arg &&
|
||||
git log --pretty=tformat:%s --basic-regexp \
|
||||
--grep="(.|.)" >actual.basic.long-arg &&
|
||||
git log --pretty=tformat:%s --extended-regexp \
|
||||
--grep="\|2" >actual.extended.long-arg &&
|
||||
if test_have_prereq PCRE
|
||||
then
|
||||
git log --pretty=tformat:%s --perl-regexp \
|
||||
--grep="[\d]\|" >actual.perl.long-arg &&
|
||||
test_cmp expect.perl actual.perl.long-arg
|
||||
|
||||
fi &&
|
||||
test_cmp expect.fixed actual.fixed.long-arg &&
|
||||
test_cmp expect.basic actual.basic.long-arg &&
|
||||
test_cmp expect.extended actual.extended.long-arg
|
||||
)
|
||||
'
|
||||
|
||||
cat > expect <<EOF
|
||||
* Second
|
||||
* sixth
|
||||
|
Loading…
Reference in New Issue
Block a user