xref: /dragonfly/contrib/xz/src/scripts/xzdiff.in (revision e151908b)
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