diff options
Diffstat (limited to 'source/a/pkgtools/scripts/pkgdiff')
-rw-r--r-- | source/a/pkgtools/scripts/pkgdiff | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/source/a/pkgtools/scripts/pkgdiff b/source/a/pkgtools/scripts/pkgdiff new file mode 100644 index 00000000..ca21ad8f --- /dev/null +++ b/source/a/pkgtools/scripts/pkgdiff @@ -0,0 +1,164 @@ +#!/bin/sh +# Copyright 2002 Patrick J. Volkerding, Concord, CA, USA +# Copyright 2018 Patrick J. Volkerding, Sebeka, Minnesota, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +CWD=$(pwd) + +# Display usage for basic usage errors: +usage() { + cat << EOF +pkgdiff: missing file arguments +Try 'pkgdiff --help' for more information. +EOF +} + +# Display full --help if requested: +helpme() { + cat << EOF +Usage: pkgdiff [OPTION] FILE1 FILE2 +Show which files are new and which are removed between two tar archives. +The tar archives may be uncompressed, or compressed with gzip, bzip2, +xz, or lzip. Also works with .rpm and .deb. + + --help display this help and exit + -c use ANSI color with default tree mode + -a show simple text (ASCII) diff of package file lists + +By default, the trees are drawn with in crude ASCII with no color. For +the full-color effect, try something like this: + + pkgdiff -c package1 package2 | less -r + +EOF + # --help doesn't return + exit 22 +} + +# How the heck do I open this? +explode() { + tar xf $1 1> /dev/null 2> /dev/null + # Check for common extensions and do additional magic: + if [ ! "$(basename $1)" = "$(basename $1 .zip)" ]; then + unzip $1 1> /dev/null 2> /dev/null + fi + if [ ! "$(basename $1)" = "$(basename $1 .rpm)" ]; then + cp $1 . + rpm2tgz $(basename $1) 1> /dev/null 2> /dev/null + rm -f $(basename $1) + tar xzf $(basename $1 .rpm).tgz 1> /dev/null 2> /dev/null + rm -f $(basename $1 .rpm).tgz + fi + if [ ! "$(basename $1)" = "$(basename $1 .deb)" ]; then + cp $1 . + ar x $(basename $1) 1> /dev/null 2> /dev/null + tar xf data.tar.xz 1> /dev/null 2> /dev/null + rm -f * 2> /dev/null + fi + # Diffs for other archive formats are welcome. +} + +# Parse options. +# -c turns on colorization ala dircolors: +unset COLOR +if [ "$1" = "-c" ]; then + COLOR="-C" + shift 1 +fi +if [ "$1" = "-a" ]; then + ASCII=true + shift 1 +fi +if [ "$1" = "--help" ]; then + helpme +fi + +TMPDIR=$(mktemp -d) +cd $TMPDIR + +if [ ! -r "$1" ]; then + if [ -d "$CWD/$1" ]; then + usage + exit 99 + else + PKG1="$CWD/$1" + fi +else + PKG1="$1" +fi + +if [ ! -r "$2" ]; then + if [ -d "$CWD/$2" ]; then + usage + #echo "pkgdiff -- find the difference between two tar archives" + #echo "usage: pkgdiff [ -C ] pkg1 pkg2" + exit 99 + else + PKG2="$CWD/$2" + fi +else + PKG2="$2" +fi + +# We have to account for the possibility that the packages have the +# same name, but different contents... +if [ "$(basename $PKG1)" = "$(basename $PKG2)" ]; then + PKG1=${PKG1}.orig +fi + +# This will be mighty safe even if we ended up in /tmp. +PKG=.pkgdiff.$(mcookie) + +( mkdir -p $TMPDIR/$PKG/1 + cd $TMPDIR/$PKG/1 + if [ -r $PKG1 ]; then + explode $PKG1 + elif [ -r $(dirname $PKG1)/$(basename $PKG1 .orig) ]; then + explode $(dirname $PKG1)/$(basename $PKG1 .orig) + fi + if [ ! "$ASCII" = "true" ]; then + tree $COLOR -a --noreport > ../$(basename $PKG1) + else + find ./ | sed '2,$s,^\./,,' | tar --no-recursion -T - -cf - | tar tf - | sort > ../$(basename $PKG1) + fi +) +( mkdir -p $TMPDIR/$PKG/2 + cd $TMPDIR/$PKG/2 + explode $PKG2 + if [ ! "$ASCII" = "true" ]; then + tree $COLOR -a --noreport > ../$(basename $PKG2) + else + find ./ | sed '2,$s,^\./,,' | tar --no-recursion -T - -cf - | tar tf - | sort > ../$(basename $PKG2) + fi +) + +# Always going that extra mile... ;) +if [ -r $PKG1 ]; then + touch -r $PKG1 $TMPDIR/$PKG/$(basename $PKG1) +elif [ -r $(dirname $PKG1)/$(basename $PKG1 .orig) ]; then + touch -r $(dirname $PKG1)/$(basename $PKG1 .orig) $TMPDIR/$PKG/$(basename $PKG1) +fi +touch -r $PKG2 $TMPDIR/$PKG/$(basename $PKG2) + +rm -rf $TMPDIR/$PKG/{1,2} +( cd $TMPDIR/$PKG ; diff -d -u $(basename $PKG1) $(basename $PKG2) ) + +# cleanup: +rm -rf $PKG $TMPDIR |