diff options
Diffstat (limited to '')
-rw-r--r-- | src/scripts/xzdiff.in | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/src/scripts/xzdiff.in b/src/scripts/xzdiff.in new file mode 100644 index 00000000..3c09ad02 --- /dev/null +++ b/src/scripts/xzdiff.in @@ -0,0 +1,172 @@ +#!@POSIX_SHELL@ + +# Copyright (C) 1998, 2002, 2006, 2007 Free Software Foundation +# Copyright (C) 1993 Jean-loup Gailly + +# Modified for XZ Utils by Andrew Dudman and Lasse Collin. + +# 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 of the License, 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. + +#SET_PATH - This line is a placeholder to ease patching this script. + +# Instead of unsetting XZ_OPT, just make sure that xz will use file format +# autodetection. This way memory usage limit and thread limit can be +# specified via XZ_OPT. With gzip and bzip2 it's OK to just unset the +# environment variables. +xz='@xz@ --format=auto' +unset GZIP BZIP BZIP2 + +case ${0##*/} in + *cmp*) prog=xzcmp; cmp=${CMP:-cmp};; + *) prog=xzdiff; cmp=${DIFF:-diff};; +esac + +version="$prog (@PACKAGE_NAME@) @VERSION@" + +usage="Usage: ${0##*/} [OPTION]... FILE1 [FILE2] +Compare FILE1 to FILE2, using their uncompressed contents if they are +compressed. If FILE2 is omitted, then the files compared are FILE1 and +FILE1 from which the compression format suffix has been stripped. + +Do comparisons like '$cmp' does. OPTIONs are the same as for '$cmp'. + +Report bugs to <@PACKAGE_BUGREPORT@>." + +# sed script to escape all ' for the shell, and then (to handle trailing +# newlines correctly) turn trailing X on last line into '. +escape=' + s/'\''/'\''\\'\'''\''/g + $s/X$/'\''/ +' + +while :; do + case $1 in + --h*) printf '%s\n' "$usage" || exit 2; exit;; + --v*) echo "$version" || exit 2; exit;; + --) shift; break;; + -*\'*) cmp="$cmp '"`printf '%sX\n' "$1" | sed "$escape"`;; + -?*) cmp="$cmp '$1'";; + *) break;; + esac + shift +done +cmp="$cmp --" + +for file; do + test "X$file" = X- || <"$file" || exit 2 +done + +xz1=$xz +xz2=$xz +xz_status=0 +exec 3>&1 + +if test $# -eq 1; then + case $1 in + *[-.]xz | *[-.]lzma | *.t[lx]z) + ;; + *[-.]bz2 | *.tbz | *.tbz2) + xz1=$bzip2;; + *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) + xz1=$gzip;; + *) + echo >&2 "$0: $1: Unknown compressed file name suffix" + exit 2;; + esac + case $1 in + *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma) + FILE=`expr "X$1" : 'X\(.*\)[-.][abglmxzZ2]*$'` + *.t[abglx]z) + FILE=`expr "X$1" : 'X\(.*[-.]t\)[abglx]z$'`ar + *.tbz2) + FILE=`expr "X$1" : 'X\(.*[-.]t\)bz2$'`ar + esac + xz_status=$( + exec 4>&1 + ($xz1 -cd -- "$1" 4>&-; echo $? >&4) 3>&- | eval "$cmp" - '"$FILE"' >&3 + ) +elif test $# -eq 2; then + case $1 in + *[-.]bz2 | *.tbz | *.tbz2) xz1=$bzip2;; + *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) xz1=$gzip;; + esac + case $2 in + *[-.]bz2 | *.tbz | *.tbz2) xz2=$bzip2;; + *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) xz2=$gzip;; + esac + case $1 in + *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | -) + case "$2" in + *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | -) + if test "$1$2" = --; then + xz_status=$( + exec 4>&1 + ($xz1 -cdfq - 4>&-; echo $? >&4) 3>&- | + eval "$cmp" - - >&3 + ) + elif # Reject Solaris 8's buggy /bin/bash 2.03. + echo X | (echo X | eval "$cmp" /dev/fd/5 - >/dev/null 2>&1) 5<&0; then + xz_status=$( + exec 4>&1 + ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- | + ( ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null | + eval "$cmp" /dev/fd/5 -) 5<&0 + ) + case $xz_status in + *[1-9]*) xz_status=1;; + *) xz_status=0;; + esac + else + F=`expr "/$2" : '.*/\(.*\)[-.][ablmtxz2]*$'` || F=$prog + tmp= + trap ' + test -n "$tmp" && rm -f "$tmp" + (exit 2); exit 2 + ' HUP INT PIPE TERM 0 + tmp=`mktemp -t -- "$F.XXXXXX"` || exit 2 + $xz2 -cdfq -- "$2" > "$tmp" || exit 2 + xz_status=$( + exec 4>&1 + ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- | + eval "$cmp" - '"$tmp"' >&3 + ) + cmp_status=$? + rm -f "$tmp" || xz_status=$? + trap - HUP INT PIPE TERM 0 + (exit $cmp_status) + fi;; + *) + xz_status=$( + exec 4>&1 + ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- | + eval "$cmp" - '"$2"' >&3 + );; + esac;; + *) + case "$2" in + *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | -) + xz_status=$( + exec 4>&1 + ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- | + eval "$cmp" '"$1"' - >&3 + );; + *) + eval "$cmp" '"$1"' '"$2"';; + esac;; + esac +else + echo >&2 "$0: Invalid number of operands; try \`${0##*/} --help' for help" + exit 2 +fi + +cmp_status=$? +test "$xz_status" -eq 0 || exit 2 +exit $cmp_status |