diff options
author | Stefano Lattarini <stefano.lattarini@gmail.com> | 2011-12-22 12:47:26 +0100 |
---|---|---|
committer | Stefano Lattarini <stefano.lattarini@gmail.com> | 2011-12-22 12:47:26 +0100 |
commit | 26133b3bca603bde75fac88a70296e400d7673a9 (patch) | |
tree | 047d900a1750b48d84cf6ea17fd2c157f50cdf69 | |
parent | fdc16456f45edf32aa4c4036611eb2c102fe89e5 (diff) | |
parent | 75f2b50a655a8dc41a51c6fdcb1c6f8571dce348 (diff) | |
download | automake-26133b3bca603bde75fac88a70296e400d7673a9.tar.gz |
Merge branch 'missing-fixes' into maint
* missing-fixes:
missing: don't try to re-run tar with a munged command line
missing: inform the user if GNU tar is called
missing: if GNU tar exists but fails when called, give up
missing: miscellaneous fixlets
-rw-r--r-- | ChangeLog | 43 | ||||
-rwxr-xr-x | lib/missing | 43 | ||||
-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, 218 insertions, 30 deletions
@@ -1,5 +1,48 @@ 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 + has failed, very likely producing some error message. At this + point, just running GNU tar without further comments might be + confusing. + +2011-12-22 Stefano Lattarini <stefano.lattarini@gmail.com> + + missing: if GNU tar exists but fails when called, give up + * lib/missing: If the code trying to run GNU tar is reached, + don't continue if the invoked GNU tar program fails, as there + is little point in doing so (and can even be confusing and + counter-productive). + +2011-12-22 Stefano Lattarini <stefano.lattarini@gmail.com> + + missing: miscellaneous fixlets + * lib/missing: Some shells, such as Solaris or FreeBSD /bin/sh, + warn about missing programs before performing redirections. + Therefore, where we have to silently check whether a program + exists, perform redirections on a subshell. + Remove redundant uses of double-quotes in variable definitions. + Delete an extra blank line. + +2011-12-22 Stefano Lattarini <stefano.lattarini@gmail.com> + maint: remove executable bit from automake.in * automake.in: This file is not meant to be executed, only to be preprocessed to create the `automake' script; so don't leave diff --git a/lib/missing b/lib/missing index 28055d2ae..1039955ea 100755 --- a/lib/missing +++ b/lib/missing @@ -1,10 +1,10 @@ #! /bin/sh # Common stub for a few missing GNU programs while installing. -scriptversion=2009-04-28.21; # UTC +scriptversion=2011-12-22.11; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, -# 2008, 2009 Free Software Foundation, Inc. +# 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. # This program is free software; you can redistribute it and/or modify @@ -226,7 +226,7 @@ WARNING: \`$1' $msg. You should only need it if \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then - eval LASTARG="\${$#}" + eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` @@ -256,7 +256,7 @@ WARNING: \`$1' is $msg. You should only need it if \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then - eval LASTARG="\${$#}" + eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` @@ -320,32 +320,15 @@ WARNING: \`$1' is $msg. You should only need it if tar*) shift - - # We have already tried tar in the generic part. - # Look for gnutar/gtar before invocation to avoid ugly error - # messages. - if (gnutar --version > /dev/null 2>&1); then - gnutar "$@" && exit 0 - fi - if (gtar --version > /dev/null 2>&1); then - gtar "$@" && exit 0 - fi - 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 - + # We have already tried tar in the generic part. So try with GNU tar. + # Look for gnutar/gtar before invocation to avoid ugly error messages. + for cmd in gnutar gtar; do + ($cmd --version) > /dev/null 2>&1 || continue + echo 1>&2 "\ +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 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 + +: |