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

# entry ::= name SVR filename packager
# SVR ::= [serial:]version-release
packages()
{
	perl -MRPM::Header -MRPM::Vercmp=evrcmp -Mstrict -l - "$@" <<'__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 exists($hdr{SERIAL});
		my $p = "$hdr{PACKAGER}";
		$p =~ s/\s+/ /g;
		push @rpms, [ $hdr{NAME}, $SVR, $f, $p ];
	}
	die "$dir: no rpms\n" unless @rpms;
	@rpms = sort { $$a[0] cmp $$b[0] or evrcmp $$b[1], $$a[1] } @rpms;
	print join("\t", @$_) foreach @rpms;
__EOF__
}

while getopts h opt; do
	case "$opt" in
		h) pod2usage --exit=0 "$0"; exit 0 ;;
		*) pod2usage --exit=2 "$0"; exit 2 ;;
	esac
done
shift "$((OPTIND-1))"

if [ $# -gt 1 ]; then
	echo "${0##*/}: too many arguments" >&2
	pod2usage --exit=2 "$0"; exit 2
elif [ $# -eq 1 ]; then
	RPMS="$1"
else
	RPMS="${sisyphus:=/ALT/Sisyphus}"/files/SRPMS
fi
RPMS="$(readlink -ev -- "$RPMS")"

# check perl(RPM/Header.pm), perl(RPM/Vercmp.pm)
perl -MRPM::Header -MRPM::Vercmp -e ''

. cmdcache ""
cmdcache packages "$RPMS"

# the rest is for qa-robot
opt_join=1
noun=package

rpm_summary()
{ 
	local info; info="$(rpm -qp --qf '%{NAME} - %{SUMMARY}' "$1")"
	local size="$(du --apparent-size --block-size=1M "$1" |cut -f1)"
	[ "$size" -ge 10 ] && printf '%-64.127s\t[%dM]\n' "$info" "$size" ||
		printf '%-.128s\n' "$info"
}

rpm_recent_changes()
{
	perl -MRPM::Header -Mstrict -l - "$@" <<'__EOF__'
	my ($f) = @ARGV;
	tie my %hdr, "RPM::Header", $f or die "$f: $RPM::err\n";
	my ($guy0, $time0);
	for my $i (0 .. $#{$hdr{CHANGELOGTIME}}) {
		use Date::Format qw(time2str);
		my $time = $hdr{CHANGELOGTIME}[$i];
		my $date = time2str("%a %b %d %Y", $time);
		my $info = "* $date $hdr{CHANGELOGNAME}[$i]";
		my $guy;
		$info =~ s{(?<=<)([^<>]+?)(?=>)}{
			local $_ = $1;
			s/ at /@/g; s/ dot /./g;
			s/@([-\w._]+)[.]\w+\z/\@$1/;
			$guy = $_;
		}e;
		print $info;
		$guy0 = $guy if $i == 0;
		$time0 = $time if $i == 0;
		# the same packager, for last 3 months, no more than 3 entires
		my $again = $guy eq $guy0 && $time+3600*24*30*3 > $time0 && $i < 3;
		print $hdr{CHANGELOGTEXT}[$i] if $again || $i == 0;
		last if not $again;
	}
__EOF__
}

rpm_changes_since()
{
	perl -MRPM::Header -MRPM::Vercmp=evrcmp -Mstrict -l - "$@" <<'__EOF__'
	my ($SVR, $f) = @ARGV;
	tie my %hdr, "RPM::Header", $f or die "$f: $RPM::err\n";
	my $cmp;
	for my $i (0 .. $#{$hdr{CHANGELOGTIME}}) {
		use Date::Format qw(time2str);
		my $date = time2str("%a %b %d %Y", $hdr{CHANGELOGTIME}[$i]);
		my $info = "* $date $hdr{CHANGELOGNAME}[$i]";
		my $guy;
		$info =~ s{(?<=<)([^<>]+?)(?=>)}{
			local $_ = $1;
			s/ at /@/g; s/ dot /./g;
			s/@([-\w._]+)[.]\w+\z/\@$1/;
			$guy = $_;
		}e;
		my $svr = (split " ", $hdr{CHANGELOGNAME}[$i])[-1];
		$cmp = $svr =~ /^\w[:\w.-]*$/ ? evrcmp $svr, $SVR : -1;
		print $info;
		print $hdr{CHANGELOGTEXT}[$i] if $cmp > 0 || $i == 0;
		last if $cmp <= 0;
	}
	print "Note: changelog entry for $SVR not found." if $cmp;
__EOF__
}

fmt_new()
{
	subj="$subj +$1!"
	echo "	$1 ADDED $2"; echo
	while IFS=$'\t' read -r name SVR f _; do
		rpm_summary "$RPMS/$f"
		rpm_recent_changes "$RPMS/$f"
		echo
	done
}

fmt_old()
{
	subj="$subj -$1"
	echo "	$1 REMOVED $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 _ _ SVR4 f _; do
		rpm_summary "$RPMS/$f"
		rpm_changes_since "$SVR2" "$RPMS/$f"
		[ "$SVR2" != "$SVR4" ] ||
			echo "Note: package version $SVR2 not changed."
		echo
	done
}

fmt_total()
{
	subj="$subj ($1)"
	[ -z "${RPMS##*/SRPMS*}" ] &&
		echo "Total $1 source $2." ||
		echo "Total $1 $2."
}
