From 0fae5905f9b676725a7e82c7aa03e8e3cbf5008a Mon Sep 17 00:00:00 2001 From: Stefano Lattarini Date: Sun, 28 Dec 2014 14:02:30 +0100 Subject: 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 --- t/ax/shell-no-trail-bslash.in | 102 +++++++++++++++++----------------- t/self-check-shell-no-trail-bslash.sh | 34 +++++++++++- 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 . -# 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 : -- cgit v1.2.3