summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorespie <espie@openbsd.org>2020-11-09 13:28:31 +0000
committerespie <espie@openbsd.org>2020-11-09 13:28:31 +0000
commit02ee83fa922635e80f6104f6f02c6ba2fc1455d2 (patch)
tree9ea51e68903de857a36ad6a4c56e82961d631609
parentreword confusing message (diff)
downloadwireguard-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.pm50
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);