t: retire unused chainlint.sed

Retire chainlint.sed since it has been replaced by a more accurate and functional &&-chain "linter", thus is no longer used. Signed-off-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Eric Sunshine committed Sep 1, 2022 at 00:29 UTC fb41727b7ed7f62d121cd846f826fb1c62d1bc6a
1 file changed -399
t/chainlint.sed deleted
-399
@@ -1,399 +0,0 @@
1 -#------------------------------------------------------------------------------
2 -# Detect broken &&-chains in tests.
3 -#
4 -# At present, only &&-chains in subshells are examined by this linter;
5 -# top-level &&-chains are instead checked directly by the test framework. Like
6 -# the top-level &&-chain linter, the subshell linter (intentionally) does not
7 -# check &&-chains within {...} blocks.
8 -#
9 -# Checking for &&-chain breakage is done line-by-line by pure textual
10 -# inspection.
11 -#
12 -# Incomplete lines (those ending with "\") are stitched together with following
13 -# lines to simplify processing, particularly of "one-liner" statements.
14 -# Top-level here-docs are swallowed to avoid false positives within the
15 -# here-doc body, although the statement to which the here-doc is attached is
16 -# retained.
17 -#
18 -# Heuristics are used to detect end-of-subshell when the closing ")" is cuddled
19 -# with the final subshell statement on the same line:
20 -#
21 -# (cd foo &&
22 -# bar)
23 -#
24 -# in order to avoid misinterpreting the ")" in constructs such as "x=$(...)"
25 -# and "case $x in *)" as ending the subshell.
26 -#
27 -# Lines missing a final "&&" are flagged with "?!AMP?!", as are lines which
28 -# chain commands with ";" internally rather than "&&". A line may be flagged
29 -# for both violations.
30 -#
31 -# Detection of a missing &&-link in a multi-line subshell is complicated by the
32 -# fact that the last statement before the closing ")" must not end with "&&".
33 -# Since processing is line-by-line, it is not known whether a missing "&&" is
34 -# legitimate or not until the _next_ line is seen. To accommodate this, within
35 -# multi-line subshells, each line is stored in sed's "hold" area until after
36 -# the next line is seen and processed. If the next line is a stand-alone ")",
37 -# then a missing "&&" on the previous line is legitimate; otherwise a missing
38 -# "&&" is a break in the &&-chain.
39 -#
40 -# (
41 -# cd foo &&
42 -# bar
43 -# )
44 -#
45 -# In practical terms, when "bar" is encountered, it is flagged with "?!AMP?!",
46 -# but when the stand-alone ")" line is seen which closes the subshell, the
47 -# "?!AMP?!" violation is removed from the "bar" line (retrieved from the "hold"
48 -# area) since the final statement of a subshell must not end with "&&". The
49 -# final line of a subshell may still break the &&-chain by using ";" internally
50 -# to chain commands together rather than "&&", but an internal "?!AMP?!" is
51 -# never removed from a line even though a line-ending "?!AMP?!" might be.
52 -#
53 -# Care is taken to recognize the last _statement_ of a multi-line subshell, not
54 -# necessarily the last textual _line_ within the subshell, since &&-chaining
55 -# applies to statements, not to lines. Consequently, blank lines, comment
56 -# lines, and here-docs are swallowed (but not the command to which the here-doc
57 -# is attached), leaving the last statement in the "hold" area, not the last
58 -# line, thus simplifying &&-link checking.
59 -#
60 -# The final statement before "done" in for- and while-loops, and before "elif",
61 -# "else", and "fi" in if-then-else likewise must not end with "&&", thus
62 -# receives similar treatment.
63 -#
64 -# Swallowing here-docs with arbitrary tags requires a bit of finesse. When a
65 -# line such as "cat <<EOF" is seen, the here-doc tag is copied to the front of
66 -# the line enclosed in angle brackets as a sentinel, giving "<EOF>cat <<EOF".
67 -# As each subsequent line is read, it is appended to the target line and a
68 -# (whitespace-loose) back-reference match /^<(.*)>\n\1$/ is attempted to see if
69 -# the content inside "<...>" matches the entirety of the newly-read line. For
70 -# instance, if the next line read is "some data", when concatenated with the
71 -# target line, it becomes "<EOF>cat <<EOF\nsome data", and a match is attempted
72 -# to see if "EOF" matches "some data". Since it doesn't, the next line is
73 -# attempted. When a line consisting of only "EOF" (and possible whitespace) is
74 -# encountered, it is appended to the target line giving "<EOF>cat <<EOF\nEOF",
75 -# in which case the "EOF" inside "<...>" does match the text following the
76 -# newline, thus the closing here-doc tag has been found. The closing tag line
77 -# and the "<...>" prefix on the target line are then discarded, leaving just
78 -# the target line "cat <<EOF".
79 -#------------------------------------------------------------------------------
80 -
81 -# incomplete line -- slurp up next line
82 -:squash
83 -/\\$/ {
84 - N
85 - s/\\\n//
86 - bsquash
87 -}
88 -
89 -# here-doc -- swallow it to avoid false hits within its body (but keep the
90 -# command to which it was attached)
91 -/<<-*[ ]*[\\'"]*[A-Za-z0-9_]/ {
92 - /"[^"]*<<[^"]*"/bnotdoc
93 - s/^\(.*<<-*[ ]*\)[\\'"]*\([A-Za-z0-9_][A-Za-z0-9_]*\)['"]*/<\2>\1\2/
94 - :hered
95 - N
96 - /^<\([^>]*\)>.*\n[ ]*\1[ ]*$/!{
97 - s/\n.*$//
98 - bhered
99 - }
100 - s/^<[^>]*>//
101 - s/\n.*$//
102 -}
103 -:notdoc
104 -
105 -# one-liner "(...) &&"
106 -/^[ ]*!*[ ]*(..*)[ ]*&&[ ]*$/boneline
107 -
108 -# same as above but without trailing "&&"
109 -/^[ ]*!*[ ]*(..*)[ ]*$/boneline
110 -
111 -# one-liner "(...) >x" (or "2>x" or "<x" or "|x" or "&"
112 -/^[ ]*!*[ ]*(..*)[ ]*[0-9]*[<>|&]/boneline
113 -
114 -# multi-line "(...\n...)"
115 -/^[ ]*(/bsubsh
116 -
117 -# innocuous line -- print it and advance to next line
118 -b
119 -
120 -# found one-liner "(...)" -- mark suspect if it uses ";" internally rather than
121 -# "&&" (but not ";" in a string)
122 -:oneline
123 -/;/{
124 - /"[^"]*;[^"]*"/!s/;/; ?!AMP?!/
125 -}
126 -b
127 -
128 -:subsh
129 -# bare "(" line? -- stash for later printing
130 -/^[ ]*([ ]*$/ {
131 - h
132 - bnextln
133 -}
134 -# "(..." line -- "(" opening subshell cuddled with command; temporarily replace
135 -# "(" with sentinel "^" and process the line as if "(" had been seen solo on
136 -# the preceding line; this temporary replacement prevents several rules from
137 -# accidentally thinking "(" introduces a nested subshell; "^" is changed back
138 -# to "(" at output time
139 -x
140 -s/.*//
141 -x
142 -s/(/^/
143 -bslurp
144 -
145 -:nextln
146 -N
147 -s/.*\n//
148 -
149 -:slurp
150 -# incomplete line "...\"
151 -/\\$/bicmplte
152 -# multi-line quoted string "...\n..."?
153 -/"/bdqstr
154 -# multi-line quoted string '...\n...'? (but not contraction in string "it's")
155 -/'/{
156 - /"[^'"]*'[^'"]*"/!bsqstr
157 -}
158 -:folded
159 -# here-doc -- swallow it (but not "<<" in a string)
160 -/<<-*[ ]*[\\'"]*[A-Za-z0-9_]/{
161 - /"[^"]*<<[^"]*"/!bheredoc
162 -}
163 -# comment or empty line -- discard since final non-comment, non-empty line
164 -# before closing ")", "done", "elsif", "else", or "fi" will need to be
165 -# re-visited to drop "suspect" marking since final line of those constructs
166 -# legitimately lacks "&&", so "suspect" mark must be removed
167 -/^[ ]*#/bnextln
168 -/^[ ]*$/bnextln
169 -# in-line comment -- strip it (but not "#" in a string, Bash ${#...} array
170 -# length, or Perforce "//depot/path#42" revision in filespec)
171 -/[ ]#/{
172 - /"[^"]*#[^"]*"/!s/[ ]#.*$//
173 -}
174 -# one-liner "case ... esac"
175 -/^[ ^]*case[ ]*..*esac/bchkchn
176 -# multi-line "case ... esac"
177 -/^[ ^]*case[ ]..*[ ]in/bcase
178 -# multi-line "for ... done" or "while ... done"
179 -/^[ ^]*for[ ]..*[ ]in/bcont
180 -/^[ ^]*while[ ]/bcont
181 -/^[ ]*do[ ]/bcont
182 -/^[ ]*do[ ]*$/bcont
183 -/;[ ]*do/bcont
184 -/^[ ]*done[ ]*&&[ ]*$/bdone
185 -/^[ ]*done[ ]*$/bdone
186 -/^[ ]*done[ ]*[<>|]/bdone
187 -/^[ ]*done[ ]*)/bdone
188 -/||[ ]*exit[ ]/bcont
189 -/||[ ]*exit[ ]*$/bcont
190 -# multi-line "if...elsif...else...fi"
191 -/^[ ^]*if[ ]/bcont
192 -/^[ ]*then[ ]/bcont
193 -/^[ ]*then[ ]*$/bcont
194 -/;[ ]*then/bcont
195 -/^[ ]*elif[ ]/belse
196 -/^[ ]*elif[ ]*$/belse
197 -/^[ ]*else[ ]/belse
198 -/^[ ]*else[ ]*$/belse
199 -/^[ ]*fi[ ]*&&[ ]*$/bdone
200 -/^[ ]*fi[ ]*$/bdone
201 -/^[ ]*fi[ ]*[<>|]/bdone
202 -/^[ ]*fi[ ]*)/bdone
203 -# nested one-liner "(...) &&"
204 -/^[ ^]*(.*)[ ]*&&[ ]*$/bchkchn
205 -# nested one-liner "(...)"
206 -/^[ ^]*(.*)[ ]*$/bchkchn
207 -# nested one-liner "(...) >x" (or "2>x" or "<x" or "|x")
208 -/^[ ^]*(.*)[ ]*[0-9]*[<>|]/bchkchn
209 -# nested multi-line "(...\n...)"
210 -/^[ ^]*(/bnest
211 -# multi-line "{...\n...}"
212 -/^[ ^]*{/bblock
213 -# closing ")" on own line -- exit subshell
214 -/^[ ]*)/bclssolo
215 -# "$((...))" -- arithmetic expansion; not closing ")"
216 -/\$(([^)][^)]*))[^)]*$/bchkchn
217 -# "$(...)" -- command substitution; not closing ")"
218 -/\$([^)][^)]*)[^)]*$/bchkchn
219 -# multi-line "$(...\n...)" -- command substitution; treat as nested subshell
220 -/\$([^)]*$/bnest
221 -# "=(...)" -- Bash array assignment; not closing ")"
222 -/=(/bchkchn
223 -# closing "...) &&"
224 -/)[ ]*&&[ ]*$/bclose
225 -# closing "...)"
226 -/)[ ]*$/bclose
227 -# closing "...) >x" (or "2>x" or "<x" or "|x")
228 -/)[ ]*[<>|]/bclose
229 -:chkchn
230 -# mark suspect if line uses ";" internally rather than "&&" (but not ";" in a
231 -# string and not ";;" in one-liner "case...esac")
232 -/;/{
233 - /;;/!{
234 - /"[^"]*;[^"]*"/!s/;/; ?!AMP?!/
235 - }
236 -}
237 -# line ends with pipe "...|" -- valid; not missing "&&"
238 -/|[ ]*$/bcont
239 -# missing end-of-line "&&" -- mark suspect
240 -/&&[ ]*$/!s/$/ ?!AMP?!/
241 -:cont
242 -# retrieve and print previous line
243 -x
244 -s/^\([ ]*\)^/\1(/
245 -s/?!HERE?!/<</g
246 -n
247 -bslurp
248 -
249 -# found incomplete line "...\" -- slurp up next line
250 -:icmplte
251 -N
252 -s/\\\n//
253 -bslurp
254 -
255 -# check for multi-line double-quoted string "...\n..." -- fold to one line
256 -:dqstr
257 -# remove all quote pairs
258 -s/"\([^"]*\)"/@!\1@!/g
259 -# done if no dangling quote
260 -/"/!bdqdone
261 -# otherwise, slurp next line and try again
262 -N
263 -s/\n//
264 -bdqstr
265 -:dqdone
266 -s/@!/"/g
267 -bfolded
268 -
269 -# check for multi-line single-quoted string '...\n...' -- fold to one line
270 -:sqstr
271 -# remove all quote pairs
272 -s/'\([^']*\)'/@!\1@!/g
273 -# done if no dangling quote
274 -/'/!bsqdone
275 -# otherwise, slurp next line and try again
276 -N
277 -s/\n//
278 -bsqstr
279 -:sqdone
280 -s/@!/'/g
281 -bfolded
282 -
283 -# found here-doc -- swallow it to avoid false hits within its body (but keep
284 -# the command to which it was attached)
285 -:heredoc
286 -s/^\(.*\)<<\(-*[ ]*\)[\\'"]*\([A-Za-z0-9_][A-Za-z0-9_]*\)['"]*/<\3>\1?!HERE?!\2\3/
287 -:hdocsub
288 -N
289 -/^<\([^>]*\)>.*\n[ ]*\1[ ]*$/!{
290 - s/\n.*$//
291 - bhdocsub
292 -}
293 -s/^<[^>]*>//
294 -s/\n.*$//
295 -bfolded
296 -
297 -# found "case ... in" -- pass through untouched
298 -:case
299 -x
300 -s/^\([ ]*\)^/\1(/
301 -s/?!HERE?!/<</g
302 -n
303 -:cascom
304 -/^[ ]*#/{
305 - N
306 - s/.*\n//
307 - bcascom
308 -}
309 -/^[ ]*esac/bslurp
310 -bcase
311 -
312 -# found "else" or "elif" -- drop "suspect" from final line before "else" since
313 -# that line legitimately lacks "&&"
314 -:else
315 -x
316 -s/\( ?!AMP?!\)* ?!AMP?!$//
317 -x
318 -bcont
319 -
320 -# found "done" closing for-loop or while-loop, or "fi" closing if-then -- drop
321 -# "suspect" from final contained line since that line legitimately lacks "&&"
322 -:done
323 -x
324 -s/\( ?!AMP?!\)* ?!AMP?!$//
325 -x
326 -# is 'done' or 'fi' cuddled with ")" to close subshell?
327 -/done.*)/bclose
328 -/fi.*)/bclose
329 -bchkchn
330 -
331 -# found nested multi-line "(...\n...)" -- pass through untouched
332 -:nest
333 -x
334 -:nstslrp
335 -s/^\([ ]*\)^/\1(/
336 -s/?!HERE?!/<</g
337 -n
338 -:nstcom
339 -# comment -- not closing ")" if in comment
340 -/^[ ]*#/{
341 - N
342 - s/.*\n//
343 - bnstcom
344 -}
345 -# closing ")" on own line -- stop nested slurp
346 -/^[ ]*)/bnstcl
347 -# "$((...))" -- arithmetic expansion; not closing ")"
348 -/\$(([^)][^)]*))[^)]*$/bnstcnt
349 -# "$(...)" -- command substitution; not closing ")"
350 -/\$([^)][^)]*)[^)]*$/bnstcnt
351 -# closing "...)" -- stop nested slurp
352 -/)/bnstcl
353 -:nstcnt
354 -x
355 -bnstslrp
356 -:nstcl
357 -# is it "))" which closes nested and parent subshells?
358 -/)[ ]*)/bslurp
359 -bchkchn
360 -
361 -# found multi-line "{...\n...}" block -- pass through untouched
362 -:block
363 -x
364 -s/^\([ ]*\)^/\1(/
365 -s/?!HERE?!/<</g
366 -n
367 -:blkcom
368 -/^[ ]*#/{
369 - N
370 - s/.*\n//
371 - bblkcom
372 -}
373 -# closing "}" -- stop block slurp
374 -/}/bchkchn
375 -bblock
376 -
377 -# found closing ")" on own line -- drop "suspect" from final line of subshell
378 -# since that line legitimately lacks "&&" and exit subshell loop
379 -:clssolo
380 -x
381 -s/\( ?!AMP?!\)* ?!AMP?!$//
382 -s/^\([ ]*\)^/\1(/
383 -s/?!HERE?!/<</g
384 -p
385 -x
386 -s/^\([ ]*\)^/\1(/
387 -s/?!HERE?!/<</g
388 -b
389 -
390 -# found closing "...)" -- exit subshell loop
391 -:close
392 -x
393 -s/^\([ ]*\)^/\1(/
394 -s/?!HERE?!/<</g
395 -p
396 -x
397 -s/^\([ ]*\)^/\1(/
398 -s/?!HERE?!/<</g
399 -b