aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--URPM/Resolve.pm82
1 files changed, 40 insertions, 42 deletions
diff --git a/URPM/Resolve.pm b/URPM/Resolve.pm
index 9e34c0c..a24a6ce 100644
--- a/URPM/Resolve.pm
+++ b/URPM/Resolve.pm
@@ -192,36 +192,48 @@ sub _find_chosen_packages__sort {
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
- #- which are not installed.
- foreach (@chosen) {
- my @r = $_->requires_nosense;
- if (my ($specific_locales) = grep { /locales-(?!en)/ } @r) {
- if ((grep { $urpm->{depslist}[$_]->flag_available } keys %{$urpm->{provides}{$specific_locales}}) > 0 ||
- $db->traverse_tag('name', [ $specific_locales ], undef) > 0) {
- push @chosen_good_locales, $_;
- } else {
- push @chosen_bad_locales, $_;
- }
- } else {
- if (grep /locales-en/, @r) {
- push @chosen_other_en, $_;
- } else {
- push @chosen_other, $_;
- }
- }
+ if ($urpm->{media}) {
+ @chosen_with_score = sort {
+ $a->[2] != $b->[2] ?
+ $a->[0]->id <=> $b->[0]->id :
+ $b->[1] <=> $a->[1] || $b->[0]->compare_pkg($a->[0]);
+ } map { [ $_, _score_for_locales($urpm, $db, $_), pkg2media($urpm->{media}, $_) ] } @chosen;
+ } else {
+ $urpm->{debug_URPM}("can't sort choices by media") if $urpm->{debug_URPM};
+ @chosen_with_score = sort {
+ $b->[1] <=> $a->[1] ||
+ $b->[0]->compare_pkg($a->[0]) || $a->[0]->id <=> $b->[0]->id;
+ } map { [ $_, _score_for_locales($urpm, $db, $_) ] } @chosen;
+ }
+ if (!$urpm->{options}{morechoices}) {
+ if (my @valid_locales = grep { $_->[1] } @chosen_with_score) {
+ #- get rid of invalid locales
+ @chosen_with_score = @valid_locales;
}
+ }
+ map { $_->[0] } @chosen_with_score;
+}
- #- sort packages in order to have preferred ones first
- #- (this means good locales, no locales, bad locales).
- return sort_package_result($urpm, @chosen_good_locales),
- sort_package_result($urpm, @chosen_other_en),
- sort_package_result($urpm, @chosen_other),
- sort_package_result($urpm, @chosen_bad_locales);
+#- Packages that require locales-xxx when the corresponding locales are
+#- already installed should be preferred over packages that require locales
+#- which are not installed.
+sub _score_for_locales {
+ my ($urpm, $db, $pkg) = @_;
+
+ my @r = $pkg->requires_nosense;
+
+ if (my ($specific_locales) = grep { /locales-(?!en)/ } @r) {
+ if ((grep { $urpm->{depslist}[$_]->flag_available } keys %{$urpm->{provides}{$specific_locales}}) > 0 ||
+ $db->traverse_tag('name', [ $specific_locales ], undef) > 0) {
+ 3; # good locale
+ } else {
+ 0; # bad locale
+ }
+ } elsif (grep { /locales-en/ } @r) {
+ 2; #
+ } else {
+ 1;
+ }
}
sub find(&@) {
@@ -235,20 +247,6 @@ sub pkg2media {
find { $id >= $_->{start} && $id <= $_->{end} } @$mediums;
}
-sub sort_package_result {
- my ($urpm, @l) = @_;
- if ($urpm->{media}) {
- map { $_->[0] } sort {
- $a->[1] != $b->[1] ?
- $a->[0]->id <=> $b->[0]->id :
- $b->[0]->compare_pkg($a->[0]);
- } map { [ $_, pkg2media($urpm->{media}, $_) ] } @l;
- } else {
- $urpm->{debug_URPM}("can't sort choices by media") if $urpm->{debug_URPM};
- sort { $b->compare_pkg($a) || $a->id <=> $b->id } @l;
- }
-}
-
sub whatrequires {
my ($urpm, $state, $property_name) = @_;