diff options
author | 2009-12-29 18:16:14 +0000 | |
---|---|---|
committer | 2009-12-29 18:16:14 +0000 | |
commit | 1ac9726755a16eaf102ddc10469117325569a4c8 (patch) | |
tree | 39806597ad5324af5a22bf65b69915f43b78193f | |
parent | sort previous; (diff) | |
download | wireguard-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.pm | 47 | ||||
-rw-r--r-- | usr.sbin/pkg_add/OpenBSD/ForwardDependencies.pm | 9 | ||||
-rw-r--r-- | usr.sbin/pkg_add/OpenBSD/UpdateSet.pm | 33 | ||||
-rw-r--r-- | usr.sbin/pkg_add/pkg_add | 47 |
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; } } |