aboutsummaryrefslogtreecommitdiffstats
path: root/URPM/Resolve.pm
diff options
context:
space:
mode:
authorFrancois Pons <fpons@mandriva.com>2003-03-12 18:16:31 +0000
committerFrancois Pons <fpons@mandriva.com>2003-03-12 18:16:31 +0000
commitb73e161f4c85132e6c12d67a4ec413f9118659b1 (patch)
tree231d2ea08662f24002c0ca6c05c9ca7bebb73c0e /URPM/Resolve.pm
parent7a020dddcbfe8607021850068d967e2ae7305cb6 (diff)
downloadperl-URPM-b73e161f4c85132e6c12d67a4ec413f9118659b1.tar
perl-URPM-b73e161f4c85132e6c12d67a4ec413f9118659b1.tar.gz
perl-URPM-b73e161f4c85132e6c12d67a4ec413f9118659b1.tar.bz2
perl-URPM-b73e161f4c85132e6c12d67a4ec413f9118659b1.tar.xz
perl-URPM-b73e161f4c85132e6c12d67a4ec413f9118659b1.zip
0.81-13mdk
Diffstat (limited to 'URPM/Resolve.pm')
-rw-r--r--URPM/Resolve.pm31
1 files changed, 25 insertions, 6 deletions
diff --git a/URPM/Resolve.pm b/URPM/Resolve.pm
index 004e894..dc424fb 100644
--- a/URPM/Resolve.pm
+++ b/URPM/Resolve.pm
@@ -84,13 +84,16 @@ sub unsatisfied_requires {
#- close ask_remove (as urpme previously) for package to be removable without error.
sub resolve_closure_ask_remove {
- my ($urpm, $db, $state, $pkg, $from, $why) = @_;
+ my ($urpm, $db, $state, $pkg, $from, $why, $avoided) = @_;
my $name = join '-', ($pkg->fullname)[0..2]; #- specila name (without arch) to allow selection.
my @unsatisfied;
#- allow default value for 'from' to be taken.
$from ||= $name;
+ #- keep track to avoided removed package.
+ $avoided and $avoided->{$pkg->fullname} = undef;
+
#- check if the package has already been asked to be removed,
#- this means only add the new reason and return.
unless ($state->{ask_remove}{$name}) {
@@ -122,6 +125,9 @@ sub resolve_closure_ask_remove {
if (my @l = $urpm->unsatisfied_requires($db, $state, $p, name => $n, keep_state => 1)) {
my $v = $state->{ask_remove}{join '-', ($p->fullname)[0..2]} ||= {};
+ #- keep track to avoided removed package.
+ $avoided and $avoided->{$p->fullname} = undef;
+
#- keep track of what cause closure.
$v->{closure}{$name} = { unsatisfied => \@l };
exists $v->{size} and return;
@@ -290,7 +296,8 @@ sub resolve_requested {
$allow = ++$state->{oldpackage};
$options{keep_state} or
push @properties, $urpm->resolve_closure_ask_remove($db, $state, $p, $pkg->id,
- { old_requested => 1 });
+ { old_requested => 1 },
+ \%avoided);
}
});
#- if nothing has been removed, just ignore it.
@@ -382,7 +389,8 @@ sub resolve_requested {
} else {
$options{keep_state} or
push @properties, $urpm->resolve_closure_ask_remove($db, $state, $p, $pkg->id,
- { unsatisfied => \@l });
+ { unsatisfied => \@l },
+ \%avoided);
}
}
}
@@ -401,13 +409,22 @@ sub resolve_requested {
#- examine conflicts, an existing package conflicting with this selection should
#- be upgraded to a new version which will be safe, else it should be removed.
foreach ($pkg->conflicts) {
+ #- propagate conflicts to avoided.
+ if (my ($n, $o, $v) = /^([^\s\[]*)(?:\[\*\])?\s*\[?([^\s\]]*)\s*([^\s\]]*)/) {
+ foreach (keys %{$urpm->{provides}{$n} || {}}) {
+ my $p = $urpm->{depslist}[$_];
+ $p->name eq $n && (!$o || eval($p->compare($v) . $o . 0)) or next;
+ $avoided{$p->fullname} = $pkg->fullname;
+ }
+ }
if (my ($file) = /^(\/[^\s\[]*)/) {
$db->traverse_tag('path', [ $file ], sub {
my ($p) = @_;
#- all these packages should be removed.
$options{keep_state} or
push @properties, $urpm->resolve_closure_ask_remove($db, $state, $p, $pkg->id,
- { conflicts => $file });
+ { conflicts => $file },
+ \%avoided);
});
} elsif (my ($property, $name) = /^(([^\s\[]*).*)/) {
$db->traverse_tag('whatprovides', [ $name ], sub {
@@ -428,7 +445,8 @@ sub resolve_requested {
#- no package have been found, we need to remove the package examined.
$options{keep_state} or
push @properties, $urpm->resolve_closure_ask_remove($db, $state, $p, $pkg->id,
- { conflicts => $property });
+ { conflicts => $property },
+ \%avoided);
}
}
});
@@ -453,7 +471,8 @@ sub resolve_requested {
#- all these packages should be removed.
$options{keep_state} or
push @properties, $urpm->resolve_closure_ask_remove($db, $state, $p, $pkg->id,
- { conflicts => $property });
+ { conflicts => $property },
+ \%avoided);
}
}
});