init.sh: avoid Solaris 10 /bin/sh portability problem
authorJim Meyering <meyering@redhat.com>
Tue, 8 Dec 2009 19:37:50 +0000 (20:37 +0100)
committerJim Meyering <meyering@redhat.com>
Tue, 8 Dec 2009 20:13:46 +0000 (21:13 +0100)
Solaris 10's /bin/sh does not pass '.' arguments 2..N to the
sourced script:
  $ printf 'echo "$@"\n' > f; /bin/sh -c '. ./f bar'
  $ printf 'echo "$@"\n' > f;    bash -c '. ./f bar'
  bar
tests/init.sh relied on that, accepting a --set-path=DIR argument,
and two tests used that idiom.
* tests/init.sh: Update suggested usage comments.
(path_prepend_): New function, to be used in place of
the --src-path=DIR option.
Disallow empty strings and strings containing ":".
(setup_): Move PATH-prepending code into path_prepend_.
* tests/test-pread.sh: Adapt to new usage.
* tests/test-xalloc-die.sh: Likewise.

ChangeLog
tests/init.sh
tests/test-pread.sh
tests/test-xalloc-die.sh

index 1ae4d63..0afec2e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2009-12-08  Jim Meyering  <meyering@redhat.com>
+
+       init.sh: avoid Solaris 10 /bin/sh portability problem
+       Solaris 10's /bin/sh does not pass '.' arguments 2.. to the
+       sourced script:
+         $ printf 'echo "$@"\n' > f; /bin/sh -c '. ./f bar'
+         $ printf 'echo "$@"\n' > f; /bin/bash -c '. ./f bar'
+         bar
+       tests/init.sh relied on that, accepting a --set-path=DIR argument,
+       and two tests used that idiom.
+       * tests/init.sh: Update suggested usage comments.
+       (path_prepend_): New function, to be used in place
+       of the --src-path=DIR option.
+       (setup_): Move PATH-prepending code into path_prepend_.
+       * tests/test-pread.sh: Adapt to new usage.
+       * tests/test-xalloc-die.sh: Likewise.
+
 2009-12-08  Simon Josefsson  <simon@josefsson.org>
 
        * doc/gnulib.texi (Glibc pty.h): Add.
index 368da6d..cc02487 100644 (file)
@@ -22,7 +22,7 @@
 #
 #   #!/bin/sh
 #   : ${srcdir=.}
-#   . "$srcdir/init.sh" --set-path=.
+#   . "$srcdir/init.sh"; path_prepend_ .
 #   Execute some commands.
 #   Note that these commands are executed in a subdirectory, therefore you
 #   need to prepend "../" to relative filenames in the build directory.
@@ -47,7 +47,7 @@
 #      Makefile:
 #   $ export srcdir=../../tests # this is an example
 #   3. Execute the commands from the test, copy&pasting them one by one:
-#   $ . "$srcdir/init.sh" --set-path=.
+#   $ . "$srcdir/init.sh"; path_prepend_ .
 #   ...
 #   4. Finally
 #   $ exit
@@ -92,28 +92,30 @@ remove_tmp_()
   exit $__st
 }
 
-setup_()
+# Use this function to prepend to PATH an absolute name for each
+# specified, possibly-$initial_cwd_relative, directory.
+path_prepend_()
 {
-  test "$VERBOSE" = yes && set -x
-
-  # Honor one or more --set-path=. options (i.e., or --set-path=../src).
-  # Use this option to prepend to PATH an absolute name for the
-  # specified, possibly-relative, directory.
   while test $# != 0; do
-    case $1 in
-      --set-path=*)
-        path_dir_=${1#--set-path=}
-        test -z "$path_dir_" && fail_ "missing argument to --set-path="
-        abs_path_dir_=`cd "$path_dir_" && echo "$PWD" || exit 1` \
-            || fail_ "invalid path dir: $path_dir"
-        PATH="$abs_path_dir_:$PATH"
-        export PATH
-        shift
-        ;;
-      *) fail_ "unrecognized option: $1"
-        ;;
+    path_dir_=$1
+    case $path_dir_ in
+      '') fail_ "invalid path dir: '$1'";;
+      /*) abs_path_dir_=$path_dir_;;
+      *) abs_path_dir_=`cd "$initial_cwd_/$path_dir_" && echo "$PWD"` \
+           || fail_ "invalid path dir: $path_dir_";;
     esac
+    case $abs_path_dir_ in
+      *:*) fail_ "invalid path dir: '$abs_path_dir_'";;
+    esac
+    PATH="$abs_path_dir_:$PATH"
+    shift
   done
+  export PATH
+}
+
+setup_()
+{
+  test "$VERBOSE" = yes && set -x
 
   initial_cwd_=$PWD
   ME_=`expr "./$0" : '.*/\(.*\)$'`
index 59f8536..cd4c04d 100755 (executable)
@@ -1,6 +1,5 @@
 #!/bin/sh
-: ${srcdir=.}
-. "$srcdir/init.sh" --set-path=.
+. "${srcdir=.}/init.sh"; path_prepend_ .
 
 fail=0
 : | test-pread || fail=1
index 28cce6d..4188a04 100755 (executable)
@@ -16,7 +16,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-. "${srcdir=.}/init.sh" --set-path=.
+. "${srcdir=.}/init.sh"; path_prepend_ .
 
 test-xalloc-die 2> err > out
 case $? in