[1046] | 1 | #!/bin/sh
|
---|
| 2 |
|
---|
| 3 | # Copyright (C) 1998, 2002, 2006, 2007 Free Software Foundation
|
---|
| 4 | # Copyright (C) 1993 Jean-loup Gailly
|
---|
| 5 |
|
---|
| 6 | # Modified for XZ Utils by Andrew Dudman and Lasse Collin.
|
---|
| 7 |
|
---|
| 8 | # This program is free software; you can redistribute it and/or modify
|
---|
| 9 | # it under the terms of the GNU General Public License as published by
|
---|
| 10 | # the Free Software Foundation; either version 2 of the License, or
|
---|
| 11 | # (at your option) any later version.
|
---|
| 12 |
|
---|
| 13 | # This program is distributed in the hope that it will be useful,
|
---|
| 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 16 | # GNU General Public License for more details.
|
---|
| 17 |
|
---|
| 18 | #SET_PATH - This line is a placeholder to ease patching this script.
|
---|
| 19 |
|
---|
| 20 | # Instead of unsetting XZ_OPT, just make sure that xz will use file format
|
---|
| 21 | # autodetection. This way memory usage limit and thread limit can be
|
---|
| 22 | # specified via XZ_OPT. With gzip and bzip2 it's OK to just unset the
|
---|
| 23 | # environment variables.
|
---|
| 24 | xz='xz --format=auto'
|
---|
| 25 | unset GZIP BZIP BZIP2
|
---|
| 26 |
|
---|
| 27 | case ${0##*/} in
|
---|
| 28 | *cmp*) prog=xzcmp; cmp=${CMP:-cmp};;
|
---|
| 29 | *) prog=xzdiff; cmp=${DIFF:-diff};;
|
---|
| 30 | esac
|
---|
| 31 |
|
---|
| 32 | version="$prog (XZ Utils) 5.0.3"
|
---|
| 33 |
|
---|
| 34 | usage="Usage: ${0##*/} [OPTION]... FILE1 [FILE2]
|
---|
| 35 | Compare FILE1 to FILE2, using their uncompressed contents if they are
|
---|
| 36 | compressed. If FILE2 is omitted, then the files compared are FILE1 and
|
---|
| 37 | FILE1 from which the compression format suffix has been stripped.
|
---|
| 38 |
|
---|
| 39 | Do comparisons like '$cmp' does. OPTIONs are the same as for '$cmp'.
|
---|
| 40 |
|
---|
| 41 | Report bugs to <lasse.collin@tukaani.org>."
|
---|
| 42 |
|
---|
| 43 | # sed script to escape all ' for the shell, and then (to handle trailing
|
---|
| 44 | # newlines correctly) turn trailing X on last line into '.
|
---|
| 45 | escape='
|
---|
| 46 | s/'\''/'\''\\'\'''\''/g
|
---|
| 47 | $s/X$/'\''/
|
---|
| 48 | '
|
---|
| 49 |
|
---|
| 50 | while :; do
|
---|
| 51 | case $1 in
|
---|
| 52 | --h*) printf '%s\n' "$usage" || exit 2; exit;;
|
---|
| 53 | --v*) echo "$version" || exit 2; exit;;
|
---|
| 54 | --) shift; break;;
|
---|
| 55 | -*\'*) cmp="$cmp '"`printf '%sX\n' "$1" | sed "$escape"`;;
|
---|
| 56 | -?*) cmp="$cmp '$1'";;
|
---|
| 57 | *) break;;
|
---|
| 58 | esac
|
---|
| 59 | shift
|
---|
| 60 | done
|
---|
| 61 | cmp="$cmp --"
|
---|
| 62 |
|
---|
| 63 | for file; do
|
---|
| 64 | test "X$file" = X- || <"$file" || exit 2
|
---|
| 65 | done
|
---|
| 66 |
|
---|
| 67 | xz1=$xz
|
---|
| 68 | xz2=$xz
|
---|
| 69 | xz_status=0
|
---|
| 70 | exec 3>&1
|
---|
| 71 |
|
---|
| 72 | if test $# -eq 1; then
|
---|
| 73 | case $1 in
|
---|
| 74 | *[-.]xz | *[-.]lzma | *.t[lx]z)
|
---|
| 75 | ;;
|
---|
| 76 | *[-.]bz2 | *.tbz | *.tbz2)
|
---|
| 77 | xz1=bzip2;;
|
---|
| 78 | *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z)
|
---|
| 79 | xz1=gzip;;
|
---|
| 80 | *)
|
---|
| 81 | echo >&2 "$0: $1: Unknown compressed file name suffix"
|
---|
| 82 | exit 2;;
|
---|
| 83 | esac
|
---|
| 84 | case $1 in
|
---|
| 85 | *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma)
|
---|
| 86 | FILE=`expr "X$1" : 'X\(.*\)[-.][abglmxzZ2]*$'`;;
|
---|
| 87 | *.t[abglx]z)
|
---|
| 88 | FILE=`expr "X$1" : 'X\(.*[-.]t\)[abglx]z$'`ar;;
|
---|
| 89 | *.tbz2)
|
---|
| 90 | FILE=`expr "X$1" : 'X\(.*[-.]t\)bz2$'`ar;;
|
---|
| 91 | esac
|
---|
| 92 | xz_status=$(
|
---|
| 93 | exec 4>&1
|
---|
| 94 | ($xz1 -cd -- "$1" 4>&-; echo $? >&4) 3>&- | eval "$cmp" - '"$FILE"' >&3
|
---|
| 95 | )
|
---|
| 96 | elif test $# -eq 2; then
|
---|
| 97 | case $1 in
|
---|
| 98 | *[-.]bz2 | *.tbz | *.tbz2) xz1=bzip2;;
|
---|
| 99 | *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) xz1=gzip;;
|
---|
| 100 | esac
|
---|
| 101 | case $2 in
|
---|
| 102 | *[-.]bz2 | *.tbz | *.tbz2) xz2=bzip2;;
|
---|
| 103 | *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) xz2=gzip;;
|
---|
| 104 | esac
|
---|
| 105 | case $1 in
|
---|
| 106 | *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | -)
|
---|
| 107 | case "$2" in
|
---|
| 108 | *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | -)
|
---|
| 109 | if test "$1$2" = --; then
|
---|
| 110 | xz_status=$(
|
---|
| 111 | exec 4>&1
|
---|
| 112 | ($xz1 -cdfq - 4>&-; echo $? >&4) 3>&- |
|
---|
| 113 | eval "$cmp" - - >&3
|
---|
| 114 | )
|
---|
| 115 | elif # Reject Solaris 8's buggy /bin/bash 2.03.
|
---|
| 116 | echo X | (echo X | eval "$cmp" /dev/fd/5 - >/dev/null 2>&1) 5<&0; then
|
---|
| 117 | xz_status=$(
|
---|
| 118 | exec 4>&1
|
---|
| 119 | ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
|
---|
| 120 | ( ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null |
|
---|
| 121 | eval "$cmp" /dev/fd/5 - >&3) 5<&0
|
---|
| 122 | )
|
---|
| 123 | case $xz_status in
|
---|
| 124 | *[1-9]*) xz_status=1;;
|
---|
| 125 | *) xz_status=0;;
|
---|
| 126 | esac
|
---|
| 127 | else
|
---|
| 128 | F=`expr "/$2" : '.*/\(.*\)[-.][ablmtxz2]*$'` || F=$prog
|
---|
| 129 | tmp=
|
---|
| 130 | trap '
|
---|
| 131 | test -n "$tmp" && rm -f "$tmp"
|
---|
| 132 | (exit 2); exit 2
|
---|
| 133 | ' HUP INT PIPE TERM 0
|
---|
| 134 | tmp=`mktemp -t -- "$F.XXXXXX"` || exit 2
|
---|
| 135 | $xz2 -cdfq -- "$2" > "$tmp" || exit 2
|
---|
| 136 | xz_status=$(
|
---|
| 137 | exec 4>&1
|
---|
| 138 | ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
|
---|
| 139 | eval "$cmp" - '"$tmp"' >&3
|
---|
| 140 | )
|
---|
| 141 | cmp_status=$?
|
---|
| 142 | rm -f "$tmp" || xz_status=$?
|
---|
| 143 | trap - HUP INT PIPE TERM 0
|
---|
| 144 | (exit $cmp_status)
|
---|
| 145 | fi;;
|
---|
| 146 | *)
|
---|
| 147 | xz_status=$(
|
---|
| 148 | exec 4>&1
|
---|
| 149 | ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
|
---|
| 150 | eval "$cmp" - '"$2"' >&3
|
---|
| 151 | );;
|
---|
| 152 | esac;;
|
---|
| 153 | *)
|
---|
| 154 | case "$2" in
|
---|
| 155 | *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | -)
|
---|
| 156 | xz_status=$(
|
---|
| 157 | exec 4>&1
|
---|
| 158 | ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- |
|
---|
| 159 | eval "$cmp" '"$1"' - >&3
|
---|
| 160 | );;
|
---|
| 161 | *)
|
---|
| 162 | eval "$cmp" '"$1"' '"$2"';;
|
---|
| 163 | esac;;
|
---|
| 164 | esac
|
---|
| 165 | else
|
---|
| 166 | echo >&2 "$0: Invalid number of operands; try \`${0##*/} --help' for help"
|
---|
| 167 | exit 2
|
---|
| 168 | fi
|
---|
| 169 |
|
---|
| 170 | cmp_status=$?
|
---|
| 171 | test "$xz_status" -eq 0 || exit 2
|
---|
| 172 | exit $cmp_status
|
---|