use Dpkg::Gettext;
use Dpkg::ErrorHandling qw(error);
use Dpkg::Arch qw(get_host_arch);
+use Dpkg::Deps;
push(@INC,$dpkglibdir);
require 'controllib.pl';
parsecontrolfile($controlfile);
-my @status = parse_status("$admindir/status");
+my $facts = parse_status("$admindir/status");
my (@unmet, @conflicts);
my $dep_regex=qr/[ \t]*(([^\n]+|\n[ \t])*)\s/; # allow multi-line
if (defined($fi{"C Build-Depends"})) {
push @unmet, build_depends('Build-Depends',
- parsedep($fi{"C Build-Depends"}, 1, 1),
- @status);
+ Dpkg::Deps::parse($fi{"C Build-Depends"},
+ reduce_arch => 1), $facts);
}
if (defined($fi{"C Build-Conflicts"})) {
push @conflicts, build_conflicts('Build-Conflicts',
- parsedep($fi{"C Build-Conflicts"}, 1, 1),
- @status);
+ Dpkg::Deps::parse($fi{"C Build-Conflicts"},
+ reduce_arch => 1, union => 1), $facts);
}
if (! $binary_only && defined($fi{"C Build-Depends-Indep"})) {
push @unmet, build_depends('Build-Depends-Indep',
- parsedep($fi{"C Build-Depends-Indep"}, 1, 1),
- @status);
+ Dpkg::Deps::parse($fi{"C Build-Depends-Indep"},
+ reduce_arch => 1), $facts);
}
if (! $binary_only && defined($fi{"C Build-Conflicts-Indep"})) {
push @conflicts, build_conflicts('Build-Conflicts-Indep',
- parsedep($fi{"C Build-Conflicts-Indep"}, 1, 1),
- @status);
+ Dpkg::Deps::parse($fi{"C Build-Conflicts-Indep"},
+ reduce_arch => 1, union => 1), $facts);
}
if (@unmet) {
printf STDERR _g("%s: Unmet build dependencies: "), $progname;
- print STDERR join(" ", @unmet), "\n";
+ print STDERR join(" ", map { $_->dump() } @unmet), "\n";
}
if (@conflicts) {
printf STDERR _g("%s: Build conflicts: "), $progname;
- print STDERR join(" ", @conflicts), "\n";
+ print STDERR join(" ", map { $_->dump() } @conflicts), "\n";
}
exit 1 if @unmet || @conflicts;
-# This part could be replaced. Silly little status file parser.
-# thanks to Matt Zimmerman. Returns two hash references that
-# are exactly what the other functions need...
+# Silly little status file parser that returns a Dpkg::Deps::KnownFacts
sub parse_status {
my $status = shift;
- my %providers;
- my %version;
+ my $facts = Dpkg::Deps::KnownFacts->new();
local $/ = '';
open(STATUS, "<$status") || die "$status: $!\n";
while (<STATUS>) {
next unless /^Status: .*ok installed$/m;
my ($package) = /^Package: (.*)$/m;
- push @{$providers{$package}}, $package;
- ($version{$package}) = /^Version: (.*)$/m;
+ my ($version) = /^Version: (.*)$/m;
+ $facts->add_installed_package($package, $version);
if (/^Provides: (.*)$/m) {
- foreach (split(/,\s*/, $1)) {
- push @{$providers{$_}}, $package;
+ my $provides = Dpkg::Deps::parse($1,
+ reduce_arch => 1, union => 1);
+ next if not defined $provides;
+ foreach (grep { $_->isa('Dpkg::Deps::Simple') }
+ $provides->get_deps())
+ {
+ $facts->add_provided_package($_->{package},
+ $_->{relation}, $_->{version},
+ $package);
}
}
}
close STATUS;
- return \%version, \%providers;
+ return $facts;
}
# This function checks the build dependencies passed in as the first
my $build_depends=shift;
my $fieldname=shift;
my $dep_list=shift;
- my %version=%{shift()};
- my %providers=%{shift()};
+ my $facts=shift;
my $host_arch = shift || get_host_arch();
chomp $host_arch;
error(_g("error occurred while parsing %s"), $fieldname);
}
- foreach my $dep_and (@$dep_list) {
- my $ok=0;
- my @possibles=();
-ALTERNATE: foreach my $alternate (@$dep_and) {
- my ($package, $relation, $version, $arch_list)= @{$alternate};
-
- # This is a possibile way to meet the dependency.
- # Remove the arch stuff from $alternate.
- push @possibles, $package . ($relation && $version ? " ($relation $version)" : '');
-
- if ($relation && $version) {
- if (! exists $version{$package}) {
- # Not installed at all, so fail.
- next;
- }
- else {
- # Compare installed and needed
- # version number.
- system("dpkg", "--compare-versions",
- $version{$package}, $relation,
- $version);
- if (($? >> 8) != 0) {
- next; # fail
- }
- }
- }
- elsif (! defined $providers{$package}) {
- # It's not a versioned dependency, and
- # nothing provides it, so fail.
- next;
- }
- # If we get to here, the dependency was met.
- $ok=1;
+ if ($build_depends) {
+ $dep_list->simplify_deps($facts);
+ if ($dep_list->is_empty()) {
+ return ();
+ } else {
+ return $dep_list->get_deps();
}
-
- if (@possibles && (($build_depends && ! $ok) ||
- (! $build_depends && $ok))) {
- # TODO: this could return a more complex
- # data structure instead to save re-parsing.
- push @unmet, join (" | ", @possibles);
+ } else { # Build-Conflicts
+ my @conflicts = ();
+ foreach my $dep ($dep_list->get_deps()) {
+ if ($dep->get_evaluation($facts)) {
+ push @conflicts, $dep;
+ }
}
+ return @conflicts;
}
-
- return @unmet;
}