#!/bin/bash

#
# fedora-diffarchive
# Diff contents of two archives
#
# Author:  Ville Skyttä <ville.skytta at iki.fi>
# License: GPL
# $Id: fedora-diffarchive,v 1.4 2006/02/26 15:53:55 scop Exp $

set -e

unset CDPATH
tmpdir=
diffopts=
list=

trap cleanup EXIT
cleanup()
{
    set +e
    [ -z "$tmpdir" -o ! -d "$tmpdir" ] || rm -rf "$tmpdir"
}

usage()
{
    cat <<EOF
Usage: `basename $0` [-l,--list] [diff-options] from-archive to-archive
  -l, --list    Diff lists of files in archives, not files themselves.
  diff-options  Options passed to diff(1), in addition to -r (default: -Nu).
                The first argument not starting with a '-' ends diff-options.
EOF
}

while true ; do
    case "$1" in
        -l|--list) [ -n "$list" ] && diffopts="$diffopts $1" || list=true ;;
        -*)        diffopts="$diffopts $1" ;;
        *)         break ;;
    esac
    shift
done
if [ $# -lt 2 ] ; then
    usage
    exit 1
fi
for file in "$1" "$2" ; do
    if [ ! -f "$file" ] ; then
        [ -e "$file" ] && \
            echo "Error: not a regular file: '$file'" >&2 ||
            echo "Error: file does not exist: '$file'" >&2
        exit 1
    fi
done

diffopts="-r ${diffopts:--Nu}"

tmpdir=`mktemp -d /tmp/diffarchive.XXXXXX`

mkdir "$tmpdir/old" "$tmpdir/new"
fedora-extract -q -C "$tmpdir/old" "$1"
fedora-extract -q -C "$tmpdir/new" "$2"

# It would be nice if fedora-extract could do some of the chmods.
find "$tmpdir"/* -type d -exec chmod u+rx {} ';' # Note: -exec, not xargs here.
chmod -R u+rw "$tmpdir"/*
cd "$tmpdir"

# Did the archives uncompress into base dirs?
if [ `ls -1d old/* | wc -l` -eq 1 ] ; then
  old=`ls -1d old/*`
else
  old=old
fi
if [ `ls -1d new/* | wc -l` -eq 1 ] ; then
  new=`ls -1d new/*`
else
  new=new
fi

# Fixup base dirs to the same level.
if [ `basename "$old"` != `basename "$new"` ] ; then
  if [ "$old" != old ] ; then
    mv "$old" .
    old=`basename "$old"`
  fi
  if [ "$new" != new ] ; then
    mv "$new" .
    new=`basename "$new"`
  fi
fi

# Here we go.
if [ -n "$list" ] ; then
    find "$old" | sort | cut -d/ -f 2- -s > "$old.files"
    find "$new" | sort | cut -d/ -f 2- -s > "$new.files"
    diff $diffopts "$old.files" "$new.files"
else
    diff $diffopts "$old" "$new"
fi
