X-Git-Url: https://git.deb.at/?a=blobdiff_plain;f=lib%2FPackages%2FDoSearchContents.pm;h=1a51ba3d445eb28c2f697ce5dd80a46e06e61d83;hb=fa9e1fd3cdaacb0cf72e559fde02ae83812bff0b;hp=e86fc789783ef06dcecd7e9442535db7530f4c78;hpb=f27f1fcc5bffc0696f694e962eb40dbb0c554855;p=deb%2Fpackages.git
diff --git a/lib/Packages/DoSearchContents.pm b/lib/Packages/DoSearchContents.pm
index e86fc78..1a51ba3 100644
--- a/lib/Packages/DoSearchContents.pm
+++ b/lib/Packages/DoSearchContents.pm
@@ -17,44 +17,50 @@ use Packages::Search qw( :all );
use Packages::CGI;
use Packages::DB;
use Packages::Config qw( $DBDIR $SEARCH_URL $SEARCH_PAGE
- @SUITES @ARCHIVES $ROOT );
+ @SUITES @ARCHIVES @ARCHITECTURES $ROOT );
sub do_search_contents {
my ($params, $opts, $html_header, $menu, $page_content) = @_;
if ($params->{errors}{keywords}) {
fatal_error( _g( "keyword not valid or missing" ) );
- } elsif (length($opts->{keywords}) < 2) {
+ $opts->{keywords} = [];
+ } elsif (grep { length($_) < 2 } @{$opts->{keywords}}) {
fatal_error( _g( "keyword too short (keywords need to have at least two characters)" ) );
}
if ($params->{errors}{suite}) {
fatal_error( _g( "suite not valid or not specified" ) );
}
+
+ #FIXME: that's extremely hacky atm
+ if ($params->{values}{suite}{no_replace}[0] eq 'default') {
+ $params->{values}{suite}{no_replace} =
+ $params->{values}{suite}{final} = $opts->{suite} = [ 'stable' ];
+ }
+
if (@{$opts->{suite}} > 1) {
fatal_error( sprintf( _g( "more than one suite specified for contents search (%s)" ), "@{$opts->{suite}}" ) );
}
$$menu = "";
- my $keyword = $opts->{keywords};
- my $searchon = $opts->{searchon};
- my $exact = $opts->{exact};
+ my @keywords = @{$opts->{keywords}};
+ my $mode = $opts->{mode} || '';
my $suite = $opts->{suite}[0];
my $archive = $opts->{archive}[0] ||'';
$Packages::Search::too_many_hits = 0;
# for URL construction
- my $keyword_esc = uri_escape( $keyword );
+ my $keyword_esc = uri_escape( "@keywords" );
my $suites_param = join ',', @{$params->{values}{suite}{no_replace}};
my $sections_param = join ',', @{$params->{values}{section}{no_replace}};
my $archs_param = join ',', @{$params->{values}{arch}{no_replace}};
# for output
- my $keyword_enc = encode_entities $keyword || '';
- my $searchon_enc = encode_entities $searchon;
- my $suites_enc = encode_entities( join( ', ', @{$params->{values}{suite}{no_replace}} ) );
- my $sections_enc = encode_entities( join( ', ', @{$params->{values}{section}{no_replace}} ) );
- my $archs_enc = encode_entities( join( ', ', @{$params->{values}{arch}{no_replace}} ) );
+ my $keyword_enc = encode_entities "@keywords" || '';
+ my $suites_enc = encode_entities( join( ', ', @{$params->{values}{suite}{no_replace}} ), '&<>"' );
+ my $sections_enc = encode_entities( join( ', ', @{$params->{values}{section}{no_replace}} ), '&<>"' );
+ my $archs_enc = encode_entities( join( ', ', @{$params->{values}{arch}{no_replace}} ), '&<>"' );
my $st0 = new Benchmark;
my (@results);
@@ -63,33 +69,37 @@ sub do_search_contents {
my $nres = 0;
- my $kw = lc $keyword;
+ my $first_kw = lc shift @keywords;
# full filename search is tricky
- my $ffn = $searchon eq 'filenames';
+ my $ffn = $mode eq 'filename';
my $reverses = tie my %reverses, 'DB_File', "$DBDIR/contents/reverse_$suite.db",
O_RDONLY, 0666, $DB_BTREE
or die "Failed opening reverse DB: $!";
if ($ffn) {
- open FILENAMES, '-|', 'fgrep', '--', $kw, "$DBDIR/contents/filenames_$suite.txt"
+ open FILENAMES, '-|', 'fgrep', '--', $first_kw, "$DBDIR/contents/filenames_$suite.txt"
or die "Failed opening filename table: $!";
- error( _g( "Exact and fullfilenamesearch don't go along" ) )
- if $ffn and $exact;
-
+ FILENAME:
while ( ".sprintf( _g( 'Found %s results' ),
- scalar @results )."
'._g('File').' | '._g('Packages') - .' |
---|---|
/$file | "; - my %pkgs; - foreach (@$result) { - my ($pkg, $arch) = split /:/, $_; - $pkgs{$pkg}{$arch}++; + ." |
/$file_enc | "; + my @pkgs; + foreach my $pkg (sort keys %{$results{$file}}) { + my $arch_str = ''; + my @archs = keys %{$results{$file}{$pkg}}; + unless ($results{$file}{$pkg}{all} || + (@archs == @all_archs)) { + if (@archs < @all_archs/2) { + $arch_str = ' ['.join(' ',sort @archs).']'; + } else { + $arch_str = ' ['._g('not').' '. + join(' ', grep { !$results{$file}{$pkg}{$_} } @all_archs).']'; + } + } + push @pkgs, "$suite})."\">$pkg$arch_str"; } - $$page_content .= join( ", ", map { "$_" } sort keys %pkgs); - $$page_content .= ' | '; + $$page_content .= join( ", ", @pkgs); + $$page_content .= "
'._g('File').' | '._g('Packages').' |
'._g('File').' | '._g('Packages')." |