diff options
author | Stefano Lattarini <stefano.lattarini@gmail.com> | 2011-10-30 11:55:28 +0100 |
---|---|---|
committer | Stefano Lattarini <stefano.lattarini@gmail.com> | 2011-12-22 12:21:13 +0100 |
commit | 75f2b50a655a8dc41a51c6fdcb1c6f8571dce348 (patch) | |
tree | 56b65b563dd333cb8243c6083e4e20d4a2aae3dc | |
parent | a930b7d18bfd011647c84def5fef69e3880a2686 (diff) | |
download | automake-75f2b50a655a8dc41a51c6fdcb1c6f8571dce348.tar.gz |
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.
-rw-r--r-- | ChangeLog | 16 | ||||
-rwxr-xr-x | lib/missing | 16 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/Makefile.in | 1 | ||||
-rwxr-xr-x | tests/missing-tar.test | 160 |
5 files changed, 178 insertions, 16 deletions
@@ -1,5 +1,21 @@ 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 diff --git a/lib/missing b/lib/missing index 46f33bf07..1039955ea 100755 --- a/lib/missing +++ b/lib/missing @@ -329,22 +329,6 @@ WARNING: I can't seem to be able to run \`tar' with the given arguments. Trying to use GNU tar (\"$cmd\") instead ..." exec $cmd "$@" done - firstarg=$1 - if shift; then - case $firstarg in - *o*) - firstarg=`echo "$firstarg" | sed s/o//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - case $firstarg in - *h*) - firstarg=`echo "$firstarg" | sed s/h//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - fi - echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the diff --git a/tests/Makefile.am b/tests/Makefile.am index 831906b72..8e3c1d128 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -578,6 +578,7 @@ missing3.test \ missing4.test \ missing5.test \ missing6.test \ +missing-tar.test \ mkinstall.test \ mkinst2.test \ mkinst3.test \ diff --git a/tests/Makefile.in b/tests/Makefile.in index 3ad0146e4..261b46257 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -862,6 +862,7 @@ missing3.test \ missing4.test \ missing5.test \ missing6.test \ +missing-tar.test \ mkinstall.test \ mkinst2.test \ mkinst3.test \ diff --git a/tests/missing-tar.test b/tests/missing-tar.test new file mode 100755 index 000000000..4f531dfde --- /dev/null +++ b/tests/missing-tar.test @@ -0,0 +1,160 @@ +#! /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 + +: |