]> git.deb.at Git - deb/packages.git/commitdiff
Fix some issues in contents search:
authorFrank Lichtenheld <frank@lichtenheld.de>
Thu, 2 Mar 2006 00:02:50 +0000 (00:02 +0000)
committerFrank Lichtenheld <frank@lichtenheld.de>
Thu, 2 Mar 2006 00:02:50 +0000 (00:02 +0000)
 - default to 'stable' not 'all suites' because the latter isn't supported
 - add architecture handling
 - fix some problems and errors in the msg handling

cgi-bin/dispatcher.pl
lib/Packages/DoSearch.pm
lib/Packages/DoSearchContents.pm

index 5f0b0ef4d5c5daa2a83afb0bd0a497bbe610092d..50a92f653b570109e167c3a375de7e64b9a6a06e 100755 (executable)
@@ -168,9 +168,10 @@ my %params_def = ( keywords => { default => undef,
                   package => { default => undef,
                                match => '^([\w.+-]+)$',
                                var => \$pkg },
-                  suite => { default => 'all', match => '^([\w-]+)$',
+                  suite => { default => 'default', match => '^([\w-]+)$',
                              array => ',', var => \@suites,
-                             replace => { all => \@SUITES } },
+                             replace => { all => \@SUITES,
+                                          default => \@SUITES } },
                   archive => { default => ($what_to_do eq 'search') ?
                                    'all' : 'default',
                                    match => '^([\w-]+)$',
index a889ef5ca89870fc2d8f35430e22906f772262fa..35ee88fa5a02f0705f3a38121075e3a898fe70a7 100644 (file)
@@ -83,7 +83,7 @@ sub do_search {
     my $std = timediff($st1, $st0);
     debug( "Search took ".timestr($std) ) if DEBUG;
     
-    my $suite_wording = $suites_enc eq "all" ? _g("all suites")
+    my $suite_wording = $suites_enc =~ /^(default|all)$/ ? _g("all suites")
        : sprintf(_g("suite(s) <em>%s</em>", $suites_enc) );
     my $section_wording = $sections_enc eq 'all' ? _g("all sections")
        : sprintf(_g("section(s) <em>%s</em>", $sections_enc) );
index 7ae679826ca29ef004bdc6925f0291981ea26ac9..b86f2390fb7f172bdbd2e04872d0ff703c8a276d 100644 (file)
@@ -30,6 +30,13 @@ sub do_search_contents {
     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}}" ) );
     }
@@ -52,9 +59,9 @@ sub do_search_contents {
     # 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 $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);
@@ -102,14 +109,19 @@ sub do_search_contents {
        debug( "Search took ".timestr($std) ) if DEBUG;
     }
     
-    my $suite_wording = $suites_enc eq "all" ? _g("all suites")
-       : sprintf(_g("suite(s) <em>%s</em>", $suites_enc) );
+    my $suite_wording = sprintf(_g("suite <em>%s</em>"), $suites_enc );
     my $section_wording = $sections_enc eq 'all' ? _g("all sections")
-       : sprintf(_g("section(s) <em>%s</em>", $sections_enc) );
+       : sprintf(_g("section(s) <em>%s</em>"), $sections_enc );
     my $arch_wording = $archs_enc eq 'any' ? _g("all architectures")
-       : sprintf(_g("architecture(s) <em>%s</em>", $archs_enc) );
-    my $wording = $opts->{exact} ? _g("exact filenames") : _g("filenames that contain");
-    $wording = _g("paths that end with") if $searchon eq "contents";
+       : sprintf(_g("architecture(s) <em>%s</em>"), $archs_enc );
+    my $wording = _g("filenames that contain");
+    if ($searchon eq 'contents') {
+       if ($opts->{exact}) {
+           $wording =  _g("files named");
+       } else {
+           $wording = _g("paths that end with");
+       }
+    }
     msg( sprintf( _g("You have searched for %s <em>%s</em> in %s, %s, and %s." ),
                  $wording, $keyword_enc,
                  $suite_wording, $section_wording, $arch_wording ) );
@@ -140,20 +152,45 @@ sub do_search_contents {
 
     $$page_content = '';
     if (@results) {
-       $$page_content .= "<p>".sprintf( _g( 'Found %s results' ),
-                                        scalar @results )."</p>";
-       $$page_content .= '<div
-       id="pcontentsres"><table><colgroup><col><col></colgroup><tr><th>'._g('File').'</th><th>'._g('Packages')
-           .'</th></tr>';
+       my (%results,%archs);
        foreach my $result (sort { $a->[0] cmp $b->[0] } @results) {
            my $file = shift @$result;
-           $$page_content .= "<tr><td class=\"file\">/$file</td><td>";
            my %pkgs;
            foreach (@$result) {
                my ($pkg, $arch) = split /:/, $_;
+               next unless $opts->{h_archs}{$arch};
                $pkgs{$pkg}{$arch}++;
+               $archs{$arch}++ unless $arch eq 'all';
+           }
+           next unless keys %pkgs;
+           $results{$file} = \%pkgs;
+       }
+       my @all_archs = keys %archs;
+       debug( "all_archs = @all_archs", 1 ) if DEBUG;
+
+       $$page_content .= "<p>".sprintf( _g( 'Found %s results' ),
+                                        scalar @results )."</p>";
+       $$page_content .= '<div
+       id="pcontentsres"><table><colgroup><col><col></colgroup><tr><th>'._g('File').'</th><th>'._g('Packages')
+           .'</th></tr>';
+       foreach my $file (sort keys %results) {
+           $$page_content .= "<tr><td class=\"file\">/$file</td><td>";
+           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, "<a href=\"$ROOT/$suite/$pkg\">$pkg</a>$arch_str";
            }
-           $$page_content .= join( ", ", map { "<a href=\"$ROOT/$suite/$_\">$_</a>" } sort keys %pkgs);
+           $$page_content .= join( ", ", @pkgs);
            $$page_content .= '</td>';
        }
        $$page_content .= '<tr><th>'._g('File').'</th><th>'._g('Packages').'</th></tr>' if @results > 20;