| From: Lasse Collin <lasse.collin@tukaani.org> |
| Date: Sun, 31 Jul 2011 11:01:47 +0300 |
| Subject: Fix exit status of "xzdiff foo.xz bar.xz". |
| |
| xzdiff was clobbering the exit status from diff in a case |
| statement used to analyze the exit statuses from "xz" when |
| its operands were two compressed files. Save and restore |
| diff's exit status to fix this. |
| |
| The bug is inherited from zdiff in GNU gzip and was fixed |
| there on 2009-10-09. |
| |
| Thanks to Jonathan Nieder for the patch and |
| to Peter Pallinger for reporting the bug. |
| --- |
| src/scripts/xzdiff.in | 2 ++ |
| tests/Makefile.am | 4 +++- |
| tests/test_scripts.sh | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ |
| 3 files changed, 59 insertions(+), 1 deletion(-) |
| create mode 100755 tests/test_scripts.sh |
| |
| diff --git a/src/scripts/xzdiff.in b/src/scripts/xzdiff.in |
| index 2d6e5da4..03428d1a 100644 |
| --- a/src/scripts/xzdiff.in |
| +++ b/src/scripts/xzdiff.in |
| @@ -120,10 +120,12 @@ elif test $# -eq 2; then |
| ( ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null | |
| eval "$cmp" /dev/fd/5 - >&3) 5<&0 |
| ) |
| + cmp_status=$? |
| case $xz_status in |
| *[1-9]*) xz_status=1;; |
| *) xz_status=0;; |
| esac |
| + (exit $cmp_status) |
| else |
| F=`expr "/$2" : '.*/\(.*\)[-.][ablmtxz2]*$'` || F=$prog |
| tmp= |
| diff --git a/tests/Makefile.am b/tests/Makefile.am |
| index d0807ae4..0469264a 100644 |
| --- a/tests/Makefile.am |
| +++ b/tests/Makefile.am |
| @@ -10,6 +10,7 @@ EXTRA_DIST = \ |
| tests.h \ |
| test_files.sh \ |
| test_compress.sh \ |
| + test_scripts.sh \ |
| bcj_test.c \ |
| compress_prepared_bcj_sparc \ |
| compress_prepared_bcj_x86 |
| @@ -42,7 +43,8 @@ TESTS = \ |
| test_block_header \ |
| test_index \ |
| test_files.sh \ |
| - test_compress.sh |
| + test_compress.sh \ |
| + test_scripts.sh |
| |
| clean-local: |
| -rm -f compress_generated_* |
| diff --git a/tests/test_scripts.sh b/tests/test_scripts.sh |
| new file mode 100755 |
| index 00000000..891fc76a |
| --- /dev/null |
| +++ b/tests/test_scripts.sh |
| @@ -0,0 +1,54 @@ |
| +#!/bin/sh |
| + |
| +############################################################################### |
| +# |
| +# Author: Jonathan Nieder |
| +# |
| +# This file has been put into the public domain. |
| +# You can do whatever you want with this file. |
| +# |
| +############################################################################### |
| + |
| +# If scripts weren't built, this test is skipped. |
| +XZ=../src/xz/xz |
| +XZDIFF=../src/scripts/xzdiff |
| +test -x "$XZ" || XZ= |
| +test -r "$XZDIFF" || XZDIFF= |
| +if test -z "$XZ" || test -z "$XZDIFF"; then |
| + (exit 77) |
| + exit 77 |
| +fi |
| + |
| +PATH=`pwd`/../src/xz:$PATH |
| +export PATH |
| + |
| +preimage=$srcdir/files/good-1-check-crc32.xz |
| +samepostimage=$srcdir/files/good-1-check-crc64.xz |
| +otherpostimage=$srcdir/files/good-1-lzma2-1.xz |
| + |
| +sh "$XZDIFF" "$preimage" "$samepostimage" >/dev/null |
| +status=$? |
| +if test "$status" != 0 ; then |
| + echo "xzdiff with no changes exited with status $status != 0" |
| + (exit 1) |
| + exit 1 |
| +fi |
| + |
| +sh "$XZDIFF" "$preimage" "$otherpostimage" >/dev/null |
| +status=$? |
| +if test "$status" != 1 ; then |
| + echo "xzdiff with changes exited with status $status != 1" |
| + (exit 1) |
| + exit 1 |
| +fi |
| + |
| +sh "$XZDIFF" "$preimage" "$srcdir/files/missing.xz" >/dev/null 2>&1 |
| +status=$? |
| +if test "$status" != 2 ; then |
| + echo "xzdiff with missing operand exited with status $status != 2" |
| + (exit 1) |
| + exit 1 |
| +fi |
| + |
| +(exit 0) |
| +exit 0 |
| -- |
| 1.7.10.2 |
| |