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
|
---|