summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorespie <espie@openbsd.org>2009-12-27 22:26:28 +0000
committerespie <espie@openbsd.org>2009-12-27 22:26:28 +0000
commitc7d0e823c41d74cf5a24c57d0c7d9ed4089e2d52 (patch)
tree9d6025f68dede127445a7d7d0ad7e3589721f8c1
parentsolver is no longer needed at that point, so kill it. this shaves a bit of (diff)
downloadwireguard-openbsd-c7d0e823c41d74cf5a24c57d0c7d9ed4089e2d52.tar.xz
wireguard-openbsd-c7d0e823c41d74cf5a24c57d0c7d9ed4089e2d52.zip
check for loops and merge sets, in case we end up with real funky depends.
also, reset package->{before} before solving depends, since we may solve them several times.
-rw-r--r--usr.sbin/pkg_add/OpenBSD/Dependencies.pm33
1 files changed, 32 insertions, 1 deletions
diff --git a/usr.sbin/pkg_add/OpenBSD/Dependencies.pm b/usr.sbin/pkg_add/OpenBSD/Dependencies.pm
index d21f2cb2c8b..4aac0a5abcb 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.100 2009/12/26 21:14:57 espie Exp $
+# $OpenBSD: Dependencies.pm,v 1.101 2009/12/27 22:26:28 espie Exp $
#
# Copyright (c) 2005-2007 Marc Espie <espie@openbsd.org>
#
@@ -210,6 +210,36 @@ sub new
deplist => [], to_register => {}, all_dependencies => {} }, $class;
}
+sub check_for_loops
+{
+ my ($self, $state) = @_;
+
+ my $initial = $self->{set};
+
+ my @todo = ();
+ push(@todo, $initial);
+ my $done = {};
+
+ while (my $set = shift @todo) {
+ next unless defined $set->{solver};
+ for my $l (@{$set->{solver}->{deplist}}) {
+ next if $done->{$l};
+ push(@todo, $l);
+ if ($l eq $initial) {
+ my $k = $set;
+ while ($k ne $initial) {
+ $initial->merge($state->tracker, $k);
+ $k = $done->{$k};
+ }
+ $state->say("Merging ", $initial->print, $state->ntogo);
+ return 1;
+ }
+ $done->{$l} = $set;
+ }
+ }
+ return 0;
+}
+
sub dependencies
{
my $self = shift;
@@ -347,6 +377,7 @@ sub solve_depends
my ($self, $state) = @_;
for my $package ($self->{set}->newer) {
+ $package->{before} = [];
for my $dep (@{$package->{plist}->{depend}}) {
my $v = $self->solve_dependency($state, $dep, $package);
$self->{all_dependencies}->{$v} = $dep;