diff options
author | 2018-06-22 21:29:06 +0000 | |
---|---|---|
committer | 2018-06-22 21:29:06 +0000 | |
commit | 4314c9e94d9655bfbfd8f55fb8ddc63723a39c7d (patch) | |
tree | d6c2d4861000a32ef2df06537d942f9d660b617d | |
parent | as discussed with aja@, some commands must be run once for every distinct (diff) | |
download | wireguard-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.pm | 74 | ||||
-rw-r--r-- | usr.sbin/pkg_add/OpenBSD/Dependencies/SolverBase.pm | 74 | ||||
-rw-r--r-- | usr.sbin/pkg_add/OpenBSD/PkgCreate.pm | 38 |
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 |