tvl-depot/third_party/git/t/t7816-grep-binary-pattern.sh
Vincent Ambo f4609b896f merge(3p/git): Merge git subtree at v2.29.2
This also bumps the stable nixpkgs to 20.09 as of 2020-11-21, because
there is some breakage in the git build related to the netrc
credentials helper which someone has taken care of in nixpkgs.

The stable channel is not used for anything other than git, so this
should be fine.

Change-Id: I3575a19dab09e1e9556cf8231d717de9890484fb
2020-11-21 19:45:56 +01:00

127 lines
3.7 KiB
Bash
Executable file

#!/bin/sh
test_description='git grep with a binary pattern files'
. ./lib-gettext.sh
nul_match_internal () {
matches=$1
prereqs=$2
lc_all=$3
extra_flags=$4
flags=$5
pattern=$6
pattern_human=$(echo "$pattern" | sed 's/Q/<NUL>/g')
if test "$matches" = 1
then
test_expect_success $prereqs "LC_ALL='$lc_all' git grep $extra_flags -f f $flags '$pattern_human' a" "
printf '$pattern' | q_to_nul >f &&
LC_ALL='$lc_all' git grep $extra_flags -f f $flags a
"
elif test "$matches" = 0
then
test_expect_success $prereqs "LC_ALL='$lc_all' git grep $extra_flags -f f $flags '$pattern_human' a" "
>stderr &&
printf '$pattern' | q_to_nul >f &&
test_must_fail env LC_ALL=\"$lc_all\" git grep $extra_flags -f f $flags a 2>stderr &&
test_i18ngrep ! 'This is only supported with -P under PCRE v2' stderr
"
elif test "$matches" = P
then
test_expect_success $prereqs "error, PCRE v2 only: LC_ALL='$lc_all' git grep -f f $flags '$pattern_human' a" "
>stderr &&
printf '$pattern' | q_to_nul >f &&
test_must_fail env LC_ALL=\"$lc_all\" git grep -f f $flags a 2>stderr &&
test_i18ngrep 'This is only supported with -P under PCRE v2' stderr
"
else
test_expect_success "PANIC: Test framework error. Unknown matches value $matches" 'false'
fi
}
nul_match () {
matches=$1
matches_pcre2=$2
matches_pcre2_locale=$3
flags=$4
pattern=$5
pattern_human=$(echo "$pattern" | sed 's/Q/<NUL>/g')
nul_match_internal "$matches" "" "C" "" "$flags" "$pattern"
nul_match_internal "$matches_pcre2" "LIBPCRE2" "C" "-P" "$flags" "$pattern"
nul_match_internal "$matches_pcre2_locale" "LIBPCRE2,GETTEXT_LOCALE" "$is_IS_locale" "-P" "$flags" "$pattern"
}
test_expect_success 'setup' "
echo 'binaryQfileQm[*]cQ*æQð' | q_to_nul >a &&
git add a &&
git commit -m.
"
# Simple fixed-string matching that can use kwset (no -i && non-ASCII)
nul_match P P P '-F' 'yQf'
nul_match P P P '-F' 'yQx'
nul_match P P P '-Fi' 'YQf'
nul_match P P P '-Fi' 'YQx'
nul_match P P 1 '' 'yQf'
nul_match P P 0 '' 'yQx'
nul_match P P 1 '' 'æQð'
nul_match P P P '-F' 'eQm[*]c'
nul_match P P P '-Fi' 'EQM[*]C'
# Regex patterns that would match but shouldn't with -F
nul_match P P P '-F' 'yQ[f]'
nul_match P P P '-F' '[y]Qf'
nul_match P P P '-Fi' 'YQ[F]'
nul_match P P P '-Fi' '[Y]QF'
nul_match P P P '-F' 'æQ[ð]'
nul_match P P P '-F' '[æ]Qð'
# The -F kwset codepath can't handle -i && non-ASCII...
nul_match P 1 1 '-i' '[æ]Qð'
# ...PCRE v2 only matches non-ASCII with -i casefolding under UTF-8
# semantics
nul_match P P P '-Fi' 'ÆQ[Ð]'
nul_match P 0 1 '-i' 'ÆQ[Ð]'
nul_match P 0 1 '-i' '[Æ]QÐ'
nul_match P 0 1 '-i' '[Æ]Qð'
nul_match P 0 1 '-i' 'ÆQÐ'
# \0 in regexes can only work with -P & PCRE v2
nul_match P P 1 '' 'yQ[f]'
nul_match P P 1 '' '[y]Qf'
nul_match P P 1 '-i' 'YQ[F]'
nul_match P P 1 '-i' '[Y]Qf'
nul_match P P 1 '' 'æQ[ð]'
nul_match P P 1 '' '[æ]Qð'
nul_match P P 1 '-i' 'ÆQ[Ð]'
nul_match P P 1 '' 'eQm.*cQ'
nul_match P P 1 '-i' 'EQM.*cQ'
nul_match P P 0 '' 'eQm[*]c'
nul_match P P 0 '-i' 'EQM[*]C'
# Assert that we're using REG_STARTEND and the pattern doesn't match
# just because it's cut off at the first \0.
nul_match P P 0 '-i' 'NOMATCHQð'
nul_match P P 0 '-i' '[Æ]QNOMATCH'
nul_match P P 0 '-i' '[æ]QNOMATCH'
# Ensure that the matcher doesn't regress to something that stops at
# \0
nul_match P P P '-F' 'yQ[f]'
nul_match P P P '-Fi' 'YQ[F]'
nul_match P P 0 '' 'yQNOMATCH'
nul_match P P 0 '' 'QNOMATCH'
nul_match P P 0 '-i' 'YQNOMATCH'
nul_match P P 0 '-i' 'QNOMATCH'
nul_match P P P '-F' 'æQ[ð]'
nul_match P P P '-Fi' 'ÆQ[Ð]'
nul_match P P 1 '-i' 'ÆQ[Ð]'
nul_match P P 0 '' 'yQNÓMATCH'
nul_match P P 0 '' 'QNÓMATCH'
nul_match P P 0 '-i' 'YQNÓMATCH'
nul_match P P 0 '-i' 'QNÓMATCH'
test_done