summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorespie <espie@openbsd.org>2018-06-22 21:29:06 +0000
committerespie <espie@openbsd.org>2018-06-22 21:29:06 +0000
commit4314c9e94d9655bfbfd8f55fb8ddc63723a39c7d (patch)
treed6c2d4861000a32ef2df06537d942f9d660b617d
parentas discussed with aja@, some commands must be run once for every distinct (diff)
downloadwireguard-openbsd-4314c9e94d9655bfbfd8f55fb8ddc63723a39c7d.tar.xz
wireguard-openbsd-4314c9e94d9655bfbfd8f55fb8ddc63723a39c7d.zip
move the tag base code into SolverBase, and use it in PkgCreate, so that
we refuse to create packages with tags without reachable definitions
-rw-r--r--usr.sbin/pkg_add/OpenBSD/Dependencies.pm74
-rw-r--r--usr.sbin/pkg_add/OpenBSD/Dependencies/SolverBase.pm74
-rw-r--r--usr.sbin/pkg_add/OpenBSD/PkgCreate.pm38
3 files changed, 107 insertions, 79 deletions
diff --git a/usr.sbin/pkg_add/OpenBSD/Dependencies.pm b/usr.sbin/pkg_add/OpenBSD/Dependencies.pm
index 6b7d5bf8586..79ce091d419 100644
--- a/usr.sbin/pkg_add/OpenBSD/Dependencies.pm
+++ b/usr.sbin/pkg_add/OpenBSD/Dependencies.pm
@@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
-# $OpenBSD: Dependencies.pm,v 1.167 2018/06/22 13:59:38 espie Exp $
+# $OpenBSD: Dependencies.pm,v 1.168 2018/06/22 21:29:06 espie Exp $
#
# Copyright (c) 2005-2010 Marc Espie <espie@openbsd.org>
#
@@ -20,63 +20,6 @@ use warnings;
use OpenBSD::SharedLibs;
use OpenBSD::Dependencies::SolverBase;
-package OpenBSD::lookup::tag;
-our @ISA=qw(OpenBSD::lookup);
-sub new
-{
- my ($class, $solver, $state) = @_;
-
- # prepare for closure
- if (!defined $solver->{old_dependencies}) {
- $solver->solve_old_depends($state);
- }
- my @todo = ($solver->dependencies, keys %{$solver->{old_dependencies}});
- bless { todo => \@todo, done => {}, known => {} }, $class;
-}
-
-sub find_in_extra_sources
-{
-}
-
-sub find_elsewhere
-{
-}
-
-sub find_in_already_done
-{
- my ($self, $solver, $state, $obj) = @_;
- my $r = $self->{known_tags}{$obj->name};
- if (defined $r) {
- my ($dep, $d) = @$r;
- $obj->{definition_list} = $d;
- $state->say("Found tag #1 in #2", $obj->stringize, $dep)
- if $state->verbose >= 3;
- }
- return $r;
-}
-
-sub find_in_plist
-{
- my ($self, $plist, $dep) = @_;
- if (defined $plist->{tags_definitions}) {
- while (my ($name, $d) = each %{$plist->{tags_definitions}}) {
- $self->{known_tags}{$name} = [$dep, $d];
- }
- }
-}
-
-sub find_in_new_source
-{
- my ($self, $solver, $state, $obj, $dep) = @_;
- my $plist = OpenBSD::PackingList->from_installation($dep,
- \&OpenBSD::PackingList::DependOnly);
- if (!defined $plist) {
- $state->errsay("Can't read plist for #1", $dep);
- }
- $self->find_in_plist($plist, $dep);
- return $self->find_in_already_done($solver, $state, $obj);
-}
-
package _cache;
sub new
@@ -437,21 +380,6 @@ sub errsay_library
$state->errsay("Can't install #1 because of libraries", $h->pkgname);
}
-sub find_in_self
-{
- my ($solver, $plist, $state, $tag) = @_;
- return 0 unless defined $plist->{tags_definitions};
- while (my ($name, $d) = each %{$plist->{tags_definitions}}) {
- next unless $tag->name eq $name;
- $tag->{definition_list} = $d;
- $tag->{found_in_self} = 1;
- $state->say("Found tag #1 in self", $tag->stringize)
- if $state->verbose >= 3;
- return 1;
- }
- return 0;
-}
-
sub solve_old_depends
{
my ($self, $state) = @_;
diff --git a/usr.sbin/pkg_add/OpenBSD/Dependencies/SolverBase.pm b/usr.sbin/pkg_add/OpenBSD/Dependencies/SolverBase.pm
index f9f912d514b..c7c03b35911 100644
--- a/usr.sbin/pkg_add/OpenBSD/Dependencies/SolverBase.pm
+++ b/usr.sbin/pkg_add/OpenBSD/Dependencies/SolverBase.pm
@@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
-# $OpenBSD: SolverBase.pm,v 1.2 2018/06/21 08:28:21 espie Exp $
+# $OpenBSD: SolverBase.pm,v 1.3 2018/06/22 21:29:06 espie Exp $
#
# Copyright (c) 2005-2018 Marc Espie <espie@openbsd.org>
#
@@ -182,6 +182,63 @@ sub find_elsewhere
return undef;
}
+package OpenBSD::lookup::tag;
+our @ISA=qw(OpenBSD::lookup);
+sub new
+{
+ my ($class, $solver, $state) = @_;
+
+ # prepare for closure
+ if (!defined $solver->{old_dependencies}) {
+ $solver->solve_old_depends($state);
+ }
+ my @todo = ($solver->dependencies, keys %{$solver->{old_dependencies}});
+ bless { todo => \@todo, done => {}, known => {} }, $class;
+}
+
+sub find_in_extra_sources
+{
+}
+
+sub find_elsewhere
+{
+}
+
+sub find_in_already_done
+{
+ my ($self, $solver, $state, $obj) = @_;
+ my $r = $self->{known_tags}{$obj->name};
+ if (defined $r) {
+ my ($dep, $d) = @$r;
+ $obj->{definition_list} = $d;
+ $state->say("Found tag #1 in #2", $obj->stringize, $dep)
+ if $state->verbose >= 3;
+ }
+ return $r;
+}
+
+sub find_in_plist
+{
+ my ($self, $plist, $dep) = @_;
+ if (defined $plist->{tags_definitions}) {
+ while (my ($name, $d) = each %{$plist->{tags_definitions}}) {
+ $self->{known_tags}{$name} = [$dep, $d];
+ }
+ }
+}
+
+sub find_in_new_source
+{
+ my ($self, $solver, $state, $obj, $dep) = @_;
+ my $plist = OpenBSD::PackingList->from_installation($dep,
+ \&OpenBSD::PackingList::DependOnly);
+ if (!defined $plist) {
+ $state->errsay("Can't read plist for #1", $dep);
+ }
+ $self->find_in_plist($plist, $dep);
+ return $self->find_in_already_done($solver, $state, $obj);
+}
+
# both the solver and the conflict cache inherit from cloner
# they both want to merge several hashes from extra data.
@@ -365,6 +422,21 @@ sub find_dep_in_self
$self->{set}->kept_names);
}
+sub find_in_self
+{
+ my ($solver, $plist, $state, $tag) = @_;
+ return 0 unless defined $plist->{tags_definitions};
+ while (my ($name, $d) = each %{$plist->{tags_definitions}}) {
+ next unless $tag->name eq $name;
+ $tag->{definition_list} = $d;
+ $tag->{found_in_self} = 1;
+ $state->say("Found tag #1 in self", $tag->stringize)
+ if $state->verbose >= 3;
+ return 1;
+ }
+ return 0;
+}
+
use OpenBSD::PackageInfo;
OpenBSD::Auto::cache(installed_list,
sub {
diff --git a/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm b/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm
index 639252687d3..4c3c077b96a 100644
--- a/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm
+++ b/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm
@@ -1,6 +1,6 @@
#! /usr/bin/perl
# ex:ts=8 sw=4:
-# $OpenBSD: PkgCreate.pm,v 1.144 2018/06/21 08:28:21 espie Exp $
+# $OpenBSD: PkgCreate.pm,v 1.145 2018/06/22 21:29:06 espie Exp $
#
# Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org>
#
@@ -867,7 +867,8 @@ our @ISA = qw(OpenBSD::Dependencies::SolverBase);
sub new
{
my ($class, $plist) = @_;
- bless { set => OpenBSD::PseudoSet->new($plist), bad => [] }, $class;
+ bless { set => OpenBSD::PseudoSet->new($plist),
+ old_dependencies => {}, bad => [] }, $class;
}
sub solve_all_depends
@@ -879,7 +880,8 @@ sub solve_all_depends
if (@todo == 0) {
return;
}
- if ($solver->solve_wantlibs($state, 0)) {
+ if ($solver->solve_wantlibs($state, 0) &&
+ $solver->solve_tags($state, 0)) {
return;
}
$solver->{set}->add_new(@todo);
@@ -892,11 +894,11 @@ sub solve_wantlibs
my $okay = 1;
my $lib_finder = OpenBSD::lookup::library->new($solver);
- my $h = $solver->{set}->{new}[0];
+ my $h = $solver->{set}{new}[0];
for my $lib (@{$h->{plist}{wantlib}}) {
$solver->{localbase} = $h->{plist}->localbase;
next if $lib_finder->lookup($solver,
- $solver->{to_register}->{$h}, $state,
+ $solver->{to_register}{$h}, $state,
$lib->spec);
$okay = 0;
OpenBSD::SharedLibs::report_problem($state,
@@ -909,6 +911,29 @@ sub solve_wantlibs
return $okay;
}
+sub solve_tags
+{
+ my ($solver, $state, $final) = @_;
+
+ my $okay = 1;
+ my $h = $solver->{set}{new}[0];
+ my $plist = $h->{plist};
+ $solver->{tag_finder} //= OpenBSD::lookup::tag->new($solver, $state);
+ return 1 if !defined $plist->{tags};
+ for my $tag (@{$plist->{tags}}) {
+ next if $solver->{tag_finder}->lookup($solver,
+ $solver->{to_register}{$h}, $state, $tag);
+ next if $solver->find_in_self($plist, $state, $tag);
+ $state->errsay("Can't do #1: tag definition not found #2",
+ $plist->pkgname, $tag->name) if $final;
+ $okay = 0;
+ }
+ if (!$okay && $final) {
+ $solver->dump($state);
+ }
+ return $okay;
+}
+
sub really_solve_dependency
{
my ($self, $state, $dep, $package) = @_;
@@ -1469,6 +1494,9 @@ sub check_dependencies
if (!$solver->solve_wantlibs($state, 1)) {
$state->{bad}++;
}
+ if (!$solver->solve_tags($state, 1)) {
+ $state->{bad}++;
+ }
}
sub finish_manpages