#!/bin/sh
[ $# -lt 1 ] && echo "usage: $(basename $0) /path/to/respin/mountpoint" && exit 1
[ $UID -ne 0 ] && echo "need to be root." && exit 2
[ ! -d "$1/Packages" ] && "$1 doesn't appear to be a valid tree" && exit 1
[ ! -r "/root/upgrade.log" ] && "this doesn't appear to be an upgrade. /root/upgrade.log does not exist" && exit 1

respin_mnt="$1"
cd /root

rpm -qa --qf='%{N}\n' | sort | uniq > trail.installed
grep "^Upgrading" upgrade.log | awk '{print $2}' | sort | uniq > trail.upgraded
comm -23 trail.installed trail.upgraded > trail.notupgraded
rpm -qa --qf '%{N}\n' | sort | uniq -cd | sort -rn > trail.dupes

printf "Packages Installed:    %4d\n" $(wc -l trail.installed|awk '{print $1}')
printf "Packages Upgraded:     %4d\n" $(wc -l trail.upgraded|awk '{print $1}')
printf "Packages Not Upgraded: %4d\n" $(wc -l trail.notupgraded|awk '{print $1}')
printf "Package Duplicates:    %4d\n" $(wc -l trail.dupes|awk '{print $1}')
echo "Dupes list:"
cat trail.dupes

rm trail.nochange trail.unavailable trail.other 2>/dev/null

while read pn; do 
	INSTRPM_NV=$(rpm -q --qf '%{N}-%{V}\n' $pn)

	if [ -e $respin_mnt/Packages/${INSTRPM_NV}*.rpm ]; then
		#echo "$pn not upgraded because version unchanged"
		echo $pn >> trail.nochange
	elif [ ! -e $respin_mnt/Packages/${pn}-*.rpm ]; then
		#echo "$pn not upgraded because it's unavailable on media"
		echo $pn >> trail.unavailable
	else
		echo "$pn not upgraded for some other reason"
		echo $pn >> trail.other
	fi
done < trail.notupgraded

echo
echo "Reasons why some packages were not upgraded:"
printf " 1) Version unchanged [OK]:   %4d\n" $(wc -l trail.nochange|awk '{print $1}')
printf " 2) Package unavailable [??]: %4d\n" $(wc -l trail.unavailable|awk '{print $1}')
printf " 3) Other [??]:               %4d\n" $(wc -l trail.other|awk '{print $1}')

echo
#echo "Unavailable packages: $(cat trail.unavailable|xargs)"
#echo "Other packges: $(cat trail.other|xargs)"
echo "Unavailable packages: " ; cat trail.unavailable

echo
echo "Other packages: " ; cat trail.other
