#!/usr/bin/perl -w

BEGIN {
  unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
}

use Build;
use strict;

my $limit = 80; # throw away deltas bigger than this percentage of the reference
my %oldpkgs;

sub query
{
    my $file = shift;
    return undef if $file =~ /\.(?:patch|delta)\.rpm$/; # XXX: rpmtags?
    my %res = Build::Rpm::rpmq($file, qw/NAME VERSION RELEASE ARCH SOURCERPM NOSOURCE NOPATCH 1124/);
    return undef unless %res;
    return undef if $res{'1124'}->[0] && $res{'1124'}->[0] eq 'drpm';
    my $arch;
    if ($res{'SOURCERPM'}->[0]) {
	$arch = $res{'ARCH'}->[0];
    } else {
#	if ($res{'NOSOURCE'}->[0] || $res{'NOPATCH'}->[0]) {
#	    $arch = 'nosrc';
#	} else {
#	    $arch = 'src';
#	}
	return undef;
    }
    return { name => $res{'NAME'}->[0], file => $file, version => $res{'VERSION'}->[0], release => $res{'RELEASE'}->[0], arch => $arch};
}

while (@ARGV) {
  if ($ARGV[0] eq '--limit') {
    shift @ARGV || die "--limit needs an argument\n";
    $limit = shift @ARGV;
    next;
  }
  last;
}

my $prevbuild = shift @ARGV || die "USAGE: $0 <oldpkgdir> <directories...>";
my @prevbuild = ($prevbuild);
my $i = 1;
while (-e $prevbuild.$i) {
    push @prevbuild, $prevbuild.$i;
    ++$i;
}
for my $dir (@prevbuild) {
    for my $file (glob $dir.'/*.rpm') {
	my $q = query($file);
	next unless $q;
	my $n = $q->{'name'}.'.'.$q->{'arch'};
	push @{$oldpkgs{$n}}, $q;
    }
}

my $sysret = 0;
for my $dir (@ARGV) {
    for my $file (glob $dir.'/*.rpm') {
	my $q = query($file);
	next unless $q;
	my $n = $q->{'name'}.'.'.$q->{'arch'};
	next unless exists $oldpkgs{$n};
	for my $old (@{$oldpkgs{$n}}) {
	    my $v = $old->{'version'};
	    my $r = $old->{'release'};
	    if ($v eq $q->{'version'} && $r eq $q->{'release'}) {
		# skip if same version and release
		next;
	    }
	    $v .= '_'.$q->{'version'} unless $v eq $q->{'version'};
	    $r .= '_'.$q->{'release'} unless $r eq $q->{'release'};
	    my $on = $old->{'file'};
	    my $nn = $q->{'file'};
	    my $dn = sprintf("%s-%s-%s.%s.drpm", $q->{'name'}, $v, $r, $q->{'arch'});
	    print "$dn ... ";
	    $dn = $dir.'/'.$dn;
	    my $ret = system('makedeltarpm', $on, $nn, $dn);
	    if ($ret || ! -e $dn) {
		print "FAILED\n";
		$sysret = 1;
	    } else {
		my $ns = (stat($dn))[7] || 1;
		my $os = (stat($file))[7] || 1;
		my $factor = int($ns / $os * 100);
		if ($factor > $limit) {
		    print "too big ($factor%), removed\n";
		    unlink $dn;
		} else {
		    print "ok ($factor%)\n";
		}
	    }
	}
    }
}

exit $sysret;
