#!/usr/bin/perl -wT use warnings; use strict; use POSIX qw(strftime nice); use Debbugs::Config; use CGI::Simple; use Debbugs::CGI qw(:util :url :html); use Debbugs::Common qw(getmaintainers); use Debbugs::Bugs qw(count_bugs); use Debbugs::Status qw(:status); nice(5); my $q = new CGI::Simple; my %param = cgi_parameters(query => $q, single => [qw(indexon repeatmerged archive sortby), qw(skip max_results first), ], default => {indexon => 'pkg', repeatmerged => 'yes', archive => 'no', sortby => 'alpha', skip => 0, max_results => 100, }, ); if (defined $param{first}) { # rip out all non-words from first $param{first} =~ s/\W//g; } if (defined $param{next}) { $param{skip}+=$param{max_results}; } elsif (defined $param{prev}) { $param{skip}-=$param{max_results}; $param{skip} = 0 if $param{skip} < 0; } my $indexon = $param{indexon}; if ($param{indexon} !~ m/^(pkg|src|maint|submitter|tag)$/) { quitcgi("You have to choose something to index on"); } my $repeatmerged = $param{repeatmerged} eq 'yes'; my $archive = $param{archive} eq "yes"; my $sortby = $param{sortby}; if ($sortby !~ m/^(alpha|count)$/) { quitcgi("Don't know how to sort like that"); } my $Archived = $archive ? " Archived" : ""; my %maintainers = %{&getmaintainers()}; my %strings = (); my $dtime = strftime "%a, %e %b %Y %T UTC", gmtime; my $tail_html = '';#$gHTMLTail; $tail_html = '';#$gHTMLTail; $tail_html =~ s/SUBSTITUTE_DTIME/$dtime/; my %count; my $tag; my $note; my %htmldescrip = (); my %sortkey = (); if ($indexon eq "pkg") { $tag = "package"; %count = count_bugs(function => sub {my %d=@_; return splitpackages($d{"pkg"})}); if (defined $param{first}) { %count = map { if (/^\Q$param{first}\E/) { ($_,$count{$_}); } else { (); } } keys %count; } $note = "
Note that with multi-binary packages there may be other\n"; $note .= "reports filed under the different binary package names.
\n"; foreach my $pkg (keys %count) { $sortkey{$pkg} = lc $pkg; $htmldescrip{$pkg} = sprintf('%s (%s)', pkg_url(pkg => $pkg), html_escape($pkg), htmlize_maintlinks(sub { $_[0] == 1 ? 'maintainer: ' : 'maintainers: ' }, $maintainers{$pkg})); } } elsif ($indexon eq "src") { $tag = "source package"; my $pkgsrc = getpkgsrc(); if (defined $param{first}) { %count = map { if (/^\Q$param{first}\E/) { ($_,$count{$_}); } else { (); } } keys %count; } %count = countbugs(function => sub {my %d=@_; return map { $pkgsrc->{$_} || $_ } splitpackages($d{"pkg"}); }); $note = ""; foreach my $src (keys %count) { $sortkey{$src} = lc $src; $htmldescrip{$src} = sprintf('%s (%s)', srcurl($src), html_escape($src), htmlize_maintlinks(sub { $_[0] == 1 ? 'maintainer: ' : 'maintainers: ' }, $maintainers{$src})); } } elsif ($indexon eq "maint") { $tag = "maintainer"; my %email2maint = (); %count = count_bugs(function => sub {my %d=@_; return map { my @me = getparsedaddrs($maintainers{$_}); foreach my $addr (@me) { $email2maint{$addr->address} = $addr->format unless exists $email2maint{$addr->address}; } map { $_->address } @me; } splitpackages($d{"pkg"}); }); if (defined $param{first}) { %count = map { if (/^\Q$param{first}\E/) { ($_,$count{$_}); } else { (); } } keys %count; } $note = "Note that maintainers may use different Maintainer fields for\n"; $note .= "different packages, so there may be other reports filed under\n"; $note .= "different addresses.
\n"; foreach my $maint (keys %count) { $sortkey{$maint} = lc $email2maint{$maint} || "(unknown)"; $htmldescrip{$maint} = htmlize_maintlinks('', $email2maint{$maint}); } } elsif ($indexon eq "submitter") { $tag = "submitter"; my %fullname = (); %count = count_bugs(function => sub {my %d=@_; my @se = getparsedaddrs($d{"submitter"} || ""); foreach my $addr (@se) { $fullname{$addr->address} = $addr->format unless exists $fullname{$addr->address}; } map { $_->address } @se; }); if (defined $param{first}) { %count = map { if (/^\Q$param{first}\E/) { ($_,$count{$_}); } else { (); } } keys %count; } foreach my $sub (keys %count) { $sortkey{$sub} = lc $fullname{$sub}; $htmldescrip{$sub} = sprintf('%s', submitterurl($sub), html_escape($fullname{$sub})); } $note = "Note that people may use different email accounts for\n"; $note .= "different bugs, so there may be other reports filed under\n"; $note .= "different addresses.
\n"; } elsif ($indexon eq "tag") { $tag = "tag"; %count = count_bugs(function => sub {my %d=@_; return split ' ', $d{tags}; }); if (defined $param{first}) { %count = map { if (/^\Q$param{first}\E/) { ($_,$count{$_}); } else { (); } } keys %count; } $note = ""; foreach my $keyword (keys %count) { $sortkey{$keyword} = lc $keyword; $htmldescrip{$keyword} = sprintf('%s', tagurl($keyword), html_escape($keyword)); } } my $result = "); if ($param{skip} > 0) { print q(); } if (keys %count > ($param{skip} + $param{max_results})) { print q(); } print qq(
\n); } print $result; print "$tail_html"; print "\n";