#!/bin/sh -ef
export LC_ALL=C

sisyphus="/raid/ALT/Sisyphus"
SRPMS="$sisyphus/files/SRPMS"

check_stamp()
{
	local stamp="${workdir:?}/stamp"
	if [ "$SRPMS" -nt "$stamp" -o "$stamp" -nt "$SRPMS" ]; then
		echo "$SRPMS was changed; we are out of luck" >&2
		return 1
	fi
}

make_stamp()
{
	local stamp="${workdir:?}/stamp"
	[ -n "$opt_z" -a -f "$stamp" ] && check_stamp 2>/dev/null && exit 0
	touch -r "$SRPMS" "$stamp"
}

# entry ::= name SVR filename
# SVR ::= [serial:]version-release
dump()
{
	SRPMS="${1-$SRPMS}"; SRPMS="$(realpath "$SRPMS")"
	make_stamp
	{ rpmprune --help; rpmevrcmp 1 1; } >/dev/null
	perl -MRPM::Header -Mstrict -l - "$SRPMS" <<'__EOF__'
	my $dir = shift;
	chdir $dir or die "$dir: $!\n";
	my @rpms;
	foreach my $f (<*.rpm>) {
		tie my %hdr, "RPM::Header", $f or die "$f: $RPM::err\n";
		my $SVR = "$hdr{VERSION}-$hdr{RELEASE}";
		$SVR = "$hdr{SERIAL}:$SVR" if $hdr{SERIAL};
		push @rpms, [ $hdr{NAME}, $SVR, $f ];
	}
	die "$dir: no rpms\n" unless @rpms;
	@rpms = sort { $$a[0] cmp $$b[0] or 0+`rpmevrcmp $$b[1] $$a[1]` } @rpms;
	print join("\t", @$_) foreach @rpms;
__EOF__
	check_stamp
}

# Short-circuit optimization, named after mutt option:
#	-z	exit immediately if there are no messages in the mailbox
opt_z=
while getopts z opt; do
	case "$opt" in
		z) opt_z=1 ;;
		*) exit 2 ;;
	esac
done
shift "$((OPTIND-1))"

dump ${1+"$@"}

opt_join=1
noun=package

rpm_summary() { rpm -qp --qf '%{NAME} - %{SUMMARY}\n' -- "$@"; }
rpm_lastchange() { rpm -qp --lastchange -- "$@" |sed -ne \
	's/@\([[:alnum:]-]\+\)\.[[:alnum:]]\+>/@\1>/;/[[:alnum:]]/p'; }

fmt_new()
{
	subj="$subj +$1!"
	echo "	$1 BRAND NEW $2"; echo
	while IFS=$'\t' read -r name SVR f; do
		rpm_summary "$SRPMS/$f"
		rpm_lastchange "$SRPMS/$f"
		echo
	done
}

fmt_old()
{
	subj="$subj -$1"
	echo "	$1 ORPHANED/obsolete $2"; echo
	while IFS=$'\t' read -r name SVR f; do
		echo "$name	$SVR"
	done
	echo
}

fmt_updated()
{
	subj="$subj +$1"
	echo "	$1 UPDATED $2"; echo
	while IFS=$'\t' read -r name SVR2 f0 SVR4 f; do
		rpm_summary "$SRPMS/$f"
		echo "$SVR2 -> $SVR4"
		rpm_lastchange "$SRPMS/$f"
		echo
	done
}

fmt_total()
{
	check_stamp
	subj="$subj ($1)"
	echo "Total $1 source $2."
}
