From 4af907ad36860008ed905d399accbe45f55ca405 Mon Sep 17 00:00:00 2001 From: ajt <> Date: Mon, 22 Aug 2005 13:27:48 -0800 Subject: [PATCH] [project @ 2005-08-22 14:27:48 by ajt] prettify pkgreport and bugreport (and add css) --- cgi/bugreport.cgi | 109 ++++++------ cgi/bugs.css | 174 ++++++++++++++++++ cgi/common.pl | 27 +-- cgi/pkgindex.cgi | 2 +- cgi/pkgreport.cgi | 444 +++++++++++++++++++++++++++++++++++++++++++++- cgi/smarturl.cgi | 3 +- 6 files changed, 690 insertions(+), 69 deletions(-) create mode 100644 cgi/bugs.css diff --git a/cgi/bugreport.cgi b/cgi/bugreport.cgi index a05aa25..5955d49 100755 --- a/cgi/bugreport.cgi +++ b/cgi/bugreport.cgi @@ -78,22 +78,21 @@ sub display_entity ($$$$\$\@) { $filename = '' unless defined $filename; $filename = decode_rfc1522($filename); - if ($top) { + if ($top and not $terse) { my $header = $entity->head; - if ($trim_headers and not $terse) { + $$this .= "
\n";
+	 if ($trim_headers) {
 	      my @headers;
 	      foreach (qw(From To Cc Subject Date)) {
 		   my $head_field = $head->get($_);
 		   next unless defined $head_field and $head_field ne '';
-		   push @headers, qq($_: ) . htmlsanit(decode_rfc1522($head_field));
+		   push @headers, qq($_: ) . htmlsanit(decode_rfc1522($head_field));
 	      }
 	      $$this .= join(qq(), @headers) unless $terse;
-	      $$this .= qq(\n);
-	 }
-	 elsif (not $terse) {
+	 } else {
 	      $$this .= htmlsanit(decode_rfc1522($entity->head->stringify));
-	      $$this .= qq(\n);
 	 }
+	 $$this .= "
\n"; } unless (($top and $type =~ m[^text(?:/plain)?(?:;|$)]) or @@ -103,8 +102,8 @@ sub display_entity ($$$$\$\@) { push @dlargs, "filename=$filename" if $filename ne ''; my $printname = $filename; $printname = 'Message part ' . ($#$attachments + 1) if $filename eq ''; - $$this .= '[$printname } . - "($type, $disposition)]\n\n"; + $$this .= '
[$printname } .
+		  "($type, $disposition)]
\n"; if ($msg and defined($att) and $att eq $#$attachments) { my $head = $entity->head; @@ -149,13 +148,15 @@ sub display_entity ($$$$\$\@) { $$this .= "\n"; } else { if (not $terse) { - my $content_type = $entity->head->get('Content-Type:'); + my $content_type = $entity->head->get('Content-Type:') || "text/html"; my ($charset) = $content_type =~ m/charset\s*=\s*\"?([\w-]+)\"?/i; my $body = $entity->bodyhandle->as_string; $body = convert_to_utf8($body,$charset) if defined $charset; $body = htmlsanit($body); $body =~ s,((ftp|http|https)://[\S~-]+?/?)((\>\;)?[)]?[']?[:.\,]?(\s|$)),$1$3,go; + $$this .= "
";
 	      $$this .= $body;
+	      $$this .= "
\n"; } } } @@ -164,7 +165,6 @@ my %maintainer = %{getmaintainers()}; my %pkgsrc = %{getpkgsrc()}; my $indexentry; -my $descriptivehead; my $showseverity; my $tpack; @@ -201,34 +201,50 @@ my @tpacks = splitpackages($tpack); if ($status{severity} eq 'normal') { $showseverity = ''; -#} elsif (isstrongseverity($status{severity})) { -# $showseverity = "Severity: $status{severity};\n"; +} elsif (isstrongseverity($status{severity})) { + $showseverity = "Severity: $status{severity};\n"; } else { - $showseverity = "Severity: $status{severity};\n"; + $showseverity = "Severity: $status{severity};\n"; } -$indexentry .= "

$showseverity"; +$indexentry .= "

\n"; $indexentry .= htmlpackagelinks($status{package}, 0) . ";\n"; +foreach my $pkg (@tpacks) { + my $tmaint = defined($maintainer{$pkg}) ? $maintainer{$pkg} : '(unknown)'; + my $tsrc = defined($pkgsrc{$pkg}) ? $pkgsrc{$pkg} : '(unknown)'; + + $indexentry .= + htmlmaintlinks(sub { $_[0] == 1 ? "Maintainer for $pkg is\n" + : "Maintainers for $pkg are\n" }, + $tmaint); + $indexentry .= ";\nSource for $pkg is\n". + '$tsrc" if ($tsrc ne "(unknown)"); + $indexentry .= ".\n"; +} + +$indexentry .= "
"; $indexentry .= htmladdresslinks("Reported by: ", \&submitterurl, $status{originator}) . ";\n"; +$indexentry .= sprintf "Date: %s.\n", + (strftime "%a, %e %b %Y %T UTC", localtime($status{date})); -$indexentry .= "Owned by: " . htmlsanit($status{owner}) . ";\n" +$indexentry .= "
Owned by: " . htmlsanit($status{owner}) . ".\n" if length $status{owner}; -my $dummy = strftime "%a, %e %b %Y %T UTC", localtime($status{date}); -$indexentry .= "Date: ".$dummy.";\n
"; +$indexentry .= "
\n"; my @descstates; -push @descstates, "Tags: " - . htmlsanit(join(", ", sort(split(/\s+/, $status{tags})))) - . "" +$indexentry .= "

$showseverity"; +$indexentry .= sprintf "Tags: %s;\n", + htmlsanit(join(", ", sort(split(/\s+/, $status{tags})))) if length($status{tags}); +$indexentry .= "
" if (length($showseverity) or length($status{tags})); my @merged= split(/ /,$status{mergedwith}); if (@merged) { - my $descmerged = 'merged with '; + my $descmerged = 'Merged with '; my $mseparator = ''; for my $m (@merged) { $descmerged .= $mseparator."#$m"; @@ -253,26 +269,15 @@ if (@{$status{fixed_versions}}) { } push @descstates, $fixedtext; } elsif (length($status{done})) { - push @descstates, "Done: ".htmlsanit(decode_rfc1522($status{done})); + push @descstates, "Done: ".htmlsanit(decode_rfc1522($status{done})); } elsif (length($status{forwarded})) { - push @descstates, "Forwarded to ".maybelink($status{forwarded}); + push @descstates, "Forwarded to ".maybelink($status{forwarded}); } -$indexentry .= join(";\n", @descstates) . ";\n
" if @descstates; +$indexentry .= join(";\n
", @descstates) . ";\n
" if @descstates; +$indexentry .= "

\n"; -$descriptivehead = $indexentry; -foreach my $pkg (@tpacks) { - my $tmaint = defined($maintainer{$pkg}) ? $maintainer{$pkg} : '(unknown)'; - my $tsrc = defined($pkgsrc{$pkg}) ? $pkgsrc{$pkg} : '(unknown)'; - - $descriptivehead .= - htmlmaintlinks(sub { $_[0] == 1 ? "Maintainer for $pkg is\n" - : "Maintainers for $pkg are\n" }, - $tmaint); - $descriptivehead .= ";\nSource for $pkg is\n". - '$tsrc" if ($tsrc ne "(unknown)"); - $descriptivehead .= ".\n
"; -} +my $descriptivehead = $indexentry; my $buglogfh; if ($buglog =~ m/\.gz$/) { @@ -284,7 +289,7 @@ if ($buglog =~ m/\.gz$/) { $buglogfh = new IO::File "<$buglog" or &quitcgi("open log for $ref: $!"); } if ($buglog !~ m#^\Q$gSpoolDir/db#) { - $descriptivehead .= "\n

Bug is archived. No further changes may be made.

"; + $descriptivehead .= "\n

Bug is archived. No further changes may be made.

"; } @@ -376,6 +381,8 @@ sub handle_record{ $output =~ s{(Bug )(\d+)( cloned as bugs? )(\d+)(?:\-(\d+)|)}{$1.bug_links($2).$3.bug_links($4,$5)}eo; $output .= 'Full text and rfc822 format available.'; + + $output = "
\n" . $output . "
\n"; } elsif (/recips/) { my ($msg_id) = $record->{text} =~ /^Message-Id:\s+<(.+)>/im; @@ -386,11 +393,10 @@ sub handle_record{ $$seen_msg_ids{$msg_id} = 1; } $output .= 'View this message in rfc822 format'; - $output .= '
' .
-	       handle_email_message($record->{text},
+	  $output .= handle_email_message($record->{text},
 				    ref        => $bug_number,
 				    msg_number => $msg_number,
-				   ) . '
'; + ); } elsif (/autocheck/) { # Do nothing @@ -405,13 +411,12 @@ sub handle_record{ } # Incomming Mail Message my ($received,$hostname) = $record->{text} =~ m/Received: \(at (\S+)\) by (\S+)\;/; - $output .= qq|

Message received at |. - htmlsanit("$received\@$hostname") . q| (full text'.q|, mbox)'.":

\n"; - $output .= '
' .
-	       handle_email_message($record->{text},
+	  $output .= qq|

Message received at |. + htmlsanit("$received\@$hostname") . q| (full text'.q|, mbox)'.":

\n"; + $output .= handle_email_message($record->{text}, ref => $bug_number, msg_number => $msg_number, - ) . '
'; + ); } else { die "Unknown record type $_"; @@ -477,11 +482,13 @@ print "Content-Type: text/html; charset=utf-8\n\n"; my $title = htmlsanit($status{subject}); +my $dummy2 = $debbugs::gWebHostBugDir; + print "\n"; print "\n" . - "$debbugs::gProject $debbugs::gBug report logs - $short - $title\n" . + "$title - $debbugs::gProject $debbugs::gBug report logs - $short\n" . ''. -# "" . + "" . "\n" . '' . "\n"; @@ -489,11 +496,11 @@ print "

" . "$debbugs::gProject $debbugs::gBug report logs - " . $title . "

\n"; print "$descriptivehead\n"; -printf "

View this report as an mbox folder.

\n", bugurl($ref, "mbox"); +printf "

View this report as an mbox folder.

\n", bugurl($ref, "mbox"); print "
"; print "$log"; print "
"; -print "Report that this bug log contains spam.
\n"; +print "

Send a report that this bug log contains spam.

\n
\n"; print $tail_html; print "\n"; diff --git a/cgi/bugs.css b/cgi/bugs.css new file mode 100644 index 0000000..1f38134 --- /dev/null +++ b/cgi/bugs.css @@ -0,0 +1,174 @@ +html { + color: #000; + background: #fefefe; + font-family: serif; + margin: 1em; + border: 0; + padding: 0; + line-height: 120%; +} + +body { + margin: 0; + border: 0; + padding: 0; +} + +h1, h2, h3 { + text-align: left; + font-family: sans-serif; +} + +h1 { + font-size: 150%; + line-height: 150%; +} + +h2 { + font-size: 130%; +} + +h3 { + font-size: 100%; +} + +a:link { + color: #1b56ce; + font-weight: bold; +} + +a:visited { + color:#1b56ce; +} + +a:link:active, a:link:visited { + color:#ff0000; +} + +a:link:hover, a:visited:hover { + color: #d81e1e; +} + +a.submitter:link { + color: #242424; + font-family: sans-serif; + font-size: 95%; + text-decoration: underline; + font-weight: normal; +} + +a.submitter:visited, a.submitter:active { + color: #6e6e6e; + font-family: sans-serif; + font-size: 95%; +} + +a.submitter:hover, a.submitter:visited:hover { + color: #d01414; + font-family: sans-serif; + font-size: 95%; +} + +pre.message { + font-family: monospace; + padding-top: 0; + margin-top: 0; + border-top: 0; +} + +.sparse li { + padding-top: 1ex; + margin-top: 1ex; + border-top: 1ex; +} + +a.bugtitle { + font-weight: bold; + font-size: 110%; +} + + +pre.headers { + font-family: sans-serif; + font-size: 95%; + color: #3c3c3c; + background-color: #f0f0f0; + padding: 2px; + border: #a7a7a7 1px solid; + line-height: 120% +} + +pre.mime { + font-family: monospace; + font-size: 95%; + color: #797979; +} + +.msgreceived { + font-family: sans-serif; + font-size: 90%; + color: #686868; +} + +pre.tags { + color: #a3a3a3; + font-size: 90%; +} + +hr.thin { + color: #a1a1a1; +} + +em.severity { + color: #c31212; +} + +code, address { + font-family: sans-serif; +} + +p { + font-family: sans-serif; + font-size: 95%; +} + +h2.outstanding { + font-family: sans-serif; + background-color: #f0f0f0; + color: #3c3c3c; + border: #a7a7a7 1px solid; + padding: 10px; +} + +a.options:link, a.options:visited { + font-family: sans-serif; + background-color: #f0f0f0; + color: #3c3c3c; + text-decoration: none; + border-bottom: #3c3c3c 1px dotted; +} + +li { + list-style-type: square; +} + +.bugs li { + margin-top: 5px; +} + +input { + border: #000 1px solid; + margin: 3px; +} + +table.forms { + font-size: 95%; + font-family: sans-serif; + margin-left: 10px; +} + +select { + margin: 3px; + border: #000 1px solid; +} + diff --git a/cgi/common.pl b/cgi/common.pl index 2f51b7c..85b18bb 100644 --- a/cgi/common.pl +++ b/cgi/common.pl @@ -183,18 +183,24 @@ sub set_option { } sub readparse { - my ($in, $key, $val, %ret); + my ($key, $val, %ret); + my $in = ""; if ($#ARGV >= 0) { - $in = join("&", map { s/&/%26/g; s/;/%3b/g; $_ } @ARGV); - } elsif (defined $ENV{"QUERY_STRING"} && $ENV{"QUERY_STRING"} ne "") { - $in=$ENV{QUERY_STRING}; - } elsif(defined $ENV{"REQUEST_METHOD"} - && $ENV{"REQUEST_METHOD"} eq "POST") + $in .= ";" . join("&", map { s/&/%26/g; s/;/%3b/g; $_ } @ARGV); + } + if (defined $ENV{"QUERY_STRING"} && $ENV{"QUERY_STRING"} ne "") { + $in .= ";" . $ENV{QUERY_STRING}; + } + if (defined $ENV{"REQUEST_METHOD"} && $ENV{"REQUEST_METHOD"} eq "POST" + && defined $ENV{"CONTENT_TYPE"} + && $ENV{"CONTENT_TYPE"} eq "application/x-www-form-urlencoded") { - read(STDIN,$in,$ENV{CONTENT_LENGTH}); - } else { - return; + my $inx; + read(STDIN,$inx,$ENV{CONTENT_LENGTH}); + $in .= ";" . $inx; } + return unless ($in ne ""); + if (defined $ENV{"HTTP_COOKIE"}) { my $x = $ENV{"HTTP_COOKIE"}; $x =~ s/;\s+/;/g; @@ -433,8 +439,9 @@ sub pkg_etc_url { $code = "source" if ($code eq "src"); return urlsanit("/x/$code/$ref"); } else { + my $addurlargs = shift || 1; my $params = "$code=$ref"; - $params .= urlargs(); + $params .= urlargs() if $addurlargs; return urlsanit("pkgreport.cgi" . "?" . $params); } } diff --git a/cgi/pkgindex.cgi b/cgi/pkgindex.cgi index 5854671..6086047 100755 --- a/cgi/pkgindex.cgi +++ b/cgi/pkgindex.cgi @@ -167,6 +167,6 @@ print $note; print $result; print "
\n"; -print "$tail_html"; +print "

$tail_html"; print "\n"; diff --git a/cgi/pkgreport.cgi b/cgi/pkgreport.cgi index 4860c79..f251d6f 100755 --- a/cgi/pkgreport.cgi +++ b/cgi/pkgreport.cgi @@ -43,6 +43,33 @@ my $arch = $param{'arch'} || undef; my $show_list_header = ($param{'show_list_header'} || $userAgent->{'show_list_header'} || "yes" ) eq "yes"; my $show_list_footer = ($param{'show_list_footer'} || $userAgent->{'show_list_footer'} || "yes" ) eq "yes"; +{ + if (defined $param{'vt'}) { + my $vt = $param{'vt'}; + if ($vt eq "none") { $dist = undef; $arch = undef; $version = undef; } + if ($vt eq "bysuite") { + $version = undef; + $arch = undef if ($arch eq "any"); + } + if ($vt eq "bypkg" || $vt eq "bysrc") { $dist = undef; $arch = undef; } + } + if (defined $param{'ordering'}) { + my $o = $param{'ordering'}; + if ($o eq "raw") { $raw_sort = 1; $bug_rev = 0; } + if ($o eq "normal") { $raw_sort = 0; $bug_rev = 0; } + if ($o eq "reverse") { $raw_sort = 0; $bug_rev = 1; } + } + if (defined $param{'includesubj'}) { + my $is = $param{'includesubj'}; + $include .= "," . join(",", map { "subj:$_" } (split /[\s,]+/, $is)); + } + if (defined $param{'excludesubj'}) { + my $es = $param{'excludesubj'}; + $exclude .= "," . join(",", map { "subj:$_" } (split /[\s,]+/, $es)); + } +} + + my ($pkg, $src, $maint, $maintenc, $submitter, $severity, $status, $tag); my %which = ( @@ -239,15 +266,16 @@ if (defined $pkg) { })}; } -my $result = htmlizebugs(\@bugs); +my $result = pkg_htmlizebugs(\@bugs); print "Content-Type: text/html; charset=utf-8\n\n"; print "\n"; print "\n" . "$debbugs::gProject$Archived $debbugs::gBug report logs: $title\n" . + '' . "\n" . - '' . + '' . "\n"; print "

" . "$debbugs::gProject$Archived $debbugs::gBug report logs: $title" . "

\n"; @@ -281,9 +309,9 @@ if (defined $pkg || defined $src) { if ( @pkgs ) { @pkgs = sort @pkgs; if ($pkg) { - print "You may want to refer to the following packages that are part of the same source:
\n"; + print "

You may want to refer to the following packages that are part of the same source:\n"; } else { - print "You may want to refer to the following individual bug pages:
\n"; + print "

You may want to refer to the following individual bug pages:\n"; } push @pkgs, $src if ( $src && !grep(/^\Q$src\E$/, @pkgs) ); print join( ", ", map( "$_", @pkgs ) ); @@ -337,7 +365,413 @@ if (defined $pkg || defined $src) { print $result if $showresult; +print pkg_javascript(); +print "

Options

\n"; +print "
\n"; +printf "
\n", myurl(); + +print "\n"; + +my ($checked_any, $checked_sui, $checked_ver) = ("", "", ""); +if (defined $dist) { + $checked_sui = "CHECKED"; +} elsif (defined $version) { + $checked_ver = "CHECKED"; +} else { + $checked_any = "CHECKED"; +} + +print "\n"; +print " \n"; +print ""; +print " \n"; + +if (defined $pkg) { + print ""; + print " \n"; +} elsif (defined $src) { + print ""; + print " \n"; +} + +my $sel_rmy = ($repeatmerged ? " selected" : ""); +my $sel_rmn = ($repeatmerged ? "" : " selected"); +my $sel_ordraw = ($raw_sort ? " selected" : ""); +my $sel_ordnor = (!$raw_sort && !$bug_rev ? " selected" : ""); +my $sel_ordrev = (!$raw_sort && $bug_rev ? " selected" : ""); +my $includetags = join(" ", grep { !m/^subj:/i } split /[\s,]+/, $include); +my $excludetags = join(" ", grep { !m/^subj:/i } split /[\s,]+/, $exclude); +my $includesubj = join(" ", map { s/^subj://i; $_ } grep { m/^subj:/i } split /[\s,]+/, $include); +my $excludesubj = join(" ", map { s/^subj://i; $_ } grep { m/^subj:/i } split /[\s,]+/, $exclude); +my $vismindays = ($mindays == 0 ? "" : $mindays); +my $vismaxdays = ($maxdays == -1 ? "" : $maxdays); + +print < + + + + + +EOF + +print "
Show bugs applicable toanything
" . pkg_htmlselectsuite(1,2,1) . " for " . pkg_htmlselectarch(1,2,2) . "
$pkg version
$src version
Display merged bugs + +
Order bugs by + +
Only include bugs tagged with or that have in their subject
Exclude bugs tagged with or that have in their subject
Only show bugs older than days, and younger than days
with new settings
\n"; + print "
\n"; -print "$tail_html"; +print "

$tail_html"; print "\n"; + +sub pkg_htmlindexentrystatus { + my $s = shift; + my %status = %{$s}; + + my $result = ""; + + my $showseverity; + if ($status{severity} eq 'normal') { + $showseverity = ''; + } elsif (isstrongseverity($status{severity})) { + $showseverity = "Severity: $status{severity};\n"; + } else { + $showseverity = "Severity: $status{severity};\n"; + } + + $result .= pkg_htmlpackagelinks($status{"package"}, 1); + + my $showversions = ''; + if (@{$status{found_versions}}) { + my @found = @{$status{found_versions}}; + local $_; + s{/}{ } foreach @found; + $showversions .= join ', ', map htmlsanit($_), @found; + } + if (@{$status{fixed_versions}}) { + $showversions .= '; ' if length $showversions; + $showversions .= 'fixed: '; + my @fixed = @{$status{fixed_versions}}; + local $_; + s{/}{ } foreach @fixed; + $showversions .= join ', ', map htmlsanit($_), @fixed; + } + $result .= " ($showversions)" if length $showversions; + $result .= ";\n"; + + $result .= $showseverity; + $result .= pkg_htmladdresslinks("Reported by: ", \&submitterurl, + $status{originator}); + $result .= ";\nOwned by: " . htmlsanit($status{owner}) + if length $status{owner}; + $result .= ";\nTags: " + . htmlsanit(join(", ", sort(split(/\s+/, $status{tags})))) + . "" + if (length($status{tags})); + + my @merged= split(/ /,$status{mergedwith}); + my $mseparator= ";\nMerged with "; + for my $m (@merged) { + $result .= $mseparator."#$m"; + $mseparator= ", "; + } + + my $days = 0; + if (length($status{done})) { + $result .= "
Done: " . htmlsanit($status{done}); + $days = ceil($debbugs::gRemoveAge - -M buglog($status{id})); + if ($days >= 0) { + $result .= ";\nWill be archived" . ( $days == 0 ? " today" : $days == 1 ? " in $days day" : " in $days days" ) . ""; + } else { + $result .= ";\nArchived"; + } + } + + unless (length($status{done})) { + if (length($status{forwarded})) { + $result .= ";\nForwarded to " + . maybelink($status{forwarded}); + } + my $daysold = int((time - $status{date}) / 86400); # seconds to days + if ($daysold >= 7) { + my $font = ""; + my $efont = ""; + $font = "em" if ($daysold > 30); + $font = "strong" if ($daysold > 60); + $efont = "" if ($font); + $font = "<$font>" if ($font); + + my $yearsold = int($daysold / 365); + $daysold -= $yearsold * 365; + + $result .= ";\n $font"; + my @age; + push @age, "1 year" if ($yearsold == 1); + push @age, "$yearsold years" if ($yearsold > 1); + push @age, "1 day" if ($daysold == 1); + push @age, "$daysold days" if ($daysold > 1); + $result .= join(" and ", @age); + $result .= " old$efont"; + } + } + + $result .= "."; + + return $result; +} + + +sub pkg_htmlizebugs { + $b = $_[0]; + my @bugs = @$b; + my $anydone = 0; + + my @status = (); + my %count; + my $header = ''; + my $footer = "

Summary

\n"; + + my @dummy = ($debbugs::gRemoveAge, @debbugs::gSeverityList, @debbugs::gSeverityDisplay); #, $debbugs::gHTMLExpireNote); + + if (@bugs == 0) { + return "

No reports found!

\n"; + } + + if ( $bug_rev ) { + @bugs = sort {$b<=>$a} @bugs; + } else { + @bugs = sort {$a<=>$b} @bugs; + } + my %seenmerged; + + my @common_grouping = ( 'severity', 'pending' ); + my %common_grouping_order = ( + 'pending' => [ qw( pending forwarded pending-fixed fixed done absent ) ], + 'severity' => \@debbugs::gSeverityList, + ); + my %common_grouping_display = ( + 'pending' => 'Status', + 'severity' => 'Severity', + ); + my %common_headers = ( + 'pending' => { + "pending" => "outstanding", + "pending-fixed" => "pending upload", + "fixed" => "fixed in NMU", + "done" => "resolved", + "forwarded" => "forwarded to upstream software authors", + "absent" => "not applicable to this version", + }, + 'severity' => \%debbugs::gSeverityDisplay, + ); + my %common_reverse = ( 'pending' => $pend_rev, 'severity' => $sev_rev ); + my %common = ( + 'show_list_header' => 1, + 'show_list_footer' => 1, + ); + my $common_raw_sort = $raw_sort; + + my %section = (); + + foreach my $bug (@bugs) { + my %status = %{getbugstatus($bug)}; + next unless %status; + next if bugfilter($bug, %status); + + my $html = sprintf "
  • #%d: %s\n
    ", + bugurl($bug), $bug, htmlsanit($status{subject}); + $html .= pkg_htmlindexentrystatus(\%status) . "\n"; + my $key = join( '_', map( {$status{$_}} @common_grouping ) ); + $section{$key} .= $html; + $count{"_$key"}++; + foreach my $grouping ( @common_grouping ) { + $count{"${grouping}_$status{$grouping}"}++; + } + $anydone = 1 if $status{pending} eq 'done'; + push @status, [ $bug, \%status, $html ]; + } + + my $result = ""; + if ($common_raw_sort) { + $result .= "\n"; + } else { + my (@order, @headers); + for( my $i = 0; $i < @common_grouping; $i++ ) { + my $grouping_name = $common_grouping[ $i ]; + my @items = @{ $common_grouping_order{ $grouping_name } }; + @items = reverse( @items ) if ( $common_reverse{ $grouping_name } ); + my @neworder = (); + my @newheaders = (); + if ( @order ) { + foreach my $grouping ( @items ) { + push @neworder, map( { "${_}_$grouping" } @order ); + push @newheaders, map( { "$_ - $common_headers{$grouping_name}{$grouping}" } @headers ); + } + @order = @neworder; + @headers = @newheaders; + } else { + push @order, @items; + push @headers, map( { $common_headers{$common_grouping[$i]}{$_} } @items ); + } + } + $header .= "\n"; + for ( my $i = 0; $i < @order; $i++ ) { + my $order = $order[ $i ]; + next unless defined $section{$order}; + if ($common{show_list_header}) { + my $count = $count{"_$order"}; + my $bugs = $count == 1 ? "bug" : "bugs"; + $result .= "

    $headers[$i] ($count $bugs)

    \n"; + } else { + $result .= "

    $headers[$i]

    \n"; + } + $result .= "
    \n\n
    \n"; + } + $footer .= "\n"; + } + + $result = $header . $result if ( $common{show_list_header} ); + #$result .= "

    " . $debbugs::gHTMLExpireNote if $debbugs::gRemoveAge and $anydone; + $result .= $footer if ( $common{show_list_footer} ); + return $result; +} + +sub pkg_htmlpackagelinks { + my $pkgs = shift; + return unless defined $pkgs and $pkgs ne ''; + my $strong = shift; + my @pkglist = splitpackages($pkgs); + + $strong = 0; + my $openstrong = $strong ? '' : ''; + my $closestrong = $strong ? '' : ''; + + return 'Package' . (@pkglist > 1 ? 's' : '') . ': ' . + join(', ', + map { + '' . + $openstrong . htmlsanit($_) . $closestrong . '' + } @pkglist + ); +} + +sub pkg_htmladdresslinks { + my ($prefixfunc, $urlfunc, $addresses) = @_; + if (defined $addresses and $addresses ne '') { + my @addrs = getparsedaddrs($addresses); + my $prefix = (ref $prefixfunc) ? $prefixfunc->(scalar @addrs) + : $prefixfunc; + return $prefix . + join ', ', map { sprintf '%s', + $urlfunc->($_->address), + htmlsanit($_->format) || '(unknown)' + } @addrs; + } else { + my $prefix = (ref $prefixfunc) ? $prefixfunc->(1) : $prefixfunc; + return sprintf '%s(unknown)', $prefix, $urlfunc->(''); + } +} + +sub pkg_javascript { + return < + + +EOF +} + +sub pkg_htmlselectsuite { + my $id = sprintf "b_%d_%d_%d", $_[0], $_[1], $_[2]; + my @suites = ("stable", "testing", "unstable", "experimental"); + my %suiteaka = ("stable", "sarge", "testing", "etch", "unstable", "sid"); + my $defaultsuite = "unstable"; + + my $result = sprintf ''; + return $result; +} + +sub pkg_htmlselectarch { + my $id = sprintf "b_%d_%d_%d", $_[0], $_[1], $_[2]; + my @arches = qw(alpha amd64 arm hppa i386 ia64 m68k mips mipsel powerpc s390 sparc); + + my $result = sprintf ''; + return $result; +} + +sub myurl { + return pkg_etc_url($pkg, "pkg", 0) if defined($pkg); + return pkg_etc_url($src, "src", 0) if defined($src); + return pkg_etc_url($maint, "maint", 0) if defined($maint); + return pkg_etc_url($submitter, "submitter", 0) if defined($submitter); + return pkg_etc_url($severity, "severity", 0) if defined($severity); + return pkg_etc_url($tag, "tag", 0) if defined($tag); +} diff --git a/cgi/smarturl.cgi b/cgi/smarturl.cgi index f911d10..4e6056a 100644 --- a/cgi/smarturl.cgi +++ b/cgi/smarturl.cgi @@ -18,9 +18,8 @@ if (defined $ENV{REQUEST_METHOD} and $ENV{REQUEST_METHOD} eq 'HEAD') { } my $path = $ENV{PATH_INFO}; -my %param = readparse(); -if ($path =~ m,^/(\d+)(/(\d)+(/.*)?)?$,) { +if ($path =~ m,^/(\d+)(/(\d+)(/.*)?)?$,) { my $bug = $1; my $msg = $3; my $rest = $4; -- 2.39.2