use strict;
use IO::Uncompress::AnyInflate qw(anyinflate);
-use Dpkg::Version qw(vercmp);
+use Dpkg::Version (); # import nothing
+if ( defined $Dpkg::Version::VERSION ) {
+ *vercmp = \&Dpkg::Version::version_compare;
+} else {
+ *vercmp = \&Dpkg::Version::vercmp;
+}
+use Dpkg::Arch qw(debarch_is);
+use Data::Dumper;
sub readsourcebins {
my $arch = shift;
my $pas = {};
local($/) = "\n";
- open(PAS, '<', $pasfile);
- while(<PAS>) {
+ open(my $pasf, '<', $pasfile);
+ while(<$pasf>) {
chomp;
s,\s*#.*,,;
next unless $_;
my ($p, $c) = split(/:\s*/);
$pas->{$p} = { arch => [ split(/\s+/, $c) ], mode => substr($c, 0, 1) ne '!' };
}
- close PAS;
+ close $pasf;
my $srcs = {};
local($/) = ""; # read in paragraph mode
/^Build-Conflicts:\s*(.*)$/mi and $p->{'conflicts'} = $1;
next unless $p->{'name'} and $p->{'version'};
- next if $p->{'arch'} eq 'all';
- # TODO: respect the architecture - or not / we already respect it via P-a-s
- delete $p->{'arch'};
+ foreach my $tarch (split(/\s+/, $p->{'arch'})) {
+ $p->{'for-us'} = 1 if debarch_is($arch, $tarch);
+ }
# ignore if package already exists with higher version
if ($srcs->{$p->{'name'}}) {
next if (vercmp($srcs->{$p->{'name'}}->{'version'}, $p->{'version'}) > 0);
}
- my @a = split(/,? /, $p->{'binary'}) if $p->{'binary'};
- $p->{'binary'} = \@a;
+ if ($p->{'binary'}) {
+ $p->{'binary'} = [ split(/,? /, $p->{'binary'}) ];
+ }
$srcs->{$p->{'name'}} = $p;
}
close $S;
while(<$P>) {
my $p;
/^Version:\s*(\S+)$/mi and $p->{'version'} = $1;
+ /^Version:\s*(\S+)\+b([0-9]+)$/mi and $p->{'version'} = $1 and $p->{'binnmu'} = $2;
/^Architecture:\s*(\S+)$/mi and $p->{'arch'} = $1;
/^Package:\s*(\S+)$/mi and $p->{'binary'} = $1;
/^Package:\s*(\S+)$/mi and $p->{'source'} = $1;
/^Source:\s*(\S+)$/mi and $p->{'source'} = $1;
/^Source:\s*(\S+)\s+\((\S+)\)$/mi and $p->{'source'} = $1 and $p->{'version'} = $2;
- $p->{'version'} =~ /(\S+)\+b([0-9]+)/ and $p->{'version'} = $1 and $p->{'binnmu'} = $2;
+ # consider packages as non-existant if it's all but outdated
+ next if $p->{'arch'} eq 'all' && $srcs->{$p->{'source'}} && $srcs->{$p->{'source'}}->{'version'} && vercmp($srcs->{$p->{'source'}}->{'version'}, $p->{'version'}) > 0;
next unless $p->{'arch'} eq 'all' || $p->{'arch'} eq ${arch};
$binary->{$p->{'binary'}} = { 'version' => $p->{'version'}, 'arch' => $p->{'arch'}} unless $binary->{$p->{'binary'}} and vercmp($binary->{$p->{'binary'}}->{'version'}, $p->{'version'}) < 0;
}
delete $srcs->{$k}->{'compiled'};
$srcs->{$k}->{'status'} = 'installed' if $srcs->{$k}->{'arch'} && $srcs->{$k}->{'arch'} eq 'all';
+
+ if (!$srcs->{$k}->{'for-us'} && $srcs->{$k}->{'status'} ne 'installed') {
+ $srcs->{$k}->{'status'} = 'arch-not-in-arch-list';
+ }
+ delete $srcs->{$k}->{'for-us'};
- #my $p = $pas->{$k};
- #$p ||= $pas->{'%'.$k};
- #$srcs->{$k}->{'status'} = 'not-for-us' if pasignore($p, $arch);
+ if ($srcs->{$k}->{'arch'} eq 'all') {
+ $srcs->{$k}->{'status'} = 'arch-all-only';
+ delete $srcs->{$k}->{'arch'};
+ next;
+ }
+ delete $srcs->{$k}->{'arch'};
+
if (pasignore($pas->{'%'.$k}, $arch)) {
- $srcs->{$k}->{'status'} = 'not-for-us';
+ $srcs->{$k}->{'status'} = 'packages-arch-specific';
next;
}
for my $bin (@{$srcs->{$k}->{'binary'}}) {
+ $srcs->{$k}->{'pas'} = 1 if pasignore($pas->{$bin}, $arch);
next if pasignore($pas->{$bin}, $arch);
next if $binary->{$bin} and $binary->{$bin}->{'arch'} eq 'all';
next SRCS;
}
- $srcs->{$k}->{'status'} = 'not-for-us';
+ if ($srcs->{$k}->{'pas'}) {
+ $srcs->{$k}->{'status'} = 'packages-arch-specific';
+ } else {
+ $srcs->{$k}->{'status'} = 'overwritten-by-arch-all';
+ }
+ delete $srcs->{$k}->{'pas'};
}
$srcs->{'_binary'} = $binary;
local($/) = "\n";