summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefano Lattarini <stefano.lattarini@gmail.com>2014-12-28 14:02:30 +0100
committerStefano Lattarini <stefano.lattarini@gmail.com>2014-12-28 14:45:31 +0100
commit0fae5905f9b676725a7e82c7aa03e8e3cbf5008a (patch)
tree366da3df1af671cbc75e346add508a9d79e2625d
parentcd040965d51f9818c56a714efaaaa699eb93b503 (diff)
downloadautomake-0fae5905f9b676725a7e82c7aa03e8e3cbf5008a.tar.gz
tests: make script 'shell-no-trail-bslash' simpler and more robust
This solves spurious failure in the 'check-no-trailing-backslash-in-recipes' target for Automake-NG. This is basically a backport of Automake-NG commit v1.14.1-1010-g85aae58; the point is to minimize the amount of spurious diffs between the mainline Automake and the Automake-NG source trees. * t/ax/shell-no-trail-bslash.in: Simplify and fortify. * t/self-check-shell-no-trail-bslash.sh: Enhance. Signed-off-by: Stefano Lattarini <stefano.lattarini@gmail.com>
-rw-r--r--t/ax/shell-no-trail-bslash.in102
-rw-r--r--t/self-check-shell-no-trail-bslash.sh34
2 files changed, 83 insertions, 53 deletions
diff --git a/t/ax/shell-no-trail-bslash.in b/t/ax/shell-no-trail-bslash.in
index f785de8a8..322495824 100644
--- a/t/ax/shell-no-trail-bslash.in
+++ b/t/ax/shell-no-trail-bslash.in
@@ -1,5 +1,5 @@
#! @AM_TEST_RUNNER_SHELL@
-# Copyright (C) 2012-2013 Free Software Foundation, Inc.
+# Copyright (C) 2012-2014 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -14,63 +14,63 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# A "shell" that chokes on '-c' commands having a trailing '\' character
-# (possibly followed by whitespace only). This is to emulate problems
-# seen in older bash versions (e.g., bash 2.05b).
-# See also automake bug#10436.
+# A "shell" that chokes on '-c' commands and/or shell scripts having
+# a trailing '\' character (possibly followed by whitespace only).
+# This is to emulate problems seen in older bash versions (e.g., bash
+# 2.05b). See also automake bug#10436.
-set -e
set -u
am_SHELL=${AM_TESTSUITE_SHELL-'@SHELL@'}
-tab=' '
-nl='
+(
+ set -e
+ shell_command=; unset shell_command
+ while test $# -gt 0; do
+ case $1 in
+ # The shell might be invoked by make e.g. as "sh -ec" or "sh -ce".
+ # Be liberal (in the spirit of defensive programming) and accept
+ # both forms.
+ -*c*) shell_command=$2; shift;;
+ -?*) ;;
+ *) break;;
+ esac
+ shift
+ done
+
+ if test x${shell_command+"set"} != x"set"; then
+ if test $# -gt 0; then
+ shell_command=$(cat "$1")
+ else
+ # Some make implementations, like *BSD's, pass the recipes to the
+ # shell through its standard input. Trying to run our extra checks
+ # in this case would be too tricky, so we just skip them.
+ exit 0
+ fi
+ fi
+
+ tab=' '
+ nl='
'
-am_shell_flags=
-am_shell_command=; unset am_shell_command
-while test $# -gt 0; do
- case $1 in
- # If the shell is invoked by make e.g. as "sh -ec" (seen on
- # GNU make in POSIX mode) or "sh -ce" (seen on Solaris make).
- -*c*)
- am_flg=$(printf '%s\n' "$1" | sed -e 's/^-//' -e 's/c//g')
- if test x"$am_flg" != x; then
- am_shell_flags="$am_shell_flags -$am_flg"
- fi
- am_shell_command=$2
- shift;;
- -?*)
- am_shell_flags="$am_shell_flags $1";;
- *)
- break;;
+ case "$shell_command" in
+ *" "|*"$tab"|*"$nl")
+ shell_command=$(printf '%s\n' "$shell_command" | tr -d " $tab$nl");;
esac
- shift
-done
-
-if test x${am_shell_command+"set"} != x"set"; then
- # Some make implementations, like *BSD's, pass the recipes to the shell
- # through its standard input. Trying to run our extra checks in this
- # case would be too tricky, so we just skip them.
- exec $am_SHELL $am_shell_flags ${1+"$@"}
-fi
-case $am_shell_command in
- *" "|*"$tab"|*"$nl")
- am_tweaked_shell_command=$(printf '%s\n' "$am_shell_command" \
- | tr -d " $tab$nl");;
- *)
- am_tweaked_shell_command=$am_shell_command;;
-esac
+ case "$shell_command" in
+ *\\)
+ printf '%s\n' "$0: recipe/script ends with backslash character" >&2
+ printf '%s\n' "=== BEGIN recipe/script" >&2
+ printf '%s\n' "${am_shell_command-}" >&2
+ printf '%s\n' "=== END recipe/script" >&2
+ exit 1
+ ;;
+ esac
+)
-case $am_tweaked_shell_command in
- *\\)
- printf '%s\n' "$0: recipe ends with backslash character" >&2
- printf '%s\n' "=== BEGIN recipe" >&2
- printf '%s\n' "${am_shell_command-}" >&2
- printf '%s\n' "=== END recipe" >&2
- exit 1
- ;;
-esac
+if test $? -gt 0; then
+ # Some of our scripts or makefile recipes had invalid contents.
+ exit 3
+fi
-exec $am_SHELL $am_shell_flags -c "$am_shell_command" ${1+"$@"}
+exec ${AM_TESTSUITE_SHELL-'@SHELL@'} ${1+"$@"}
diff --git a/t/self-check-shell-no-trail-bslash.sh b/t/self-check-shell-no-trail-bslash.sh
index 14ee02cdf..19198898b 100644
--- a/t/self-check-shell-no-trail-bslash.sh
+++ b/t/self-check-shell-no-trail-bslash.sh
@@ -1,5 +1,5 @@
#! /bin/sh
-# Copyright (C) 2012-2013 Free Software Foundation, Inc.
+# Copyright (C) 2012-2014 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -34,12 +34,42 @@ bad:
END
SHELL=$am_testaux_builddir/shell-no-trail-bslash
+
$SHELL -c 'exit 0'
test "$($SHELL -c 'echo is o\k')" = "is ok"
+echo 'echo is ok\"' > ok.sh
+$SHELL ./ok.sh
+test "$($SHELL ./ok.sh)" = "is ok\""
+
+tab=' '
+nl='
+'
+for sfx in \
+ '\' \
+ '\\' \
+ '\\\\\' \
+ '\ ' \
+ "\\$tab" \
+ "\\ $tab$tab " \
+ "\\$nl" \
+ "\\ $nl " \
+ "\\$nl$nl$nl" \
+; do
+ for pfx in "" "echo bad" ": a${nl}# multine${nl}: text"; do
+ cmd=${pfx}${sfx}
+ printf '%s\n' "$cmd" > bad.sh
+ for args in '-c "$cmd"' './bad.sh'; do
+ eval "\$SHELL $args 2>stderr && { cat stderr >&2; exit 1; }; :"
+ cat stderr >&2
+ $FGREP "recipe/script ends with backslash character" stderr
+ done
+ done
+done
+
$MAKE good
run_make -E -e FAIL bad SHELL="$SHELL"
-$FGREP "recipe ends with backslash character" stderr
+$FGREP "recipe/script ends with backslash character" stderr
: