summaryrefslogtreecommitdiff
path: root/tests/init.sh
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2011-11-21 21:50:23 +0100
committerJim Meyering <meyering@redhat.com>2011-11-22 08:46:20 +0100
commitff549c078493ea86e7bd87526db276a1b94a411a (patch)
tree9d8ea1ebb69e0ca40ea6d0caaa935eb5c94bd8c8 /tests/init.sh
parent18eab914cd22f89774a6b84be6da39d78860dc91 (diff)
downloadgnulib-ff549c078493ea86e7bd87526db276a1b94a411a.tar.gz
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.
Diffstat (limited to 'tests/init.sh')
-rw-r--r--tests/init.sh47
1 files changed, 41 insertions, 6 deletions
diff --git a/tests/init.sh b/tests/init.sh
index c78e5b67a8..5079010243 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" <<EOF >&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; }