chainlint.pl: don't flag broken &&-chain if failure indicated explicitly

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>
This commit is contained in:
Eric Sunshine
2022-09-01 00:29:49 +00:00
committed by Junio C Hamano
parent a8f30ee050
commit 832c68b3c2
7 changed files with 62 additions and 2 deletions

View File

@ -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

View File

@ -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

View 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 $?

View 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 $?

View File

@ -3,7 +3,7 @@
do
if false
then
echo "err" ?!AMP?!
echo "err"
exit 1
fi ?!AMP?!
foo

View 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"