From: Jim Meyering Date: Mon, 21 Nov 2011 20:50:23 +0000 (+0100) Subject: init.sh: work around OSF/1 5.1's mishandling of /dev/null X-Git-Tag: v0.1~1410 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=ff549c078493ea86e7bd87526db276a1b94a411a;p=gnulib.git init.sh: work around OSF/1 5.1's mishandling of /dev/null * tests/init.sh: Make our compare function slightly more portable. Reported by Bruno Haible in http://thread.gmane.org/gmane.comp.gnu.grep.bugs/4020 Much improved by Eric Blake. --- diff --git a/ChangeLog b/ChangeLog index e7755877e..0fbcf897b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2011-11-21 Jim Meyering + Eric Blake + + init.sh: work around OSF/1 5.1's mishandling of /dev/null + * tests/init.sh: Make our compare function slightly more portable. + Reported by Bruno Haible in + http://thread.gmane.org/gmane.comp.gnu.grep.bugs/4020 + 2011-11-21 Simon Josefsson * m4/gnulib-common.m4 (_Noreturn): Check that _MSC_VER is defined diff --git a/tests/init.sh b/tests/init.sh index c78e5b67a..507901024 100644 --- a/tests/init.sh +++ b/tests/init.sh @@ -221,11 +221,35 @@ export MALLOC_PERTURB_ # a partition, or to undo any other global state changes. cleanup_ () { :; } +# Arrange not to let diff or cmp operate on /dev/null, +# since on some systems (at least OSF/1 5.1), that doesn't work. +# When there are not two arguments, or no argument is /dev/null, return 2. +# When one argument is /dev/null and the other is not empty, +# cat the nonempty file to stderr and return 1. +# Otherwise, return 0. +compare_dev_null_ () +{ + test $# = 2 || return 2 + + if test "x$1" = x/dev/null; then + set dummy "$2" "$1"; shift + fi + + test "x$2" = x/dev/null || return 2 + + test -s "$1" || return 0 + + cat - "$1" <&2 +Unexpected contents of $1: +EOF + return 1 +} + if diff_out_=`( diff -u "$0" "$0" < /dev/null ) 2>/dev/null`; then if test -z "$diff_out_"; then - compare () { diff -u "$@"; } + compare_ () { diff -u "$@"; } else - compare () + compare_ () { if diff -u "$@" > diff.out; then # No differences were found, but Solaris 'diff' produces output @@ -241,9 +265,9 @@ if diff_out_=`( diff -u "$0" "$0" < /dev/null ) 2>/dev/null`; then fi elif diff_out_=`( diff -c "$0" "$0" < /dev/null ) 2>/dev/null`; then if test -z "$diff_out_"; then - compare () { diff -c "$@"; } + compare_ () { diff -c "$@"; } else - compare () + compare_ () { if diff -c "$@" > diff.out; then # No differences were found, but AIX and HP-UX 'diff' produce output @@ -259,11 +283,22 @@ elif diff_out_=`( diff -c "$0" "$0" < /dev/null ) 2>/dev/null`; then } fi elif ( cmp --version < /dev/null 2>&1 | grep GNU ) > /dev/null 2>&1; then - compare () { cmp -s "$@"; } + compare_ () { cmp -s "$@"; } else - compare () { cmp "$@"; } + compare_ () { cmp "$@"; } fi +# Given compare_dev_null_'s preprocessing, defer to compare_ if 2 or more. +# Otherwise, propagate $? to caller: any diffs have already been printed. +compare () +{ + compare_dev_null_ "$@" + case $? in + 0|1) return $?;; + *) compare_ "$@";; + esac +} + # An arbitrary prefix to help distinguish test directories. testdir_prefix_ () { printf gt; }