aboutsummaryrefslogtreecommitdiffstats
path: root/URPM/Resolve.pm
diff options
context:
space:
mode:
Diffstat (limited to 'URPM/Resolve.pm')
-rw-r--r--URPM/Resolve.pm35
1 files changed, 15 insertions, 20 deletions
diff --git a/URPM/Resolve.pm b/URPM/Resolve.pm
index d7bc84a..bdb470c 100644
--- a/URPM/Resolve.pm
+++ b/URPM/Resolve.pm
@@ -106,8 +106,6 @@ sub find_chosen_packages {
}
if (keys(%packages) > 1) {
- my ($mode, @chosen, @chosen_good_locales, @chosen_bad_locales, @chosen_other, @chosen_other_en, $install);
-
#- packages should be preferred if one of their provides is referenced
#- in the "requested" hash, or if the package itself is requested (or
#- required).
@@ -117,32 +115,27 @@ sub find_chosen_packages {
#- Puts the results in @chosen. Other are left unordered.
foreach my $p (values(%packages)) {
_set_flag_installed_and_upgrade_if_no_newer($db, $p);
+ }
- my $arch_score = ($p->is_arch_compat < min map { $_->is_arch_compat } @chosen) ? 10 : 0;
- if ($p->flag_requested && $p->flag_installed) {
- $arch_score += 3;
- $install = 1;
- } elsif ($p->flag_requested) {
- $arch_score += 2;
- } elsif ($p->flag_installed) {
- $arch_score += 1;
- }
- if ($mode > $arch_score) {
- next;
- } elsif ($mode < $arch_score) {
- @chosen = ();
- }
- $mode = $arch_score;
+ my ($best, @other) = sort {
+ $a->[1] <=> $b->[1] #- we want the lowest (ie preferred arch)
+ || $b->[2] <=> $a->[2]; #- and the higher
+ } map {
+ my $score = 0;
+ $score += 2 if $_->flag_requested;
+ $score += 1 if $_->flag_installed;
+ [ $_, $_->is_arch_compat, $score ];
+ } values %packages;
- push @chosen, $p;
- }
+ my @chosen_with_score = ($best, grep { $_->[1] == $best->[1] && $_->[2] == $best->[2] } @other);
+ my @chosen = map { $_->[0] } @chosen_with_score;
#- return immediately if there is only one chosen package
if (@chosen == 1) { return @chosen }
#- if several packages were selected to match a requested installation,
#- and if --more-choices wasn't given, trim the choices to the first one.
- if (!$urpm->{options}{morechoices} && $install && @chosen > 1) {
+ if (!$urpm->{options}{morechoices} && @chosen > 1 && $chosen_with_score[0][2] == 3) {
return $chosen[0];
}
@@ -160,6 +153,8 @@ sub find_chosen_packages {
return @k_chosen if $stripped_kernel;
}
+ my (@chosen_good_locales, @chosen_bad_locales, @chosen_other, @chosen_other_en);
+
#- Now we split @chosen in priority lists depending on locale.
#- Packages that require locales-xxx when the corresponding locales are
#- already installed should be preferred over packages that require locales