diff options
author | 2020-11-09 13:28:31 +0000 | |
---|---|---|
committer | 2020-11-09 13:28:31 +0000 | |
commit | 02ee83fa922635e80f6104f6f02c6ba2fc1455d2 (patch) | |
tree | 9ea51e68903de857a36ad6a4c56e82961d631609 | |
parent | reword confusing message (diff) | |
download | wireguard-openbsd-02ee83fa922635e80f6104f6f02c6ba2fc1455d2.tar.xz wireguard-openbsd-02ee83fa922635e80f6104f6f02c6ba2fc1455d2.zip |
fix indirect dependencies bug: match what pkg_add does by adding tag
definitions to the list of RequiredBy.
requires passing the pkgname around for the special case where tag and
define-tag are in the same location, so use that info for better diagnostics
Note that this loses the optimization where we only need read DependsOnly
this can be addressed later by storing stub packing-lists with only relevant
info during the first pass, so that we don't have to read them again
-rw-r--r-- | usr.sbin/pkg_add/OpenBSD/PkgCheck.pm | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/usr.sbin/pkg_add/OpenBSD/PkgCheck.pm b/usr.sbin/pkg_add/OpenBSD/PkgCheck.pm index 20c259d10f4..3d929aef017 100644 --- a/usr.sbin/pkg_add/OpenBSD/PkgCheck.pm +++ b/usr.sbin/pkg_add/OpenBSD/PkgCheck.pm @@ -1,7 +1,7 @@ #! /usr/bin/perl # ex:ts=8 sw=4: -# $OpenBSD: PkgCheck.pm,v 1.72 2020/11/09 12:39:29 espie Exp $ +# $OpenBSD: PkgCheck.pm,v 1.73 2020/11/09 13:28:31 espie Exp $ # # Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org> # @@ -74,6 +74,20 @@ sub find_dependencies { } +sub mark_indirect_depends +{ + my $self = shift; + $self->mark_available_lib(@_); +} + +package OpenBSD::PackingElement::DefineTag; + +sub mark_indirect_depends +{ + my ($self, $pkgname, $state) = @_; + $state->{tagdefinition}{$self->name} = $pkgname; +} + package OpenBSD::PackingElement::FileBase; use File::Basename; @@ -222,7 +236,7 @@ sub basic_check package OpenBSD::PackingElement::Dependency; sub find_dependencies { - my ($self, $state, $l, $checker) = @_; + my ($self, $state, $l, $checker, $pkgname) = @_; # several ways to failure if (!$self->spec->is_valid) { $state->log("invalid \@", $self->keyword, " ", @@ -231,8 +245,8 @@ sub find_dependencies } my @deps = $self->spec->filter(@$l); if (@deps == 0) { - $state->log("dependency #1 does not match any installed package", - $self->stringize); + $state->log("dependency #1 in #2 does not match any installed package", + $self->stringize, $pkgname); return; } my $okay = 0; @@ -249,7 +263,7 @@ sub find_dependencies package OpenBSD::PackingElement::Wantlib; sub find_dependencies { - my ($self, $state, $l, $checker) = @_; + my ($self, $state, $l, $checker, $pkgname) = @_; my $r = OpenBSD::SharedLibs::lookup_libspec($state->{localbase}, $self->spec); if (defined $r && @$r != 0) { @@ -269,7 +283,24 @@ sub find_dependencies $checker->not_found($r->[0]->origin); } } else { - $state->log("#1 not found", $self->stringize); + $state->log("#1 in #2 not found", $self->stringize, $pkgname); + } +} + +package OpenBSD::PackingElement::Tag; +sub find_dependencies +{ + my ($self, $state, $l, $checker, $pkgname) = @_; + my $location = $state->{tagdefinition}{$self->name}; + if (defined $location) { + if ($location eq $pkgname) { + return; + } + if (!$checker->find($location)) { + $checker->not_found($location); + } + } else { + $state->log("definition for #1 not found", $self->stringize); } } @@ -781,7 +812,7 @@ sub sanity_check $state->errsay("#1: pkgname does not match", $name); $self->may_remove($state, $name); } - $plist->mark_available_lib($plist->pkgname, $state); + $plist->mark_indirect_depends($plist->pkgname, $state); $state->{exists}{$plist->pkgname} = 1; }); } @@ -793,12 +824,11 @@ sub dependencies_check $self->for_all_packages($state, $l, "Direct dependencies", sub { my $name = shift; $state->log->set_context($name); - my $plist = OpenBSD::PackingList->from_installation($name, - \&OpenBSD::PackingList::DependOnly); + my $plist = OpenBSD::PackingList->from_installation($name); my $checker = OpenBSD::DirectDependencyCheck->new($state, $name); $state->{localbase} = $plist->localbase; - $plist->find_dependencies($state, $l, $checker); + $plist->find_dependencies($state, $l, $checker, $name); $checker->adjust($state); for my $dep ($checker->{req}->list) { push(@{$state->{reverse}{$dep}}, $name); |