2011-12-22 Stefano Lattarini <stefano.lattarini@gmail.com>
+ missing: don't try to re-run tar with a munged command line
+ * lib/missing: If the default `tar' program fails with the given
+ arguments, and GNU tar is not available, don't try to re-run the
+ default `tar' with a munged command line (e.g., ditching possibly
+ unportable options), as that could be subtly alter the intended
+ semantics (and maybe even create a somewhat corrupted tarball).
+ Also, it's worth noting that the main purpose of the `missing'
+ script is to allow a non-developer to build the package in the
+ face of slightly-skewed timestamps, not to provide wrappers for
+ all the maintainer tools -- so we don't have to try too hard
+ when `missing' is just called to wrap `tar'.
+ * tests/missing-tar.test: New test.
+ * tests/Makefile.am (TESTS): Add it.
+
+2011-12-22 Stefano Lattarini <stefano.lattarini@gmail.com>
+
missing: inform the user if GNU tar is called
* lib/missing: If the code trying to run GNU tar is reached, it
means that the previous attempt to run the default tar program
--- /dev/null
+#! /bin/sh
+# Copyright (C) 2011 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
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Test how the `missing' script wraps the`tar' program .
+# FIXME: we should also try to run the `missing' script with the
+# $CONFIG_SHELL ...
+
+. ./defs || Exit 1
+
+set -e
+
+# FIXME: make this working with "installcheck" too ...
+cp "$testsrcdir"/../lib/missing . \
+ || fatal_ "failed to fetch auxiliary script \`missing'"
+
+old_PATH=$PATH; export old_PATH
+new_PATH=`pwd`/bin$PATH_SEPARATOR$PATH
+mkdir bin
+
+cat > data.txt <<'END'
+To be, or not to be: that is the question:
+Whether 'tis nobler in the mind to suffer
+...
+END
+
+cat > nonesuch <<'END'
+#!/bin/sh
+exit 127
+END
+chmod a+x nonesuch
+
+# Simple runs.
+for nullify_gnu in yes no; do
+ case $nullify_gnu in
+ yes)
+ cp nonesuch bin/gtar
+ cp nonesuch bin/gnutar
+ PATH=$new_PATH; export PATH;
+ mkdir simple-nognu
+ cd simple-nognu
+ ;;
+ no)
+ mkdir simple-dflt
+ cd simple-dflt
+ ;;
+ *)
+ Exit 99 # Can't happen.
+ ;;
+ esac
+ cp ../data.txt foobar.txt
+ ../missing --run tar cvf mu.tar foobar.txt
+ rm -f foobar.txt
+ test -f mu.tar
+ ../missing --run tar tf mu.tar >output 2>&1 || { cat output; Exit 1; }
+ cat output
+ $FGREP 'foobar.txt' output
+ test ! -f foobar.txt
+ ../missing --run tar xvf mu.tar
+ diff ../data.txt foobar.txt
+ PATH=$old_PATH; export PATH;
+ cd ..
+done
+
+rm -f bin/*
+
+# Helper scripts and functions for next tests.
+
+cat > fake-gnu-tar <<'END'
+#!/bin/sh
+case " $* " in *\ --version\ *) echo fake GNU tar; exit $?;; esac
+PATH=$old_PATH; export PATH
+exec tar "$@"
+END
+chmod a+x fake-gnu-tar
+
+cat > failing-tar <<'END'
+#!/bin/sh
+echo "Error message from tar passed through" >&2
+exit 1
+END
+chmod a+x failing-tar
+
+grep_tar_failed ()
+{
+ grep "WARNING:.* can't.* run \`tar' with .*given arguments" $*
+}
+
+# The `tar' program does not work with the given options, but we have
+# gtar or gnutar.
+cp failing-tar bin/tar
+for pfx in g gnu; do
+ case $pfx in g) othpfx=gnu;; gnu) othpfx=g;; *) Exit 99;; esac
+ cp nonesuch bin/${othpfx}tar
+ if ${pfx}tar --version | grep GNU; then :; else
+ cp fake-gnu-tar bin/${pfx}tar
+ fi
+ tarball=foo-$pfx.tar
+ PATH=$new_PATH; export PATH
+ ./missing --run tar cvf $tarball ./data.txt 2>stderr \
+ || { cat stderr >&2; Exit 1; }
+ cat stderr >&2
+ PATH=$old_PATH; export PATH
+ test -f $tarball
+ grep_tar_failed stderr
+ grep "Error message from tar passed through" stderr
+ grep "[Tt]rying to use GNU tar.*${pfx}tar" stderr
+ grep "${othpfx}tar" stderr && Exit 1
+ : # For shells with broken 'set -e'
+done
+
+rm -f bin/*
+
+# The `tar' program does not work with the given options, and we don't
+# have neither gtar nor gnutar.
+cp failing-tar bin/tar
+cp nonesuch bin/gtar
+cp nonesuch bin/gnutar
+PATH=$new_PATH; export PATH
+./missing --run tar cvf foo.tar ./data.txt 2>stderr \
+ && { cat stderr >&2; Exit 1; }
+cat stderr >&2
+PATH=$old_PATH; export PATH
+test ! -f foo.tar
+grep_tar_failed stderr
+grep "Error message from tar passed through" stderr
+grep "[iI]nstall GNU tar or Free [pP]axutils" stderr
+$EGREP "(g|gnu)tar" stderr && Exit 1
+
+rm -f bin/*
+
+# We try to use an option that causes any `tar' program (GNU or non-GNU) to.
+sh -x ./missing --run tar --bad-unknonw-option cvf foo.tar ./data.txt 2>stderr \
+ && { cat stderr >&2; Exit 1; }
+cat stderr >&2
+test ! -f foo.tar
+grep_tar_failed stderr
+grep "bad-unknonw-option" stderr
+for p in gtar gnutar; do
+ if $p --version; then
+ cnt=1
+ else
+ cnt=0
+ fi
+ test `$EGREP -c "[Tt]rying to use GNU tar.*$p" stderr` -eq $cnt
+done
+
+: