4
5
. ./test-lib.sh
6
7
-nul_match () {
8
- matches=$1
9
- flags=$2
10
- pattern=$3
11
- pattern_human=$(echo "$pattern" | sed 's/Q/<NUL>/g')
12
-
13
- if test "$matches" = 1
14
- then
15
- test_expect_success "git grep -f f $flags '$pattern_human' a" "
16
- printf '$pattern' | q_to_nul >f &&
17
- git grep -f f $flags a
18
- "
19
- elif test "$matches" = 0
20
- then
21
- test_expect_success "git grep -f f $flags '$pattern_human' a" "
22
- printf '$pattern' | q_to_nul >f &&
23
- test_must_fail git grep -f f $flags a
24
- "
25
- elif test "$matches" = T1
26
- then
27
- test_expect_failure "git grep -f f $flags '$pattern_human' a" "
28
- printf '$pattern' | q_to_nul >f &&
29
- git grep -f f $flags a
30
- "
31
- elif test "$matches" = T0
32
- then
33
- test_expect_failure "git grep -f f $flags '$pattern_human' a" "
34
- printf '$pattern' | q_to_nul >f &&
35
- test_must_fail git grep -f f $flags a
36
- "
37
- else
38
- test_expect_success "PANIC: Test framework error. Unknown matches value $matches" 'false'
39
- fi
40
-}
41
-
7
test_expect_success 'setup' "
8
echo 'binaryQfileQm[*]cQ*æQð' | q_to_nul >a &&
9
git add a &&
67
git grep .fi a
68
'
69
105
-nul_match 1 '-F' 'yQf'
106
-nul_match 0 '-F' 'yQx'
107
-nul_match 1 '-Fi' 'YQf'
108
-nul_match 0 '-Fi' 'YQx'
109
-nul_match 1 '' 'yQf'
110
-nul_match 0 '' 'yQx'
111
-nul_match 1 '' 'æQð'
112
-nul_match 1 '-F' 'eQm[*]c'
113
-nul_match 1 '-Fi' 'EQM[*]C'
114
-
115
-# Regex patterns that would match but shouldn't with -F
116
-nul_match 0 '-F' 'yQ[f]'
117
-nul_match 0 '-F' '[y]Qf'
118
-nul_match 0 '-Fi' 'YQ[F]'
119
-nul_match 0 '-Fi' '[Y]QF'
120
-nul_match 0 '-F' 'æQ[ð]'
121
-nul_match 0 '-F' '[æ]Qð'
122
-nul_match 0 '-Fi' 'ÆQ[Ð]'
123
-nul_match 0 '-Fi' '[Æ]QÐ'
124
-
125
-# kwset is disabled on -i & non-ASCII. No way to match non-ASCII \0
126
-# patterns case-insensitively.
127
-nul_match T1 '-i' 'ÆQÐ'
128
-
129
-# \0 implicitly disables regexes. This is an undocumented internal
130
-# limitation.
131
-nul_match T1 '' 'yQ[f]'
132
-nul_match T1 '' '[y]Qf'
133
-nul_match T1 '-i' 'YQ[F]'
134
-nul_match T1 '-i' '[Y]Qf'
135
-nul_match T1 '' 'æQ[ð]'
136
-nul_match T1 '' '[æ]Qð'
137
-nul_match T1 '-i' 'ÆQ[Ð]'
138
-
139
-# ... because of \0 implicitly disabling regexes regexes that
140
-# should/shouldn't match don't do the right thing.
141
-nul_match T1 '' 'eQm.*cQ'
142
-nul_match T1 '-i' 'EQM.*cQ'
143
-nul_match T0 '' 'eQm[*]c'
144
-nul_match T0 '-i' 'EQM[*]C'
145
-
146
-# Due to the REG_STARTEND extension when kwset() is disabled on -i &
147
-# non-ASCII the string will be matched in its entirety, but the
148
-# pattern will be cut off at the first \0.
149
-nul_match 0 '-i' 'NOMATCHQð'
150
-nul_match T0 '-i' '[Æ]QNOMATCH'
151
-nul_match T0 '-i' '[æ]QNOMATCH'
152
-# Matches, but for the wrong reasons, just stops at [æ]
153
-nul_match 1 '-i' '[Æ]Qð'
154
-nul_match 1 '-i' '[æ]Qð'
155
-
156
-# Ensure that the matcher doesn't regress to something that stops at
157
-# \0
158
-nul_match 0 '-F' 'yQ[f]'
159
-nul_match 0 '-Fi' 'YQ[F]'
160
-nul_match 0 '' 'yQNOMATCH'
161
-nul_match 0 '' 'QNOMATCH'
162
-nul_match 0 '-i' 'YQNOMATCH'
163
-nul_match 0 '-i' 'QNOMATCH'
164
-nul_match 0 '-F' 'æQ[ð]'
165
-nul_match 0 '-Fi' 'ÆQ[Ð]'
166
-nul_match 0 '' 'yQNÓMATCH'
167
-nul_match 0 '' 'QNÓMATCH'
168
-nul_match 0 '-i' 'YQNÓMATCH'
169
-nul_match 0 '-i' 'QNÓMATCH'
170
-
70
test_expect_success 'grep respects binary diff attribute' '
71
echo text >t &&
72
git add t &&