4 unshift @INC, '/usr/lib/build';
5 unshift @INC, $::ENV{'BUILD_DIR'} if $::ENV{'BUILD_DIR'};
11 my $limit = 80; # throw away deltas bigger than this percentage of the reference
17 return undef if $file =~ /\.(?:patch|delta)\.rpm$/; # XXX: rpmtags?
18 my %res = Build::Rpm::rpmq($file, qw/NAME EPOCH VERSION RELEASE ARCH SOURCERPM NOSOURCE NOPATCH 1124/);
19 return undef unless %res;
20 return undef if $res{'1124'}->[0] && $res{'1124'}->[0] eq 'drpm';
22 if ($res{'SOURCERPM'}->[0]) {
23 $arch = $res{'ARCH'}->[0];
25 # no src rpm deltas for now
26 # if ($res{'NOSOURCE'}->[0] || $res{'NOPATCH'}->[0]) {
33 return { file => $file, name => $res{'NAME'}->[0], epoch => $res{'EPOCH'} ? $res{'EPOCH'}->[0] : '', version => $res{'VERSION'}->[0], release => $res{'RELEASE'}->[0], arch => $arch};
39 return ($_[0]) if $_[0] =~ /\.rpm$/;
42 opendir(D, $_[0]) || return ();
43 my @r = grep {$_ ne '.' && $_ ne '..'} readdir(D);
45 return map {"$_[0]/$_"} grep {/\.rpm$/} sort(@r);
49 if ($ARGV[0] eq '--limit') {
51 die("--limit needs an argument\n") unless @ARGV;
58 my $prevbuild = shift @ARGV || die "USAGE: $0 <oldpkgdir> <directories...>";
59 my @prevbuild = ($prevbuild);
61 while (-d $prevbuild.$i) {
62 push @prevbuild, $prevbuild.$i;
65 for my $dir (@prevbuild) {
66 for my $file (lsrpms($dir)) {
69 my $n = $q->{'name'}.'.'.$q->{'arch'};
70 push @{$oldpkgs{$n}}, $q;
76 for my $file (lsrpms($dir)) {
79 my $n = $q->{'name'}.'.'.$q->{'arch'};
80 for my $oq (@{$oldpkgs{$n} || []}) {
81 my $v = $oq->{'version'};
82 my $r = $oq->{'release'};
83 if ($v eq $q->{'version'} && $r eq $q->{'release'}) {
84 # skip if same version and release
87 $v .= '_'.$q->{'version'} unless $v eq $q->{'version'};
88 $r .= '_'.$q->{'release'} unless $r eq $q->{'release'};
89 my $dn = sprintf("%s-%s-%s.%s.drpm", $q->{'name'}, $v, $r, $q->{'arch'});
90 my $sn = sprintf("%s-%s-%s.%s.dseq", $q->{'name'}, $v, $r, $q->{'arch'});
92 my $dndir = $q->{'file'};
93 $dndir =~ s/[^\/]+$//s;
95 my $ret = system('makedeltarpm', '-s', $sn, $oq->{'file'}, $q->{'file'}, $dn);
96 if ($ret || ! -e $dn) {
102 my $ns = (stat($dn))[7] || 1;
103 my $os = (stat($q->{'file'}))[7] || 1;
104 my $factor = int($ns / $os * 100);
105 if ($factor > $limit) {
106 print "too big ($factor%), removed\n";
112 if (!open(F, '<', $sn)) {
113 print "missing sequence file, removed\n";
118 1 while sysread(F, $seq, 8192, length($seq));
122 $seq = "Name: $q->{'name'}\nEpoch: $q->{'epoch'}\nVersion: $q->{'version'}\nRelease: $q->{'release'}\nArch: $q->{'arch'}\nOldName: $oq->{'name'}\nOldEpoch: $oq->{'epoch'}\nOldVersion: $oq->{'version'}\nOldRelease: $oq->{'release'}\nOldArch: $oq->{'arch'}\nSeq: $seq\n";
123 if (!open(F, '>', $sn) || syswrite(F, $seq) != length($seq) || !close(F)) {
124 print "sequence file write error, removed\n";
129 print "ok ($factor%)\n";