summaryrefslogtreecommitdiffstats
path: root/urpm
diff options
context:
space:
mode:
Diffstat (limited to 'urpm')
-rw-r--r--urpm/select.pm42
1 files changed, 26 insertions, 16 deletions
diff --git a/urpm/select.pm b/urpm/select.pm
index 14ae77fc..c8cf47a3 100644
--- a/urpm/select.pm
+++ b/urpm/select.pm
@@ -72,8 +72,27 @@ sub build_listid_ {
#- fuzzy
#- src
#- use_provides
+#-
+#- side-effects: $packages, flag_skip
sub search_packages {
my ($urpm, $packages, $names, %options) = @_;
+
+ my ($name2ids, $result) = _search_packages($urpm, $names, %options) or return;
+
+ foreach my $v (@$names) {
+ $packages->{$name2ids->{$v}} = 1;
+ foreach (split /\|/, $name2ids->{$v}) {
+ my $pkg = $urpm->{depslist}[$_] or next;
+ $urpm->{debug} and $urpm->{debug}("search_packages: found " . $pkg->fullname . " matching $v");
+ $pkg->set_flag_skip(0); #- reset skip flag as manually selected.
+ }
+ }
+ $result;
+}
+
+#- side-effects: none
+sub _search_packages {
+ my ($urpm, $names, %options) = @_;
my (%exact, %exact_a, %exact_ra, %found, %foundi);
foreach my $v (@$names) {
my $qv = quotemeta $v;
@@ -141,15 +160,10 @@ sub search_packages {
}
my $result = 1;
+ my %name2ids;
foreach my $v (@$names) {
- if (defined $exact{$v}) {
-
- $packages->{$exact{$v}} = 1;
- foreach (split /\|/, $exact{$v}) {
- my $pkg = $urpm->{depslist}[$_] or next;
- $urpm->{debug} and $urpm->{debug}("search_packages: found " . $pkg->fullname . " matching $v");
- $pkg->set_flag_skip(0); #- reset skip flag as manually selected.
- }
+ if (defined $exact{$v}) {
+ $name2ids{$v} = $exact{$v};
} else {
#- at this level, we need to search the best package given for a given name,
#- always prefer already found package.
@@ -164,7 +178,7 @@ sub search_packages {
N("The following packages contain %s: %s",
$v, "\n" . join("\n", sort { $a cmp $b } keys %l))
);
- $result = 0;
+ return;
} else {
if (!@{$exact_a{$v} || $exact_ra{$v} || []}) {
#- we found a non-exact match
@@ -180,18 +194,14 @@ sub search_packages {
}
}
my @l = grep { $_->fullname eq $best->fullname } @$_;
- $packages->{join('|', map { $_->id } @l)} = 1;
- foreach my $pkg (@l) {
- $urpm->{debug} and $urpm->{debug}("search_packages: found " . $pkg->fullname . " matching $v");
- $pkg->set_flag_skip(0); #- reset skip flag as manually selected.
- }
+ $name2ids{$v} = join('|', map { $_->id } @l);
}
}
}
}
- #- return true if no error has been encountered, else false.
- $result;
+ #- return 0 if error, 'substring' if fuzzy match, 1 if ok
+ \%name2ids, $result;
}
#- Resolves dependencies between requested packages (and auto selection if any).