1114db65bSPeter Avalos#!@POSIX_SHELL@ 2114db65bSPeter Avalos 3114db65bSPeter Avalos# Copyright (C) 1998, 2002, 2006, 2007 Free Software Foundation 4114db65bSPeter Avalos# Copyright (C) 1993 Jean-loup Gailly 5114db65bSPeter Avalos 6114db65bSPeter Avalos# Modified for XZ Utils by Andrew Dudman and Lasse Collin. 7114db65bSPeter Avalos 8114db65bSPeter Avalos# This program is free software; you can redistribute it and/or modify 9114db65bSPeter Avalos# it under the terms of the GNU General Public License as published by 10114db65bSPeter Avalos# the Free Software Foundation; either version 2 of the License, or 11114db65bSPeter Avalos# (at your option) any later version. 12114db65bSPeter Avalos 13114db65bSPeter Avalos# This program is distributed in the hope that it will be useful, 14114db65bSPeter Avalos# but WITHOUT ANY WARRANTY; without even the implied warranty of 15114db65bSPeter Avalos# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16114db65bSPeter Avalos# GNU General Public License for more details. 17114db65bSPeter Avalos 18*e151908bSDaniel Fojt@enable_path_for_scripts@ 19114db65bSPeter Avalos#SET_PATH - This line is a placeholder to ease patching this script. 20114db65bSPeter Avalos 21114db65bSPeter Avalos# Instead of unsetting XZ_OPT, just make sure that xz will use file format 22114db65bSPeter Avalos# autodetection. This way memory usage limit and thread limit can be 2315ab8c86SJohn Marino# specified via XZ_OPT. With gzip, bzip2, and lzop it's OK to just unset the 24114db65bSPeter Avalos# environment variables. 25114db65bSPeter Avalosxz='@xz@ --format=auto' 2615ab8c86SJohn Marinounset GZIP BZIP BZIP2 LZOP 27114db65bSPeter Avalos 28114db65bSPeter Avaloscase ${0##*/} in 29114db65bSPeter Avalos *cmp*) prog=xzcmp; cmp=${CMP:-cmp};; 30114db65bSPeter Avalos *) prog=xzdiff; cmp=${DIFF:-diff};; 31114db65bSPeter Avalosesac 32114db65bSPeter Avalos 33114db65bSPeter Avalosversion="$prog (@PACKAGE_NAME@) @VERSION@" 34114db65bSPeter Avalos 35114db65bSPeter Avalosusage="Usage: ${0##*/} [OPTION]... FILE1 [FILE2] 36114db65bSPeter AvalosCompare FILE1 to FILE2, using their uncompressed contents if they are 37114db65bSPeter Avaloscompressed. If FILE2 is omitted, then the files compared are FILE1 and 38114db65bSPeter AvalosFILE1 from which the compression format suffix has been stripped. 39114db65bSPeter Avalos 40114db65bSPeter AvalosDo comparisons like '$cmp' does. OPTIONs are the same as for '$cmp'. 41114db65bSPeter Avalos 42114db65bSPeter AvalosReport bugs to <@PACKAGE_BUGREPORT@>." 43114db65bSPeter Avalos 44114db65bSPeter Avalos# sed script to escape all ' for the shell, and then (to handle trailing 45114db65bSPeter Avalos# newlines correctly) turn trailing X on last line into '. 46114db65bSPeter Avalosescape=' 47114db65bSPeter Avalos s/'\''/'\''\\'\'''\''/g 48114db65bSPeter Avalos $s/X$/'\''/ 49114db65bSPeter Avalos' 50114db65bSPeter Avalos 51114db65bSPeter Avaloswhile :; do 52114db65bSPeter Avalos case $1 in 53114db65bSPeter Avalos --h*) printf '%s\n' "$usage" || exit 2; exit;; 54114db65bSPeter Avalos --v*) echo "$version" || exit 2; exit;; 55114db65bSPeter Avalos --) shift; break;; 56114db65bSPeter Avalos -*\'*) cmp="$cmp '"`printf '%sX\n' "$1" | sed "$escape"`;; 57114db65bSPeter Avalos -?*) cmp="$cmp '$1'";; 58114db65bSPeter Avalos *) break;; 59114db65bSPeter Avalos esac 60114db65bSPeter Avalos shift 61114db65bSPeter Avalosdone 62114db65bSPeter Avaloscmp="$cmp --" 63114db65bSPeter Avalos 64114db65bSPeter Avalosfor file; do 65114db65bSPeter Avalos test "X$file" = X- || <"$file" || exit 2 66114db65bSPeter Avalosdone 67114db65bSPeter Avalos 68114db65bSPeter Avalosxz1=$xz 69114db65bSPeter Avalosxz2=$xz 70114db65bSPeter Avalosxz_status=0 71114db65bSPeter Avalosexec 3>&1 72114db65bSPeter Avalos 73114db65bSPeter Avalosif test $# -eq 1; then 74114db65bSPeter Avalos case $1 in 75114db65bSPeter Avalos *[-.]xz | *[-.]lzma | *.t[lx]z) 76114db65bSPeter Avalos ;; 77114db65bSPeter Avalos *[-.]bz2 | *.tbz | *.tbz2) 78114db65bSPeter Avalos xz1=bzip2;; 79114db65bSPeter Avalos *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) 80114db65bSPeter Avalos xz1=gzip;; 8115ab8c86SJohn Marino *[-.]lzo | *.tzo) 8215ab8c86SJohn Marino xz1=lzop;; 83114db65bSPeter Avalos *) 84114db65bSPeter Avalos echo >&2 "$0: $1: Unknown compressed file name suffix" 85114db65bSPeter Avalos exit 2;; 86114db65bSPeter Avalos esac 87114db65bSPeter Avalos case $1 in 8815ab8c86SJohn Marino *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *[-.]lzo) 8915ab8c86SJohn Marino FILE=`expr "X$1" : 'X\(.*\)[-.][abglmoxzZ2]*$'`;; 90114db65bSPeter Avalos *.t[abglx]z) 91114db65bSPeter Avalos FILE=`expr "X$1" : 'X\(.*[-.]t\)[abglx]z$'`ar;; 92114db65bSPeter Avalos *.tbz2) 93114db65bSPeter Avalos FILE=`expr "X$1" : 'X\(.*[-.]t\)bz2$'`ar;; 9415ab8c86SJohn Marino *.tzo) 9515ab8c86SJohn Marino FILE=`expr "X$1" : 'X\(.*[-.]t\)zo$'`ar;; 96114db65bSPeter Avalos esac 97114db65bSPeter Avalos xz_status=$( 98114db65bSPeter Avalos exec 4>&1 99114db65bSPeter Avalos ($xz1 -cd -- "$1" 4>&-; echo $? >&4) 3>&- | eval "$cmp" - '"$FILE"' >&3 100114db65bSPeter Avalos ) 101114db65bSPeter Avaloselif test $# -eq 2; then 102114db65bSPeter Avalos case $1 in 103114db65bSPeter Avalos *[-.]bz2 | *.tbz | *.tbz2) xz1=bzip2;; 104114db65bSPeter Avalos *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) xz1=gzip;; 10515ab8c86SJohn Marino *[-.]lzo | *.tzo) xz1=lzop;; 106114db65bSPeter Avalos esac 107114db65bSPeter Avalos case $2 in 108114db65bSPeter Avalos *[-.]bz2 | *.tbz | *.tbz2) xz2=bzip2;; 109114db65bSPeter Avalos *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) xz2=gzip;; 11015ab8c86SJohn Marino *[-.]lzo | *.tzo) xz2=lzop;; 111114db65bSPeter Avalos esac 112114db65bSPeter Avalos case $1 in 11315ab8c86SJohn Marino *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | *[-.]lzo | *.tzo | -) 114114db65bSPeter Avalos case "$2" in 11515ab8c86SJohn Marino *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | *[-.]lzo | *.tzo | -) 116114db65bSPeter Avalos if test "$1$2" = --; then 117114db65bSPeter Avalos xz_status=$( 118114db65bSPeter Avalos exec 4>&1 119114db65bSPeter Avalos ($xz1 -cdfq - 4>&-; echo $? >&4) 3>&- | 120114db65bSPeter Avalos eval "$cmp" - - >&3 121114db65bSPeter Avalos ) 122114db65bSPeter Avalos elif # Reject Solaris 8's buggy /bin/bash 2.03. 123114db65bSPeter Avalos echo X | (echo X | eval "$cmp" /dev/fd/5 - >/dev/null 2>&1) 5<&0; then 124114db65bSPeter Avalos xz_status=$( 125114db65bSPeter Avalos exec 4>&1 126114db65bSPeter Avalos ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- | 127114db65bSPeter Avalos ( ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null | 128114db65bSPeter Avalos eval "$cmp" /dev/fd/5 - >&3) 5<&0 129114db65bSPeter Avalos ) 130b892b6baSPeter Avalos cmp_status=$? 131114db65bSPeter Avalos case $xz_status in 132114db65bSPeter Avalos *[1-9]*) xz_status=1;; 133114db65bSPeter Avalos *) xz_status=0;; 134114db65bSPeter Avalos esac 135b892b6baSPeter Avalos (exit $cmp_status) 136114db65bSPeter Avalos else 13715ab8c86SJohn Marino F=`expr "/$2" : '.*/\(.*\)[-.][ablmotxz2]*$'` || F=$prog 138114db65bSPeter Avalos tmp= 139114db65bSPeter Avalos trap ' 14015ab8c86SJohn Marino test -n "$tmp" && rm -rf "$tmp" 141114db65bSPeter Avalos (exit 2); exit 2 142114db65bSPeter Avalos ' HUP INT PIPE TERM 0 14315ab8c86SJohn Marino if type mktemp >/dev/null 2>&1; then 14415ab8c86SJohn Marino # Note that FreeBSD's mktemp isn't fully compatible with 14515ab8c86SJohn Marino # the implementations from mktemp.org and GNU coreutils. 14615ab8c86SJohn Marino # It is important that the -t argument is the last argument 14715ab8c86SJohn Marino # and that no "--" is used between -t and the template argument. 14815ab8c86SJohn Marino # This way this command works on all implementations. 14915ab8c86SJohn Marino tmp=`mktemp -d -t "$prog.XXXXXXXXXX"` || exit 2 15015ab8c86SJohn Marino else 15115ab8c86SJohn Marino # Fallback code if mktemp is missing. This isn't as 15215ab8c86SJohn Marino # robust as using mktemp since this doesn't try with 15315ab8c86SJohn Marino # different file names in case of a file name conflict. 15415ab8c86SJohn Marino # 15515ab8c86SJohn Marino # There's no need to save the original umask since 15615ab8c86SJohn Marino # we don't create any non-temp files. Note that using 15715ab8c86SJohn Marino # mkdir -m 0077 isn't secure since some mkdir implementations 15815ab8c86SJohn Marino # create the dir with the default umask and chmod the 15915ab8c86SJohn Marino # the dir afterwards. 16015ab8c86SJohn Marino umask 0077 16115ab8c86SJohn Marino mkdir -- "${TMPDIR-/tmp}/$prog.$$" || exit 2 16215ab8c86SJohn Marino tmp="${TMPDIR-/tmp}/$prog.$$" 16315ab8c86SJohn Marino fi 16415ab8c86SJohn Marino $xz2 -cdfq -- "$2" > "$tmp/$F" || exit 2 165114db65bSPeter Avalos xz_status=$( 166114db65bSPeter Avalos exec 4>&1 167114db65bSPeter Avalos ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- | 16815ab8c86SJohn Marino eval "$cmp" - '"$tmp/$F"' >&3 169114db65bSPeter Avalos ) 170114db65bSPeter Avalos cmp_status=$? 17115ab8c86SJohn Marino rm -rf "$tmp" || xz_status=$? 172114db65bSPeter Avalos trap - HUP INT PIPE TERM 0 173114db65bSPeter Avalos (exit $cmp_status) 174114db65bSPeter Avalos fi;; 175114db65bSPeter Avalos *) 176114db65bSPeter Avalos xz_status=$( 177114db65bSPeter Avalos exec 4>&1 178114db65bSPeter Avalos ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- | 179114db65bSPeter Avalos eval "$cmp" - '"$2"' >&3 180114db65bSPeter Avalos );; 181114db65bSPeter Avalos esac;; 182114db65bSPeter Avalos *) 183114db65bSPeter Avalos case "$2" in 18415ab8c86SJohn Marino *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | *[-.]lzo | *.tzo | -) 185114db65bSPeter Avalos xz_status=$( 186114db65bSPeter Avalos exec 4>&1 187114db65bSPeter Avalos ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- | 188114db65bSPeter Avalos eval "$cmp" '"$1"' - >&3 189114db65bSPeter Avalos );; 190114db65bSPeter Avalos *) 191114db65bSPeter Avalos eval "$cmp" '"$1"' '"$2"';; 192114db65bSPeter Avalos esac;; 193114db65bSPeter Avalos esac 194114db65bSPeter Avaloselse 195114db65bSPeter Avalos echo >&2 "$0: Invalid number of operands; try \`${0##*/} --help' for help" 196114db65bSPeter Avalos exit 2 197114db65bSPeter Avalosfi 198114db65bSPeter Avalos 199114db65bSPeter Avaloscmp_status=$? 200114db65bSPeter Avalostest "$xz_status" -eq 0 || exit 2 201114db65bSPeter Avalosexit $cmp_status 202