#!/bin/sh
#
#  Compare two packages for multilib-relevant differences.
#
export LC_ALL
LC_ALL=C

tmpdir=`mktemp -d`
if test -z "$tmpdir" ; then
	echo Error creating temporary directory.
	exit 1
fi

trap 'rm -fr $tmpdir' EXIT

multilib() {
	file "$1" | egrep -q '(ELF|directory|symbolic link)'
}

checktrees() {
	pushd $1 > /dev/null
	find . | (while read filename ; do 
		if ! test -e $2/$filename ; then
			if ! multilib $filename ; then
				echo "["$filename"]"
				echo $filename only present in one package
			fi
		else
			if ! test -d $filename ; then
				if ! multilib $filename ; then
					if ! cmp $filename $2/$filename > $tmpdir/stdout 2> $tmpdir/stderr ; then
						echo "["$filename"]" | sed -r -e "s# ?([\./])\./#/#g"
						cat $tmpdir/stdout | sed -r -e "s# ?([\./])*$2##g" -e "s# ?([\./])*$filename##g"
						cat $tmpdir/stderr | sed -r -e "s# ?([\./])*$2##g" -e "s# ?([\./])*$filename##g"
						diff -u $filename $2/$filename | sed -r -e "s# ?([\./])*$2##g" -e "s# ?([\./])*$filename##g"
					fi
				fi
			fi
		fi
	done)
	cd $2
	find . | (while read filename ; do 
		if ! test -e $1/$filename ; then
			if ! multilib $2/$filename ; then
				echo "["$filename"]"
				echo $filename only present in one package
			fi
		fi
	done)
	popd > /dev/null
}

checkpackage() {
	arch1=`rpm -qp --qf '%{arch}' "$1"`
	arch2=`rpm -qp --qf '%{arch}' "$2"`
	if test -z "$arch1" ; then
		echo "$1 is not an RPM package?"
		return
	fi
	if test -z "$arch2" ; then
		echo "$1 is not an RPM package?"
		return
	fi
	mkdir -p $tmpdir/$arch1 $tmpdir/$arch2 2> /dev/null
	rm -fr $tmpdir/$arch1/* $tmpdir/$arch2/* 2> /dev/null
	rpm2cpio $1 | (cd $tmpdir/$arch1; cpio -di > /dev/null 2> /dev/null)
	rpm2cpio $2 | (cd $tmpdir/$arch2; cpio -di > /dev/null 2> /dev/null)
	checktrees $tmpdir/$arch1 $tmpdir/$arch2
}

while [ $# -ge 2 ] ; do
	checkpackage "$1" "$2"
	shift 2
done

