summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorespie <espie@openbsd.org>2009-12-29 18:16:14 +0000
committerespie <espie@openbsd.org>2009-12-29 18:16:14 +0000
commit1ac9726755a16eaf102ddc10469117325569a4c8 (patch)
tree39806597ad5324af5a22bf65b69915f43b78193f
parentsort previous; (diff)
downloadwireguard-openbsd-1ac9726755a16eaf102ddc10469117325569a4c8.tar.xz
wireguard-openbsd-1ac9726755a16eaf102ddc10469117325569a4c8.zip
a few more tweaks:
- allow for merged updates if we want them - deplist becomes a hash, maybe useful for big sets - simplify loop checking. We don't actually care whether we find any. - be more aggressive in keeping cached stuff, create solver or conflict_cache if need be.
-rw-r--r--usr.sbin/pkg_add/OpenBSD/Dependencies.pm47
-rw-r--r--usr.sbin/pkg_add/OpenBSD/ForwardDependencies.pm9
-rw-r--r--usr.sbin/pkg_add/OpenBSD/UpdateSet.pm33
-rw-r--r--usr.sbin/pkg_add/pkg_add47
4 files changed, 83 insertions, 53 deletions
diff --git a/usr.sbin/pkg_add/OpenBSD/Dependencies.pm b/usr.sbin/pkg_add/OpenBSD/Dependencies.pm
index 57e1faff2d3..2aee91b50df 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.109 2009/12/29 15:21:02 espie Exp $
+# $OpenBSD: Dependencies.pm,v 1.110 2009/12/29 18:16:14 espie Exp $
#
# Copyright (c) 2005-2007 Marc Espie <espie@openbsd.org>
#
@@ -223,8 +223,7 @@ sub do
return $$v;
}
if ($state->tracker->{to_install}{$$v}) {
- push(@{$solver->{deplist}},
- $state->tracker->{to_install}{$$v});
+ $solver->add_dep($state->tracker->{to_install}{$$v});
return $$v;
}
return;
@@ -236,8 +235,7 @@ sub do
{
my ($v, $solver, $state, $dep, $package) = @_;
if ($state->tracker->{to_update}{$$v}) {
- push(@{$solver->{deplist}},
- $state->tracker->{to_update}{$$v});
+ $solver->add_dep($state->tracker->{to_update}{$$v});
return $$v;
}
if ($state->tracker->{uptodate}{$$v}) {
@@ -277,6 +275,12 @@ use OpenBSD::PackageInfo;
my $global_cache = {};
+sub add_dep
+{
+ my ($self, $d) = @_;
+ $self->{deplist}{$d} = $d;
+}
+
sub merge
{
my ($solver, @extra) = @_;
@@ -314,7 +318,7 @@ sub check_for_loops
while (my $set = shift @todo) {
next unless defined $set->{solver};
- for my $l (@{$set->solver->{deplist}}) {
+ for my $l (values %{$set->solver->{deplist}}) {
if ($l eq $initial) {
push(@to_merge, $set);
}
@@ -331,16 +335,18 @@ sub check_for_loops
for my $set (@to_merge) {
my $k = $set;
while ($k ne $initial && !$merged->{$k}) {
- $state->say("| ", $k->print);
- push(@real, $k);
+ unless ($k->{finished}) {
+ $state->say("| ", $k->print);
+ delete $k->solver->{deplist};
+ push(@real, $k);
+ }
$merged->{$k} = 1;
$k = $done->{$k};
}
}
+ delete $initial->solver->{deplist};
$initial->merge($state->tracker, @real);
- return 1;
}
- return 0;
}
sub dependencies
@@ -406,7 +412,7 @@ sub find_dep_in_stuff_to_install
if (@candidates > 0) {
for my $k (@candidates) {
my $set = $state->tracker->{to_update}{$k};
- push(@{$self->{deplist}}, $set);
+ $self->add_dep($set);
}
if (@candidates == 1) {
$self->set_cache($dep,
@@ -418,7 +424,7 @@ sub find_dep_in_stuff_to_install
$v = find_candidate($dep->spec, keys %{$state->tracker->{to_install}});
if ($v) {
$self->set_cache($dep, _cache::to_install->new($v));
- push(@{$self->{deplist}}, $state->tracker->{to_install}->{$v});
+ $self->add_dep($state->tracker->{to_install}->{$v});
}
return $v;
}
@@ -495,7 +501,7 @@ sub solve_dependency
return $v;
}
my $set = OpenBSD::UpdateSet->new->add_older(OpenBSD::Handle->create_old($v, $state));
- push(@{$self->{deplist}}, $set);
+ $self->add_dep($set);
$state->tracker->todo($set);
}
return $v;
@@ -511,7 +517,7 @@ sub solve_dependency
$state->tracker->todo($s);
- push(@{$self->{deplist}}, $s);
+ $self->add_dep($s);
$self->set_cache($dep, _cache::to_install->new($v->{name}));
return $v->{name};
}
@@ -520,7 +526,7 @@ sub solve_dependency
$v = $dep->{def};
my $s = OpenBSD::UpdateSet->create_new($v);
$state->tracker->todo($s);
- push(@{$self->{deplist}}, $s);
+ $self->add_dep($s);
return $v;
}
@@ -530,7 +536,7 @@ sub solve_depends
$self->{all_dependencies} = {};
$self->{to_register} = {};
- $self->{deplist} = [];
+ $self->{deplist} = {};
$self->{installed} = [];
for my $package ($self->{set}->newer) {
@@ -542,7 +548,7 @@ sub solve_depends
}
}
- return @{$self->{deplist}};
+ return values %{$self->{deplist}};
}
sub check_depends
@@ -565,9 +571,9 @@ sub dump
print "Direct dependencies for ", $self->{set}->print,
" resolve to: ", join(', ', $self->dependencies);
print " (todo: ",
- join(',', (map {$_->print} @{$self->{deplist}})),
+ join(',', (map {$_->print} values %{$self->{deplist}})),
")"
- if @{$self->{deplist}} > 0;
+ if %{$self->{deplist}};
print "\n";
}
}
@@ -586,9 +592,6 @@ sub register_dependencies
OpenBSD::RequiredBy->new($dep)->add($pkgname);
}
}
- delete $self->{toregister};
- delete $self->{all_dependencies};
- delete $self->{deplist};
}
sub repair_dependencies
diff --git a/usr.sbin/pkg_add/OpenBSD/ForwardDependencies.pm b/usr.sbin/pkg_add/OpenBSD/ForwardDependencies.pm
index 013e272bc25..5546bd930bd 100644
--- a/usr.sbin/pkg_add/OpenBSD/ForwardDependencies.pm
+++ b/usr.sbin/pkg_add/OpenBSD/ForwardDependencies.pm
@@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
-# $OpenBSD: ForwardDependencies.pm,v 1.3 2009/12/28 21:28:35 espie Exp $
+# $OpenBSD: ForwardDependencies.pm,v 1.4 2009/12/29 18:16:14 espie Exp $
#
# Copyright (c) 2009 Marc Espie <espie@openbsd.org>
#
@@ -66,13 +66,14 @@ sub check
my @r = keys %$forward;
- return if @r == 0;
+ my $result = {};
+
+ return $result if @r == 0;
$state->say("Verifying dependencies still match for ",
join(', ', @r)) if $state->verbose >= 2;
my @new = ($set->newer_names, $set->kept_names);
my @old = $set->older_names;
- my $result = {};
for my $f (@r) {
my $p2 = OpenBSD::PackingList->from_installation(
@@ -83,7 +84,7 @@ sub check
$p2->check_forward_dependency($f, \@old, \@new, $result);
}
}
- if (keys %$result > 0) {
+ if (%$result) {
$state->say($set->print, " forward dependencies:");
while (my ($pkg, $l) = each %$result) {
my $deps = join(',', map {$_->{pattern}} @$l);
diff --git a/usr.sbin/pkg_add/OpenBSD/UpdateSet.pm b/usr.sbin/pkg_add/OpenBSD/UpdateSet.pm
index d63d5650847..acead1c5c6f 100644
--- a/usr.sbin/pkg_add/OpenBSD/UpdateSet.pm
+++ b/usr.sbin/pkg_add/OpenBSD/UpdateSet.pm
@@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
-# $OpenBSD: UpdateSet.pm,v 1.44 2009/12/29 13:51:50 espie Exp $
+# $OpenBSD: UpdateSet.pm,v 1.45 2009/12/29 18:16:14 espie Exp $
#
# Copyright (c) 2007-2009 Marc Espie <espie@openbsd.org>
#
@@ -105,6 +105,15 @@ sub add_older
return $self;
}
+sub add_kept
+{
+ my $self = shift;
+ for my $h (@_) {
+ $self->{kept}->{$h->pkgname} = $h;
+ }
+ return $self;
+}
+
sub move_kept
{
my $self = shift;
@@ -218,7 +227,12 @@ sub print
sub short_print
{
my $self = shift;
- return join('+', sort $self->newer_names);
+ my $result = join('+', sort $self->newer_names);
+ if (length $result > 30) {
+ return substr($result, 0, 27)."...";
+ } else {
+ return $result;
+ }
}
sub validate_plists
@@ -278,9 +292,13 @@ sub merge_if_exists
{
my ($self, $k, @extra) = @_;
- if (defined $self->{$k}) {
- $self->{$k}->merge(map {$_->{$k}} @extra);
+ my @list = ();
+ for my $s (@extra) {
+ if ($s ne $self && defined $s->{$k}) {
+ push(@list, $s->{$k});
+ }
}
+ $self->$k->merge(@list);
}
# Merge several updatesets together
@@ -292,8 +310,10 @@ sub merge
$self->merge_if_exists('conflict_cache', @sets);
# Apparently simple, just add the missing parts
for my $set (@sets) {
+ next if $set eq $self;
$self->add_newer($set->newer);
$self->add_older($set->older);
+ $self->add_kept($set->kept);
# ... and mark it as already done
$set->{finished} = 1;
$tracker->handle_set($set);
@@ -301,12 +321,11 @@ sub merge
$set->{updates} = 0;
# XXX and mark it as merged, for eventual updates
$set->{merged} = $self;
+ delete $set->{solver};
+ delete $set->{conflict_cache};
}
# then regen tracker info for $self
$tracker->todo($self);
- if (defined $self->{solver}) {
- delete $self->{solver}->{deplist};
- }
return $self;
}
diff --git a/usr.sbin/pkg_add/pkg_add b/usr.sbin/pkg_add/pkg_add
index a1d74f195d0..95aaf3b5c42 100644
--- a/usr.sbin/pkg_add/pkg_add
+++ b/usr.sbin/pkg_add/pkg_add
@@ -1,7 +1,7 @@
#! /usr/bin/perl
# ex:ts=8 sw=4:
-# $OpenBSD: pkg_add,v 1.448 2009/12/29 14:29:49 espie Exp $
+# $OpenBSD: pkg_add,v 1.449 2009/12/29 18:16:14 espie Exp $
#
# Copyright (c) 2003-2009 Marc Espie <espie@openbsd.org>
#
@@ -340,25 +340,30 @@ sub check_forward_dependencies
$set->{forward} = OpenBSD::ForwardDependencies->find($set);
my $bad = $set->{forward}->check($state);
- if (keys %$bad > 0) {
-# for my $m (keys %$bad) {
-# my $s = $state->tracker->is_to_update($m);
-# if (defined $s) {
-# $set->merge($state->tracker, $s);
-# } else {
-# $set->add_older(OpenBSD::Handle->create_old($m,
-# $state));
-# }
-# }
-# $state->say("Merging ", $set->print, $state->ntogo);
-# return;
- if ($state->{defines}->{updatedepends}) {
- $state->errsay("Forcing update");
+ if (%$bad) {
+ if ($state->{defines}->{mergeupdates}) {
+ for my $m (keys %$bad) {
+ my $s = $state->tracker->is_to_update($m);
+ if (defined $s) {
+ $set->merge($state->tracker, $s);
+ } else {
+ $set->add_older(OpenBSD::Handle->create_old(
+ $m, $state));
+ }
+ }
+ $state->say("Merging ", $set->print, $state->ntogo);
+ return 0;
+ } elsif ($state->{defines}->{updatedepends}) {
+ $state->errsay("Forcing update");
+ return 1;
} elsif ($state->{interactive}) {
if ($state->confirm("Proceed with update anyways", 0)) {
+ return 1;
+ } else {
+ return undef;
}
} else {
- return 0;
+ return undef;
}
}
return 1;
@@ -717,17 +722,19 @@ sub install_set
}
if (@deps > 0) {
$state->build_deptree($set, @deps);
- if ($set->solver->check_for_loops($state)) {
- return $set;
- }
+ $set->solver->check_for_loops($state);
return (@deps, $set);
}
if ($set->older_to_do) {
- if (!$set->check_forward_dependencies($state)) {
+ my $r = $set->check_forward_dependencies($state);
+ if (!defined $r) {
$set->cleanup(OpenBSD::Handle::CANT_INSTALL);
$state->tracker->cant($set);
return ();
+ }
+ if ($r == 0) {
+ return $set;
}
}