-
- my $suite_wording = $suites_enc eq "all" ? "all suites"
- : "suite(s) <em>$suites_enc</em>";
- my $section_wording = $sections_enc eq 'all' ? "all sections"
- : "section(s) <em>$sections_enc</em>";
- my $arch_wording = $archs_enc eq 'any' ? "all architectures"
- : "architecture(s) <em>$archs_enc</em>";
- my $wording = $opts->{exact} ? "exact filenames" : "filenames that contain";
- $wording = "paths that end with" if $searchon eq "contents";
- msg( "You have searched for ${wording} <em>$keyword_enc</em> in $suite_wording, $section_wording, and $arch_wording." );
-
- if ($Packages::Search::too_many_hits) {
- error( _g( "Your search was too wide so we will only display only the first about 100 matches. Please consider using a longer keyword or more keywords." ) );
- }
-
- if (!@Packages::CGI::fatal_errors && !@results) {
- error( _g( "Nothing found" ) );
- }
-
- %$html_header = ( title => _g( 'Package Contents Search Results' ),
- lang => $opts->{lang},
- title_tag => _g( 'Debian Package Contents Search Results' ),
- print_title => 1,
- print_search_field => 'packages',
- search_field_values => {
- keywords => $keyword_enc,
- searchon => 'contents',
- arch => $archs_enc,
- suite => $suites_enc,
- section => $sections_enc,
- exact => $opts->{exact},
- debug => $opts->{debug},
- },
- );
-
- $$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>';
- 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 /:/, $_;
- $pkgs{$pkg}{$arch}++;
+ my @all_archs = keys %archs;
+ @all_archs = @ARCHITECTURES unless @all_archs;
+ $page_content->{suite} = $suite;
+ $page_content->{archive} = $archive;
+ $page_content->{all_architectures} = \@all_archs;
+ $page_content->{all_suites} = \@SUITES;
+ $page_content->{mode} = $mode;
+ $page_content->{search_architectures} = $opts->{arch};
+ $page_content->{search_keywords} = $opts->{keywords};
+ $page_content->{sections} = $opts->{section};
+ $page_content->{too_many_hits} = $Packages::Search::too_many_hits;
+
+ debug( "all_archs = @all_archs", 1 ) if DEBUG;
+
+ if (keys %results) {
+ my $sort_func = sub { $_[0] cmp $_[1] };
+ $sort_func = sub { (sort keys %{$results{$_[0]}})[0]
+ cmp
+ (sort keys %{$results{$_[1]}})[0]
+ } if $opts->{sort_by} eq 'pkg';
+
+ $page_content->{results} = [];
+ foreach my $file (sort {&$sort_func($a,$b)} keys %results) {
+ my %result;
+ $result{file} = "/$file";
+ $result{packages} = [];
+ foreach my $pkg (sort keys %{$results{$file}}) {
+ my $arch_str = '';
+ my @archs = keys %{$results{$file}{$pkg}};
+ my $arch_neg = 0;
+ unless ($results{$file}{$pkg}{all} ||
+ (@archs == @all_archs)) {
+ if (@archs >= @all_archs/2) {
+ @archs = grep { !$results{$file}{$pkg}{$_} } @all_archs;
+ $arch_neg = 1;
+ }
+ } else {
+ @archs = ();
+ }
+ push @{$result{packages}}, { pkg => $pkg, architectures => \@archs, architectures_are_rev => $arch_neg };