Switch over to using Packages-style syntax instead of apt's internal

structures, as suggested by David.

Add the APT::Cache::ShowVersion=1 option to the apt-cache calls to
turn on version reporting.

Once this change has gone into apt-cache as well, we're all set.
This commit is contained in:
Steve McIntyre 2012-09-26 18:09:50 +00:00
parent 02b108335b
commit 2601477edf
2 changed files with 32 additions and 44 deletions

View File

@ -32,6 +32,7 @@ options=" -q -o Dir::State::status=$APTTMP/$CODENAME-$ARCH/status \
-o Dir::Cache=$APTTMP/$CODENAME-$ARCH/apt-cache/ \ -o Dir::Cache=$APTTMP/$CODENAME-$ARCH/apt-cache/ \
-o Dir::Etc=$APTTMP/$CODENAME-$ARCH/apt/ \ -o Dir::Etc=$APTTMP/$CODENAME-$ARCH/apt/ \
-o APT::Cache::AllVersions=0 \ -o APT::Cache::AllVersions=0 \
-o APT::Cache::ShowVersion=1 \
-o APT::Architecture=$ARCH " -o APT::Architecture=$ARCH "
sections=main sections=main

View File

@ -38,20 +38,6 @@ my $tasks_packages = read_env('TASKS_PACKAGES',
"$ENV{'MIRROR'}/dists/sid/main/binary-$ENV{'ARCH'}/Packages.gz"); "$ENV{'MIRROR'}/dists/sid/main/binary-$ENV{'ARCH'}/Packages.gz");
my @output = (); my @output = ();
# Borrowed from the internals of apt. Ewwww.
# enum DepCompareOp {Or=0x10,NoOp=0,LessEq=0x1,GreaterEq=0x2,Less=0x3,
# Greater=0x4,Equals=0x5,NotEquals=0x6};
my $DEPCOMPARE_OR = 16;
my $DEPCOMPARE_NOP = 0;
my $DEPCOMPARE_LE = 1;
my $DEPCOMPARE_GE = 2;
my $DEPCOMPARE_LT = 3;
my $DEPCOMPARE_GT = 4;
my $DEPCOMPARE_EQ = 5;
my $DEPCOMPARE_NE = 6;
my @DEPCOMPARE_TEXT = ("", "<=", ">=", "<<", ">>", "=", "!=");
$| = 1; # Autoflush for debugging $| = 1; # Autoflush for debugging
open(LOG, ">$dir/sort_deps.$arch.log") open(LOG, ">$dir/sort_deps.$arch.log")
@ -392,18 +378,16 @@ sub dump_depend {
foreach (@array) { foreach (@array) {
%d = %$_; %d = %$_;
$ret .= $d{"Package"}; $ret .= $d{"Package"};
if ($d{"CmpOp"} > $DEPCOMPARE_NOP && if ($d{"CmpOp"} ne "") {
$d{"CmpOp"} <= $DEPCOMPARE_NE) { $ret .= " (" . $d{"CmpOp"} . " " . $d{"Version"} . ")";
$ret .= " (" . $DEPCOMPARE_TEXT[$d{"CmpOp"}] . " " . $d{"Version"} . ")";
} }
$ret .= " "; $ret .= " ";
} }
} elsif ("HASH" eq ref($tmpin)) { } elsif ("HASH" eq ref($tmpin)) {
%d = %$tmpin; %d = %$tmpin;
$ret .= $d{"Package"}; $ret .= $d{"Package"};
if ($d{"CmpOp"} > $DEPCOMPARE_NOP && if ($d{"CmpOp"} ne "") {
$d{"CmpOp"} <= $DEPCOMPARE_NE) { $ret .= " (" . $d{"CmpOp"} . " " . $d{"Version"} . ")";
$ret .= " (" . $DEPCOMPARE_TEXT[$d{"CmpOp"}] . " " . $d{"Version"} . ")";
} }
} else { } else {
die "dump_depend: $tmpin is neither an array nor a hash!\n"; die "dump_depend: $tmpin is neither an array nor a hash!\n";
@ -451,14 +435,14 @@ sub read_depends {
msg(1, " " . dump_depend($t) . " <virt>\n"); msg(1, " " . dump_depend($t) . " <virt>\n");
} }
push @{$packages{$pkg}{$out_type}}, $elt; push @{$packages{$pkg}{$out_type}}, $elt;
} elsif ($lines->[$$i] =~ m/^\s\s$type: (\S+)( \((\d+) (\S+)\))*/) { } elsif ($lines->[$$i] =~ m/^\s\s$type: (\S+)( \((\S+) (\S+)\))*/) {
my %elt; my %elt;
$elt{"Package"} = $1; $elt{"Package"} = $1;
if (defined $2) { if (defined $2) {
$elt{"CmpOp"} = $3 & 15; $elt{"CmpOp"} = $3;
$elt{"Version"} = $4; $elt{"Version"} = $4;
} else { } else {
$elt{"CmpOp"} = $DEPCOMPARE_NOP; $elt{"CmpOp"} = "";
$elt{"Version"} = ""; $elt{"Version"} = "";
} }
msg(1, " " . dump_depend(\%elt) . "\n"); msg(1, " " . dump_depend(\%elt) . "\n");
@ -468,13 +452,13 @@ sub read_depends {
# Special case for packages providing not # Special case for packages providing not
# truly virtual packages # truly virtual packages
if ($lines->[$$i] =~ m/^\s{4}/) { if ($lines->[$$i] =~ m/^\s{4}/) {
while ($lines->[$$i] =~ m/\s{4}(\S+)( \((\d+) (\S+)\))*/) { while ($lines->[$$i] =~ m/\s{4}(\S+)( \((\S+) (\S+)\))*/) {
$elt{"Package"} = $1; $elt{"Package"} = $1;
if (defined $2) { if (defined $2) {
$elt{"CmpOp"} = $3 & 15; $elt{"CmpOp"} = $3;
$elt{"Version"} = $4; $elt{"Version"} = $4;
} else { } else {
$elt{"CmpOp"} = $DEPCOMPARE_NOP; $elt{"CmpOp"} = "";
$elt{"Version"} = ""; $elt{"Version"} = "";
} }
msg(1, " " . dump_depend(\%elt) . "\n"); msg(1, " " . dump_depend(\%elt) . "\n");
@ -500,34 +484,37 @@ sub check_versions {
# Trivial check - if we don't care about versioning, anything will # Trivial check - if we don't care about versioning, anything will
# do! # do!
if ($op == $DEPCOMPARE_NOP) { if ($op eq "") {
return 1; return 1;
} }
# Ask the dpkg perl code to compare the version strings # Ask the dpkg perl code to compare the version strings
my $comp = version_compare($available, $wanted); my $comp = version_compare($available, $wanted);
if ($op == $DEPCOMPARE_LE) { if ($op eq "<=") {
if ($comp == -1 || $comp == 0) { if ($comp == -1 || $comp == 0) {
return 1; return 1;
} }
} elsif ($op == $DEPCOMPARE_GE) { } elsif ($op eq ">=") {
if ($comp == 0 || $comp == 1) { if ($comp == 0 || $comp == 1) {
return 1; return 1;
} }
} elsif ($op == $DEPCOMPARE_LT) { } elsif ($op eq "<<") {
if ($comp == -1) { if ($comp == -1) {
return 1; return 1;
} }
} elsif ($op == $DEPCOMPARE_GT) { } elsif ($op eq ">>") {
if ($comp == 1) { if ($comp == 1) {
return 1; return 1;
} }
} elsif ($op == $DEPCOMPARE_EQ) { } elsif ($op eq "=") {
if ($comp == 0) { if ($comp == 0) {
return 1; return 1;
} }
} elsif ($op == $DEPCOMPARE_NE) { # Not sure this ("!") actually exists!
# Mentioned in apt sources, but not in debian policy
# No harm done by checking for it, though...
} elsif ($op eq "!") {
if ($comp == -1 || $comp == 1) { if ($comp == -1 || $comp == 1) {
return 1; return 1;
} }
@ -583,13 +570,13 @@ sub read_ordepends {
chomp $lines->[$$i]; chomp $lines->[$$i];
while ($lines->[$$i] while ($lines->[$$i]
=~ m/^\s([\s\|])((?:Pre)?Depends|Suggests|Recommends): (\S+)( \((\d+) (\S+)\))*/) { =~ m/^\s([\s\|])((?:Pre)?Depends|Suggests|Recommends): (\S+)( \((\S+) (\S+)\))*/) {
$val = $3; $val = $3;
if (defined $4) { if (defined $4) {
$op = $5 & 15; $op = $5;
$version = $6; $version = $6;
} else { } else {
$op = $DEPCOMPARE_NOP; $op = "";
$version = ""; $version = "";
} }
$last = 1 if $1 ne '|'; #Stop when no more '|' $last = 1 if $1 ne '|'; #Stop when no more '|'
@ -609,13 +596,13 @@ sub read_ordepends {
$$i++; $$i++;
# Hack for packages providing not a truly # Hack for packages providing not a truly
# virtual package # virtual package
while ($lines->[$$i] =~ m/^\s{4}(\S+)( \((\d+) (\S+)\))*/) { while ($lines->[$$i] =~ m/^\s{4}(\S+)( \((\S+) (\S+)\))*/) {
$elt{"Package"} = $1; $elt{"Package"} = $1;
if (defined $2) { if (defined $2) {
$elt{"CmpOp"} = $3 & 15; $elt{"CmpOp"} = $3;
$elt{"Version"} = $4; $elt{"Version"} = $4;
} else { } else {
$elt{"CmpOp"} = $DEPCOMPARE_NOP; $elt{"CmpOp"} = "";
$elt{"Version"} = ""; $elt{"Version"} = "";
} }
push @or, \%elt; push @or, \%elt;
@ -640,14 +627,14 @@ sub read_virtualdepends {
$$i++ $$i++
} }
# Now look at the alternatives on the following lines # Now look at the alternatives on the following lines
while ($lines->[$$i] =~ m/^\s{4}(\S+)( \((\d+) (\S+)\))*/) { while ($lines->[$$i] =~ m/^\s{4}(\S+)( \((\S+) (\S+)\))*/) {
my %elt; my %elt;
$elt{"Package"} = $1; $elt{"Package"} = $1;
if (defined $2) { if (defined $2) {
$elt{"CmpOp"} = $3 & 15; $elt{"CmpOp"} = $3;
$elt{"Version"} = $4; $elt{"Version"} = $4;
} else { } else {
$elt{"CmpOp"} = $DEPCOMPARE_NOP; $elt{"CmpOp"} = "";
$elt{"Version"} = ""; $elt{"Version"} = "";
} }
push @or, \%elt; push @or, \%elt;
@ -658,7 +645,7 @@ sub read_virtualdepends {
} else { } else {
my %elt; my %elt;
$elt{"Package"} = $virtual; $elt{"Package"} = $virtual;
$elt{"CmpOp"} = $DEPCOMPARE_NOP; $elt{"CmpOp"} = "";
$elt{"Version"} = ""; $elt{"Version"} = "";
push @or, \%elt; push @or, \%elt;
return \@or; return \@or;
@ -784,7 +771,7 @@ sub get_missing {
my $dep_text; my $dep_text;
$t{"Package"} = $p; $t{"Package"} = $p;
$t{"CmpOp"} = $DEPCOMPARE_NOP; $t{"CmpOp"} = "";
$t{"Version"} = ""; $t{"Version"} = "";
if (not add_missing (\@deps_list, $packages{$p}{"Depends"}, \%t, 0, \@parents)) { if (not add_missing (\@deps_list, $packages{$p}{"Depends"}, \%t, 0, \@parents)) {