X-Git-Url: https://git.deb.at/?a=blobdiff_plain;ds=sidebyside;f=lib%2FPackages%2FSearch.pm;h=32ef1e2eedf00d9f8c455966cc2d0dd90f914b44;hb=a7c90835e393ff56dd9c84f022347554325bc916;hp=a88e5c973b648d7da24a52eb69eab55189e2842b;hpb=f480e4cc62ccc8ffa91357601649713a0a06f521;p=deb%2Fpackages.git diff --git a/lib/Packages/Search.pm b/lib/Packages/Search.pm index a88e5c9..32ef1e2 100644 --- a/lib/Packages/Search.pm +++ b/lib/Packages/Search.pm @@ -134,9 +134,10 @@ sub parse_params { my @p_value_no_replace = @p_value; if ($params{$param}{replace} && @p_value) { - @p_value = (); foreach my $pattern (keys %{$params{$param}{replace}}) { - foreach (@p_value_no_replace) { + my @p_value_tmp = @p_value; + @p_value = (); + foreach (@p_value_tmp) { if ($_ eq $pattern) { my $replacement = $params{$param}{replace}{$_}; if (ref $replacement) { @@ -362,25 +363,38 @@ sub read_entry { sub read_entry_simple { my ($hash, $key, $archives, $suite) = @_; my $result = $hash->{$key} || ''; - my @data_fuzzy; + debug( "read_entry_simple: key=$key, archives=". + join(" ",(keys %$archives)).", suite=$suite", 1); + my (@data_fuzzy, @data_virtual, @data_fuzzy_virtual); foreach (split /\000/o, $result) { my @data = split ( /\s/o, $_, 8 ); debug( "Considering entry ".join( ':', @data), 2); if ($data[1] eq $suite) { - if ($archives->{$data[0]}) { + if ($archives->{$data[0]} + && ($data[2] ne 'virtual')) { debug( "Using entry ".join( ':', @data), 2); return \@data; - } elsif ($data[0] eq 'us') { + } elsif ($archives->{$data[0]}) { + debug( "Virtual entry ".join( ':', @data), 2); + @data_virtual = @data; + } elsif (($data[0] eq 'us') + && ($data[2] ne 'virtual')) { debug( "Fuzzy entry ".join( ':', @data), 2); @data_fuzzy = @data; + } elsif ($data[0] eq 'us') { + debug( "Virtual fuzzy entry ".join( ':', @data), 2); + @data_fuzzy_virtual = @data; } } } - return \@data_fuzzy; + return \@data_virtual if @data_virtual; + return \@data_fuzzy if @data_fuzzy; + return \@data_fuzzy_virtual; } sub read_src_entry_all { my ($hash, $key, $results, $non_results, $opts) = @_; my $result = $hash->{$key} || ''; + debug( "read_src_entry_all: key=$key", 1); foreach (split /\000/o, $result) { my @data = split ( /\s/o, $_, 6 ); debug( "Considering entry ".join( ':', @data), 2); @@ -400,44 +414,41 @@ sub read_src_entry { read_src_entry_all( $hash, $key, $results, \@non_results, $opts ); } sub do_names_search { - my ($keyword, $packages, $postfixes, $read_entry, $opts) = @_; - my @results; + my ($keyword, $packages, $postfixes, $read_entry, $opts, + $results, $non_results) = @_; - $keyword = lc $keyword unless $opts->{case_bool}; + $keyword = lc $keyword; - if ($opts->{exact}) { - &$read_entry( $packages, $keyword, \@results, $opts ); - } else { - my ($key, $prefixes) = ($keyword, ''); - my %pkgs; - $postfixes->seq( $key, $prefixes, R_CURSOR ); - while (index($key, $keyword) >= 0) { - if ($prefixes =~ /^\001(\d+)/o) { - $too_many_hits += $1; - } else { - foreach (split /\000/o, $prefixes) { - $_ = '' if $_ eq '^'; - debug( "add word $_$key", 2); - $pkgs{$_.$key}++; - } + my ($key, $prefixes) = ($keyword, ''); + my %pkgs; + $postfixes->seq( $key, $prefixes, R_CURSOR ); + while (index($key, $keyword) >= 0) { + if ($prefixes =~ /^\001(\d+)/o) { + debug( "$key has too many hits", 2 ); + $too_many_hits += $1; + } else { + foreach (split /\000/o, $prefixes) { + $_ = '' if $_ eq '^'; + debug( "add word $_$key", 2); + $pkgs{$_.$key}++; } - last if $postfixes->seq( $key, $prefixes, R_NEXT ) != 0; - last if $too_many_hits or keys %pkgs >= 100; - } - - my $no_results = keys %pkgs; - if ($too_many_hits || ($no_results >= 100)) { - $too_many_hits += $no_results; - %pkgs = ( $keyword => 1 ); - } - foreach my $pkg (sort keys %pkgs) { - &$read_entry( $packages, $pkg, \@results, $opts ); } + last if $postfixes->seq( $key, $prefixes, R_NEXT ) != 0; + last if $too_many_hits or keys %pkgs >= 100; + } + + my $no_results = keys %pkgs; + if ($too_many_hits || ($no_results >= 100)) { + $too_many_hits += $no_results; + %pkgs = ( $keyword => 1 ); + } + foreach my $pkg (sort keys %pkgs) { + &$read_entry( $packages, $pkg, $results, $non_results, $opts ); } - return \@results; } sub do_fulltext_search { - my ($keyword, $file, $did2pkg, $packages, $read_entry, $opts) = @_; + my ($keyword, $file, $did2pkg, $packages, $read_entry, $opts, + $results, $non_results) = @_; # NOTE: this needs to correspond with parse-packages! $keyword =~ tr [A-Z] [a-z]; @@ -457,9 +468,9 @@ sub do_fulltext_search { my $result = $did2pkg->{$.}; foreach (split /\000/o, $result) { my @data = split /\s/, $_, 3; - debug ("Considering $data[0], arch = $data[2]", 3); - next unless $data[2] eq 'all' || $opts->{h_archs}{$data[2]}; - debug ("Ok", 3); +# debug ("Considering $data[0], arch = $data[2]", 3); +# next unless $data[2] eq 'all' || $opts->{h_archs}{$data[2]}; +# debug ("Ok", 3); $numres++ unless $tmp_results{$data[0]}++; } last if $numres > 100; @@ -469,10 +480,9 @@ sub do_fulltext_search { my @results; foreach my $pkg (keys %tmp_results) { - &$read_entry( $packages, $pkg, \@results, $opts ); + &$read_entry( $packages, $pkg, $results, $non_results, $opts ); } - return \@results; -} + } sub find_binaries { my ($pkg, $archive, $suite, $src2bin) = @_;