X-Git-Url: https://git.deb.at/?a=blobdiff_plain;f=lib%2FPackages%2FSearch.pm;h=a88e5c973b648d7da24a52eb69eab55189e2842b;hb=f480e4cc62ccc8ffa91357601649713a0a06f521;hp=b545dbc5fa544c77bb07a59e1a247903c29e3fa6;hpb=5ca21f1ba07a6b559395bec8d6bc1e528eb238d1;p=deb%2Fpackages.git diff --git a/lib/Packages/Search.pm b/lib/Packages/Search.pm index b545dbc..a88e5c9 100644 --- a/lib/Packages/Search.pm +++ b/lib/Packages/Search.pm @@ -54,12 +54,10 @@ use Exporter; our @ISA = qw( Exporter ); -our @EXPORT_OK = qw( nextlink prevlink indexline - resperpagelink - read_entry read_entry_all read_entry_simple - read_src_entry find_binaries +our @EXPORT_OK = qw( read_entry read_entry_all read_entry_simple + read_src_entry read_src_entry_all find_binaries do_names_search do_fulltext_search - printindexline multipageheader ); + ); our %EXPORT_TAGS = ( all => [ @EXPORT_OK ] ); our $VERSION = 0.01; @@ -295,49 +293,49 @@ sub printindexline { } } -sub multipageheader { - my ( $input, $no_results, $opts ) = @_; - - my ($start, $end); - if ($opts->{number} =~ /^all$/i) { - $start = 1; - $end = $no_results; - $opts->{number} = $no_results; - $opts->{number_all}++; - } else { - $start = Packages::Search::start( $opts ); - $end = Packages::Search::end( $opts ); - if ($end > $no_results) { $end = $no_results; } - } - - print "

Found $no_results matching packages,"; - if ($end == $start) { - print " displaying package $end.

"; - } else { - print " displaying packages $start to $end.

"; - } - - printindexline( $input, $no_results, $opts ); - - if ($no_results > 100) { - print "

Results per page: "; - my @resperpagelinks; - for (50, 100, 200) { - if ($opts->{number} == $_) { - push @resperpagelinks, $_; - } else { - push @resperpagelinks, resperpagelink($input,$opts,$_); - } - } - if ($opts->{number_all}) { - push @resperpagelinks, "all"; - } else { - push @resperpagelinks, resperpagelink($input, $opts, "all"); - } - print join( " | ", @resperpagelinks )."

"; - } - return ( $start, $end ); -} +#sub multipageheader { +# my ( $input, $no_results, $opts ) = @_; +# +# my ($start, $end); +# if ($opts->{number} =~ /^all$/i) { +# $start = 1; +# $end = $no_results; +# $opts->{number} = $no_results; +# $opts->{number_all}++; +# } else { +# $start = Packages::Search::start( $opts ); +# $end = Packages::Search::end( $opts ); +# if ($end > $no_results) { $end = $no_results; } +# } +# +# print "

Found $no_results matching packages,"; +# if ($end == $start) { +# print " displaying package $end.

"; +# } else { +# print " displaying packages $start to $end.

"; +# } +# +# printindexline( $input, $no_results, $opts ); +# +# if ($no_results > 100) { +# print "

Results per page: "; +# my @resperpagelinks; +# for (50, 100, 200) { +# if ($opts->{number} == $_) { +# push @resperpagelinks, $_; +# } else { +# push @resperpagelinks, resperpagelink($input,$opts,$_); +# } +# } +# if ($opts->{number_all}) { +# push @resperpagelinks, "all"; +# } else { +# push @resperpagelinks, resperpagelink($input, $opts, "all"); +# } +# print join( " | ", @resperpagelinks )."

"; +# } +# return ( $start, $end ); +#} sub read_entry_all { my ($hash, $key, $results, $non_results, $opts) = @_; @@ -346,8 +344,9 @@ sub read_entry_all { my @data = split ( /\s/o, $_, 8 ); debug( "Considering entry ".join( ':', @data), 2); if ($opts->{h_archives}{$data[0]} && $opts->{h_suites}{$data[1]} - && ($opts->{h_archs}{$data[2]} || $data[2] eq 'all') - && $opts->{h_sections}{$data[3]}) { + && ($opts->{h_archs}{$data[2]} || $data[2] eq 'all' + || $data[2] eq 'virtual') + && ($opts->{h_sections}{$data[3]} || $data[3] eq 'v')) { debug( "Using entry ".join( ':', @data), 2); push @$results, [ $key, @data ]; } else { @@ -379,8 +378,8 @@ sub read_entry_simple { } return \@data_fuzzy; } -sub read_src_entry { - my ($hash, $key, $results, $opts) = @_; +sub read_src_entry_all { + my ($hash, $key, $results, $non_results, $opts) = @_; my $result = $hash->{$key} || ''; foreach (split /\000/o, $result) { my @data = split ( /\s/o, $_, 6 ); @@ -390,9 +389,16 @@ sub read_src_entry { && $opts->{h_sections}{$data[2]}) { debug( "Using entry ".join( ':', @data), 2); push @$results, [ $key, @data ]; + } else { + push @$non_results, [ $key, @data ]; } } } +sub read_src_entry { + my ($hash, $key, $results, $opts) = @_; + my @non_results; + read_src_entry_all( $hash, $key, $results, \@non_results, $opts ); +} sub do_names_search { my ($keyword, $packages, $postfixes, $read_entry, $opts) = @_; my @results; @@ -432,42 +438,36 @@ sub do_names_search { } sub do_fulltext_search { my ($keyword, $file, $did2pkg, $packages, $read_entry, $opts) = @_; - my @results; - my @lines; - my $regex; - if ($opts->{case_bool}) { - if ($opts->{exact}) { - $regex = qr/\b\Q$keyword\E\b/o; - } else { - $regex = qr/\Q$keyword\E/o; - } - } else { - if ($opts->{exact}) { - $regex = qr/\b\Q$keyword\E\b/io; - } else { - $regex = qr/\Q$keyword\E/io; - } +# NOTE: this needs to correspond with parse-packages! + $keyword =~ tr [A-Z] [a-z]; + if ($opts->{exact}) { + $keyword = " $keyword "; } + $keyword =~ s/[(),.-]+//og; + $keyword =~ s#[^a-z0-9_/+]+# #og; + my $numres = 0; + my %tmp_results; open DESC, '<', "$file" or die "couldn't open $file: $!"; while () { - $_ =~ $regex or next; - debug( "Matched line $.", 2); - push @lines, $.; - } - close DESC; - - my %tmp_results; - foreach my $l (@lines) { - my $result = $did2pkg->{$l}; + next if (index $_, $keyword) < 0; + debug( "Matched line $.: $_", 2); + my $result = $did2pkg->{$.}; foreach (split /\000/o, $result) { my @data = split /\s/, $_, 3; - next unless $opts->{h_archs}{$data[2]}; - $tmp_results{$data[0]}++; + 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; } + close DESC; + $too_many_hits++ if $numres > 100; + + my @results; foreach my $pkg (keys %tmp_results) { &$read_entry( $packages, $pkg, \@results, $opts ); } @@ -482,9 +482,11 @@ sub find_binaries { foreach (split /\000/o, $bins) { my @data = split /\s/, $_, 5; + debug( "find_binaries: considering @data", 3 ); if (($data[0] eq $archive) && ($data[1] eq $suite)) { $bins{$data[2]}++; + debug( "find_binaries: using @data", 3 ); } }