summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Eric Sunshine <sunshine@sunshineco.com>2021-12-13 01:30:58 -0500
committerLibravatar Junio C Hamano <gitster@pobox.com>2021-12-13 14:15:29 -0800
commit31da22d1fd46e80c592f6b04c6cafdb983c8a903 (patch)
tree962057bfa9769dc73138cb78e378affc2e33aa18
parentchainlint.sed: stop throwing away here-doc tags (diff)
downloadtgif-31da22d1fd46e80c592f6b04c6cafdb983c8a903.tar.xz
chainlint.sed: swallow comments consistently
When checking for broken a &&-chain, chainlint.sed knows that the final statement in a subshell should not end with `&&`, so it takes care to make a distinction between the final line which is an actual statement and any lines which may be mere comments preceding the closing ')'. As such, it swallows comment lines so that they do not interfere with the &&-chain check. However, since `sed` does not provide any sort of real recursion, chainlint.sed only checks &&-chains in subshells one level deep; it doesn't do any checking in deeper subshells or in `{...}` blocks within subshells. Furthermore, on account of potential implementation complexity, it doesn't check &&-chains within `case` arms. Due to an oversight, it also doesn't swallow comments inside deep subshells, `{...}` blocks, or `case` statements, which makes its output inconsistent (swallowing comments in some cases but not others). Unfortunately, this inconsistency seeps into the chainlint self-test "expect" files, which potentially makes it difficult to reuse the self-tests should a more capable chainlint ever be developed. Therefore, teach chainlint.sed to consistently swallow comments in all cases. Signed-off-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--t/chainlint.sed21
-rw-r--r--t/chainlint/block-comment.expect6
-rw-r--r--t/chainlint/block-comment.test8
-rw-r--r--t/chainlint/case-comment.expect8
-rw-r--r--t/chainlint/case-comment.test11
-rw-r--r--t/chainlint/nested-subshell-comment.expect2
6 files changed, 52 insertions, 4 deletions
diff --git a/t/chainlint.sed b/t/chainlint.sed
index 0e575c0c62..b1505ef2cd 100644
--- a/t/chainlint.sed
+++ b/t/chainlint.sed
@@ -294,6 +294,12 @@ bfolded
x
s/?!HERE?!/<</g
n
+:cascom
+/^[ ]*#/{
+ N
+ s/.*\n//
+ bcascom
+}
/^[ ]*esac/bslurp
bcase
@@ -322,10 +328,15 @@ x
:nstslrp
s/?!HERE?!/<</g
n
+:nstcom
+# comment -- not closing ")" if in comment
+/^[ ]*#/{
+ N
+ s/.*\n//
+ bnstcom
+}
# closing ")" on own line -- stop nested slurp
/^[ ]*)/bnstcl
-# comment -- not closing ")" if in comment
-/^[ ]*#/bnstcnt
# "$((...))" -- arithmetic expansion; not closing ")"
/\$(([^)][^)]*))[^)]*$/bnstcnt
# "$(...)" -- command substitution; not closing ")"
@@ -345,6 +356,12 @@ bchkchn
x
s/?!HERE?!/<</g
n
+:blkcom
+/^[ ]*#/{
+ N
+ s/.*\n//
+ bblkcom
+}
# closing "}" -- stop block slurp
/}/bchkchn
bblock
diff --git a/t/chainlint/block-comment.expect b/t/chainlint/block-comment.expect
new file mode 100644
index 0000000000..d10b2eeaf2
--- /dev/null
+++ b/t/chainlint/block-comment.expect
@@ -0,0 +1,6 @@
+(
+ {
+ echo a &&
+ echo b
+ }
+)
diff --git a/t/chainlint/block-comment.test b/t/chainlint/block-comment.test
new file mode 100644
index 0000000000..df2beea888
--- /dev/null
+++ b/t/chainlint/block-comment.test
@@ -0,0 +1,8 @@
+(
+ {
+ # show a
+ echo a &&
+ # show b
+ echo b
+ }
+)
diff --git a/t/chainlint/case-comment.expect b/t/chainlint/case-comment.expect
new file mode 100644
index 0000000000..1e4b054bda
--- /dev/null
+++ b/t/chainlint/case-comment.expect
@@ -0,0 +1,8 @@
+(
+ case "$x" in
+ x) foo ;;
+ *)
+ bar
+ ;;
+ esac
+)
diff --git a/t/chainlint/case-comment.test b/t/chainlint/case-comment.test
new file mode 100644
index 0000000000..641c157b98
--- /dev/null
+++ b/t/chainlint/case-comment.test
@@ -0,0 +1,11 @@
+(
+ case "$x" in
+ # found foo
+ x) foo ;;
+ # found other
+ *)
+ # treat it as bar
+ bar
+ ;;
+ esac
+)
diff --git a/t/chainlint/nested-subshell-comment.expect b/t/chainlint/nested-subshell-comment.expect
index 9138cf386d..be4b27a305 100644
--- a/t/chainlint/nested-subshell-comment.expect
+++ b/t/chainlint/nested-subshell-comment.expect
@@ -2,8 +2,6 @@
foo &&
(
bar &&
- # bottles wobble while fiddles gobble
- # minor numbers of cows (or do they?)
baz &&
snaff
) ?!AMP?!