[FYI] {micro} tests: make script 'shell-no-trail-bslash' simpler and more robust

Stefano Lattarini <[email protected]>
Newsgroups gmane.comp.sysutils.automake.patches
Message-ID <0fae5905f9b676725a7e82c7aa03e8e3cbf5008a.1419776894.git.stefano.lattarini@gmail.com>
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 <[email protected]>
---
 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 f785de8..3224958 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 14ee02c..1919889 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
 
 :
-- 
2.1.3
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.