]> git.ipfire.org Git - thirdparty/git.git/commitdiff
chainlint.pl: don't flag broken &&-chain if failure indicated explicitly
authorEric Sunshine <sunshine@sunshineco.com>
Thu, 1 Sep 2022 00:29:49 +0000 (00:29 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 1 Sep 2022 17:07:41 +0000 (10:07 -0700)
There are quite a few tests which print an error messages and then
explicitly signal failure with `false`, `return 1`, or `exit 1` as the
final command in an `if` branch. In these cases, the tests don't bother
maintaining the &&-chain between `echo` and the explicit "test failed"
indicator. Since such constructs are manually signaling failure, their
&&-chain breakage is legitimate and safe -- both for the command
immediately preceding `false`, `return`, or `exit`, as well as for all
preceding commands in the `if` branch. Therefore, stop flagging &&-chain
breakage in these sorts of cases.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/chainlint.pl
t/chainlint/chain-break-false.expect [new file with mode: 0644]
t/chainlint/chain-break-false.test [new file with mode: 0644]
t/chainlint/chain-break-return-exit.expect
t/chainlint/chain-break-return-exit.test
t/chainlint/if-in-loop.expect
t/chainlint/if-in-loop.test

index 14e1db3519a2d55d966412934102795d50e6e06b..a76a09ecf5e2945b6e10ca42851245a6d91fcd5a 100755 (executable)
@@ -503,6 +503,14 @@ sub accumulate {
                goto DONE if $token =~ /\$\?/;
        }
 
+       # if this command is "false", "return 1", or "exit 1" (which signal
+       # failure explicitly), then okay for all preceding commands to be
+       # missing "&&"
+       if ($$cmd[0] =~ /^(?:false|return|exit)$/) {
+               @$tokens = grep(!/^\?!AMP\?!$/, @$tokens);
+               goto DONE;
+       }
+
        # flag missing "&&" at end of previous command
        my $n = find_non_nl($tokens);
        splice(@$tokens, $n + 1, 0, '?!AMP?!') unless $n < 0;
diff --git a/t/chainlint/chain-break-false.expect b/t/chainlint/chain-break-false.expect
new file mode 100644 (file)
index 0000000..989766f
--- /dev/null
@@ -0,0 +1,9 @@
+if condition not satisified
+then
+       echo it did not work...
+       echo failed!
+       false
+else
+       echo it went okay ?!AMP?!
+       congratulate user
+fi
diff --git a/t/chainlint/chain-break-false.test b/t/chainlint/chain-break-false.test
new file mode 100644 (file)
index 0000000..a5aaff8
--- /dev/null
@@ -0,0 +1,10 @@
+# LINT: broken &&-chain okay if explicit "false" signals failure
+if condition not satisified
+then
+       echo it did not work...
+       echo failed!
+       false
+else
+       echo it went okay
+       congratulate user
+fi
index dba292ee89b69597c1cea2d7191fa8cf579f8729..1732d221c32e98bf40438167769869cb597ed4a1 100644 (file)
@@ -1,3 +1,18 @@
+case "$(git ls-files)" in
+one ) echo pass one ;;
+* ) echo bad one ; return 1 ;;
+esac &&
+(
+       case "$(git ls-files)" in
+       two ) echo pass two ;;
+       * ) echo bad two ; exit 1 ;;
+esac
+) &&
+case "$(git ls-files)" in
+dir/two"$LF"one ) echo pass both ;;
+* ) echo bad ; return 1 ;;
+esac &&
+
 for i in 1 2 3 4 ; do
        git checkout main -b $i || return $?
        test_commit $i $i $i tag$i || return $?
index e2b059933aa6834e66759d635a93d8129cb74563..46542edf8819166e56cfa46feae37b64f4747c5b 100644 (file)
@@ -1,3 +1,21 @@
+case "$(git ls-files)" in
+one) echo pass one ;;
+# LINT: broken &&-chain okay if explicit "return 1" signals failuire
+*) echo bad one; return 1 ;;
+esac &&
+(
+       case "$(git ls-files)" in
+       two) echo pass two ;;
+# LINT: broken &&-chain okay if explicit "exit 1" signals failuire
+       *) echo bad two; exit 1 ;;
+       esac
+) &&
+case "$(git ls-files)" in
+dir/two"$LF"one) echo pass both ;;
+# LINT: broken &&-chain okay if explicit "return 1" signals failuire
+*) echo bad; return 1 ;;
+esac &&
+
 for i in 1 2 3 4 ; do
 # LINT: broken &&-chain okay if explicit "return $?" signals failure
        git checkout main -b $i || return $?
index 03b82a3e58c21e1300befb317f19c7f063fba3ec..d6514ae74927ff4336279112d5570499a71d6b53 100644 (file)
@@ -3,7 +3,7 @@
        do
                if false
                then
-                       echo "err" ?!AMP?!
+                       echo "err"
                        exit 1
                fi ?!AMP?!
                foo
index f0cf19cfadac8c1ae9d09a668bafc99517c50cdf..90c23976feccdd3f3851a39cf7b12cb5f643f628 100644 (file)
@@ -3,7 +3,7 @@
        do
                if false
                then
-# LINT: missing "&&" on "echo"
+# LINT: missing "&&" on "echo" okay since "exit 1" signals error explicitly
                        echo "err"
                        exit 1
 # LINT: missing "&&" on "fi"