X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=cgi%2Fcommon.pl;h=05b8941ac7f84f8a2d2e07b9556ba9c6cabf577c;hb=refs%2Fheads%2Fdon%2Fcookies;hp=04e77b82b855e0cf778cc6b7eecc08b654d9da40;hpb=28c789fab5114661321f43d163b58f109adde40e;p=debbugs.git diff --git a/cgi/common.pl b/cgi/common.pl index 04e77b8..05b8941 100644 --- a/cgi/common.pl +++ b/cgi/common.pl @@ -2,93 +2,219 @@ use DB_File; use Fcntl qw/O_RDONLY/; +use Mail::Address; +use MLDBM qw(DB_File Storable); +use POSIX qw/ceil/; + +use URI::Escape; + +use Debbugs::Config qw(:globals :text); $config_path = '/etc/debbugs'; $lib_path = '/usr/lib/debbugs'; -require "$lib_path/errorlib"; +#require "$lib_path/errorlib"; + +use Debbugs::Packages qw(:versions :mapping); +use Debbugs::Versions; +use Debbugs::MIME qw(decode_rfc1522); +use Debbugs::Common qw(:util); +use Debbugs::Status qw(:status :read :versions); +use Debbugs::CGI qw(:all); +use Debbugs::Bugs qw(count_bugs); + +$MLDBM::RemoveTaint = 1; +my %common_bugusertags; +my $common_mindays = 0; +my $common_maxdays = -1; my $common_archive = 0; my $common_repeatmerged = 1; my %common_include = (); my %common_exclude = (); my $common_raw_sort = 0; my $common_bug_reverse = 0; -my $common_pending_reverse = 0; -my $common_severity_reverse = 0; -my @common_pending_include = (); -my @common_pending_exclude = (); -my @common_severity_include = (); -my @common_severity_exclude = (); +my $common_leet_urls = 0; + +my %common_reverse = ( + 'pending' => 0, + 'severity' => 0, +); +my %common = ( + 'show_list_header' => 1, + 'show_list_footer' => 1, +); + +sub exact_field_match { + my ($field, $values, $status) = @_; + my @values = @$values; + my @ret = grep {$_ eq $status->{$field} } @values; + $#ret != -1; +} +sub contains_field_match { + my ($field, $values, $status) = @_; + foreach my $data (@$values) { + return 1 if (index($status->{$field}, $data) > -1); + } + return 0; +} + +sub detect_user_agent { + my $userAgent = $ENV{HTTP_USER_AGENT}; + return { 'name' => 'unknown' } unless defined $userAgent; + return { 'name' => 'links' } if ( $userAgent =~ m,^ELinks,); + return { 'name' => 'lynx' } if ( $userAgent =~ m,^Lynx,); + return { 'name' => 'wget' } if ( $userAgent =~ m,^Wget,); + return { 'name' => 'gecko' } if ( $userAgent =~ m,^Mozilla.* Gecko/,); + return { 'name' => 'ie' } if ( $userAgent =~ m,^.*MSIE.*,); + return { 'name' => 'unknown' }; +} + +my %field_match = ( + 'subject' => \&contains_field_match, + 'tags' => sub { + my ($field, $values, $status) = @_; + my %values = map {$_=>1} @$values; + foreach my $t (split /\s+/, $status->{$field}) { + return 1 if (defined $values{$t}); + } + return 0; + }, + 'severity' => \&exact_field_match, + 'pending' => \&exact_field_match, + 'originator' => \%contains_field_match, + 'forwarded' => \%contains_field_match, + 'owner' => \%contains_field_match, +); +my @common_grouping = ( 'severity', 'pending' ); +my %common_grouping_order = ( + 'pending' => [ qw( pending forwarded pending-fixed fixed done absent ) ], + 'severity' => \@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' => \%gSeverityDisplay, +); + +my $common_version; +my $common_dist; +my $common_arch; my $debug = 0; +my $use_bug_idx = 0; +my %bugidx; + +sub array_option($) { + my ($val) = @_; + my @vals; + @vals = ( $val ) if (ref($val) eq "" && $val ); + @vals = ( $$val ) if (ref($val) eq "SCALAR" && $$val ); + @vals = @{$val} if (ref($val) eq "ARRAY" ); + return @vals; +} + +sub filter_include_exclude($\%) { + my ($val, $filter_map) = @_; + my @vals = array_option($val); + my @data = map { + if (/^([^:]*):(.*)$/) { if ($1 eq 'subj') { ['subject', $2]; } else { [$1, $2] } } else { ['tags', $_] } + } split /[\s,]+/, join ',', @vals; + foreach my $data (@data) { + &quitcgi("Invalid filter key: '$data->[0]'") if (!exists($field_match{$data->[0]})); + push @{$filter_map->{$data->[0]}}, $data->[1]; + } +} + +sub filter_option($$\%) { + my ($key, $val, $filter_map) = @_; + my @vals = array_option($val); + foreach $val (@vals) { + push @{$filter_map->{$key}}, $val; + } +} sub set_option { my ($opt, $val) = @_; + if ($opt eq "use-bug-idx") { + $use_bug_idx = $val; + if ( $val ) { + $common_headers{pending}{open} = $common_headers{pending}{pending}; + my $bugidx = tie %bugidx, MLDBM => "$gSpoolDir/realtime/bug.idx", O_RDONLY + or quitcgi( "$0: can't open $gSpoolDir/realtime/bug.idx ($!)\n" ); + $bugidx->RemoveTaint(1); + } else { + untie %bugidx; + } + } + if ($opt =~ m/^show_list_(foot|head)er$/) { $common{$opt} = $val; } if ($opt eq "archive") { $common_archive = $val; } if ($opt eq "repeatmerged") { $common_repeatmerged = $val; } if ($opt eq "exclude") { - my @vals; - @vals = ( $val ) if (ref($val) eq "" && $val ); - @vals = ( $$val ) if (ref($val) eq "SCALAR" && $$val ); - @vals = @{$val} if (ref($val) eq "ARRAY" ); - %common_exclude = map { - if (/^(.*):(.*)$/) { ($1, $2) } else { ($_, 1) } - } split /[\s,]+/, join ',', @vals; + filter_include_exclude($val, %common_exclude); } if ($opt eq "include") { - my @vals; - @vals = ( $val, ) if (ref($val) eq "" && $val ); - @vals = ( $$val, ) if (ref($val) eq "SCALAR" && $$val ); - @vals = @{$val} if (ref($val) eq "ARRAY" ); - %common_include = map { - if (/^(.*):(.*)$/) { ($1, $2) } else { ($_, 1) } - } split /[\s,]+/, join ',', @vals; + filter_include_exclude($val, %common_include); } if ($opt eq "raw") { $common_raw_sort = $val; } if ($opt eq "bug-rev") { $common_bug_reverse = $val; } - if ($opt eq "pend-rev") { $common_pending_reverse = $val; } - if ($opt eq "sev-rev") { $common_severity_reverse = $val; } + if ($opt eq "pend-rev") { $common_reverse{pending} = $val; } + if ($opt eq "sev-rev") { $common_reverse{severity} = $val; } if ($opt eq "pend-exc") { - my @vals; - @vals = ( $val ) if (ref($val) eq "" && $val ); - @vals = ( $$val ) if (ref($val) eq "SCALAR" && $$val ); - @vals = @{$val} if (ref($val) eq "ARRAY" ); - @common_pending_exclude = @vals if (@vals); + filter_option('pending', $val, %common_exclude); } if ($opt eq "pend-inc") { - my @vals; - @vals = ( $val, ) if (ref($val) eq "" && $val ); - @vals = ( $$val, ) if (ref($val) eq "SCALAR" && $$val ); - @vals = @{$val} if (ref($val) eq "ARRAY" ); - @common_pending_include = @vals if (@vals); + filter_option('pending', $val, %common_include); } if ($opt eq "sev-exc") { - my @vals; - @vals = ( $val ) if (ref($val) eq "" && $val ); - @vals = ( $$val ) if (ref($val) eq "SCALAR" && $$val ); - @vals = @{$val} if (ref($val) eq "ARRAY" ); - @common_severity_exclude = @vals if (@vals); + filter_option('severity', $val, %common_exclude); } if ($opt eq "sev-inc") { - my @vals; - @vals = ( $val ) if (ref($val) eq "" && $val ); - @vals = ( $$val ) if (ref($val) eq "SCALAR" && $$val ); - @vals = @{$val} if (ref($val) eq "ARRAY" ); - @common_severity_include = @vals if (@vals); + filter_option('severity', $val, %common_include); } + if ($opt eq "version") { $common_version = $val; } + if ($opt eq "dist") { $common_dist = $val; } + if ($opt eq "arch") { $common_arch = $val; } + if ($opt eq "maxdays") { $common_maxdays = $val; } + if ($opt eq "mindays") { $common_mindays = $val; } + if ($opt eq "bugusertags") { %common_bugusertags = %{$val}; } } 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); + } if (defined $ENV{"QUERY_STRING"} && $ENV{"QUERY_STRING"} ne "") { - $in=$ENV{QUERY_STRING}; - } elsif(defined $ENV{"REQUEST_METHOD"} - && $ENV{"REQUEST_METHOD"} eq "POST") + $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; + $in = "$x;$in"; + } + $in =~ s/&/;/g; + $in =~ s/;;+/;/g; $in =~ s/^;//; $in =~ s/;$//; foreach (split(/[&;]/,$in)) { s/\+/ /g; ($key, $val) = split(/=/,$_,2); @@ -102,55 +228,35 @@ sub readparse { } $ret{$key}=$val; } + $debug = 1 if (defined $ret{"debug"} && $ret{"debug"} eq "aj"); - return %ret; -} -sub quitcgi { - my $msg = shift; - print "Content-Type: text/html\n\n"; - print "Error\n"; - print "An error occurred. Dammit.\n"; - print "Error was: $msg.\n"; - print "\n"; - exit 0; -} + $common_leet_urls = 1 + if (defined $ret{"leeturls"} && $ret{"leeturls"} eq "yes"); -#sub abort { -# my $msg = shift; -# my $Archive = $common_archive ? "archive" : ""; -# print header . start_html("Sorry"); -# print "Sorry bug #$msg doesn't seem to be in the $Archive database.\n"; -# print end_html; -# exit 0; -#} - -# Split a package string from the status file into a list of package names. -sub splitpackages { - my $pkgs = shift; - return unless defined $pkgs; - return split /[ \t?,()]+/, $pkgs; + return %ret; } # Generate a comma-separated list of HTML links to each package given in # $pkgs. $pkgs may be empty, in which case an empty string is returned, or # it may be a comma-separated list of package names. sub htmlpackagelinks { - my $pkgs = shift; - return unless defined $pkgs and $pkgs ne ''; - my $strong = shift; - my @pkglist = splitpackages($pkgs); - - my $openstrong = $strong ? '' : ''; - my $closestrong = $strong ? '' : ''; - - return 'Package' . (@pkglist > 1 ? 's' : '') . ': ' . - join(', ', - map { - '' . - $openstrong . htmlsanit($_) . $closestrong . '' - } @pkglist - ) . ";\n"; + return htmlize_packagelinks(@_); +} + +# Generate a comma-separated list of HTML links to each address given in +# $addresses, which should be a comma-separated list of RFC822 addresses. +# $urlfunc should be a reference to a function like mainturl or submitterurl +# which returns the URL for each individual address. +sub htmladdresslinks { + htmlize_addresslinks(@_); +} + +# Generate a comma-separated list of HTML links to each maintainer given in +# $maints, which should be a comma-separated list of RFC822 addresses. +sub htmlmaintlinks { + my ($prefixfunc, $maints) = @_; + return htmladdresslinks($prefixfunc, \&mainturl, $maints); } sub htmlindexentry { @@ -168,21 +274,41 @@ sub htmlindexentrystatus { if ($status{severity} eq 'normal') { $showseverity = ''; - } elsif (grep($status{severity} eq $_, @debbugs::gStrongSeverities)) { + } elsif (isstrongseverity($status{severity})) { $showseverity = "Severity: $status{severity};\n"; } else { $showseverity = "Severity: $status{severity};\n"; } $result .= 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 .= "Reported by: " . htmlsanit($status{originator}) . ""; + $result .= 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) { @@ -192,7 +318,15 @@ sub htmlindexentrystatus { if (length($status{done})) { $result .= ";\nDone: " . htmlsanit($status{done}); - } else { + $days = ceil($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}); @@ -225,42 +359,41 @@ sub htmlindexentrystatus { return $result; } -sub submitterurl { - my $ref = shift || ""; - my $params = "submitter=" . emailfromrfc822($ref); - $params .= "&archive=yes" if ($common_archive); - $params .= "&repeatmerged=no" unless ($common_repeatmerged); - return urlsanit("pkgreport.cgi" . "?" . $params); +sub urlargs { + my $args = ''; + $args .= ";archive=yes" if $common_archive; + $args .= ";repeatmerged=no" unless $common_repeatmerged; + $args .= ";mindays=${common_mindays}" unless $common_mindays == 0; + $args .= ";maxdays=${common_maxdays}" unless $common_maxdays == -1; + $args .= ";version=$common_version" if defined $common_version; + $args .= ";dist=$common_dist" if defined $common_dist; + $args .= ";arch=$common_arch" if defined $common_arch; + return $args; } -sub mainturl { - my $ref = shift || ""; - my $params = "maint=" . emailfromrfc822($ref); - $params .= "&archive=yes" if ($common_archive); - $params .= "&repeatmerged=no" unless ($common_repeatmerged); - return urlsanit("pkgreport.cgi" . "?" . $params); -} +sub pkgurl { pkg_url(pkg => $_[0] || ""); } +sub srcurl { pkg_url(src => $_[0] || ""); } +sub tagurl { pkg_url(tag => $_[0] || ""); } -sub pkgurl { +sub pkg_etc_url { my $ref = shift; - my $params = "pkg=$ref"; - $params .= "&archive=yes" if ($common_archive); - $params .= "&repeatmerged=no" unless ($common_repeatmerged); - - return urlsanit("pkgreport.cgi" . "?" . "$params"); -} - -sub srcurl { - my $ref = shift; - my $params = "src=$ref"; - $params .= "&archive=yes" if ($common_archive); - $params .= "&repeatmerged=no" unless ($common_repeatmerged); - return urlsanit("pkgreport.cgi" . "?" . "$params"); + my $code = shift; + if ($common_leet_urls) { + $code = "package" if ($code eq "pkg"); + $code = "source" if ($code eq "src"); + return urlsanit("/x/$code/$ref"); + } else { + my $addurlargs = shift || 1; + my $params = "$code=$ref"; + $params .= urlargs() if $addurlargs; + return urlsanit("pkgreport.cgi" . "?" . $params); + } } sub urlsanit { my $url = shift; $url =~ s/%/%25/g; + $url =~ s/#/%23/g; $url =~ s/\+/%2b/g; my %saniarray = ('<','lt', '>','gt', '&','amp', '"','quot'); $url =~ s/([<>&"])/\&$saniarray{$1};/g; @@ -274,64 +407,89 @@ sub htmlsanit { return $in; } -sub maybelink { - my $in = shift; - if ($in =~ /^[a-zA-Z0-9+.-]+:/) { # RFC 1738 scheme - return qq{} . htmlsanit($in) . ''; - } else { - return htmlsanit($in); - } -} - sub bugurl { my $ref = shift; my $params = "bug=$ref"; - foreach my $val (@_) { - $params .= "\&msg=$1" if ($val =~ /^msg=([0-9]+)/); - $params .= "\&archive=yes" if (!$common_archive && $val =~ /^archive.*$/); - } - $params .= "&archive=yes" if ($common_archive); - $params .= "&repeatmerged=no" unless ($common_repeatmerged); + my $filename = ''; - return urlsanit("bugreport.cgi" . "?" . "$params"); -} + if ($common_leet_urls) { + my $msg = ""; + my $mbox = ""; + my $att = ""; + foreach my $val (@_) { + $mbox = "/mbox" if ($val eq "mbox"); + $msg = "/$1" if ($val =~ /^msg=([0-9]+)/); + $att = "/$1" if ($val =~ /^att=([0-9]+)/); + $filename = "/$1" if ($val =~ /^filename=(.*)$/); + } + my $ext = ""; + if ($mbox ne "") { + $ext = $mbox; + } elsif ($att ne "") { + $ext = "$att$filename"; + } + return urlsanit("/x/$ref$msg$ext"); + } else { + foreach my $val (@_) { + $params .= ";mbox=yes" if ($val eq "mbox"); + $params .= ";msg=$1" if ($val =~ /^msg=([0-9]+)/); + $params .= ";att=$1" if ($val =~ /^att=([0-9]+)/); + $filename = $1 if ($val =~ /^filename=(.*)$/); + $params .= ";archive=yes" if (!$common_archive && $val =~ /^archive.*$/); + } + $params .= ";archive=yes" if ($common_archive); + $params .= ";repeatmerged=no" unless ($common_repeatmerged); -sub dlurl { - my $ref = shift; - my $params = "bug=$ref"; - my $filename = ''; - foreach my $val (@_) { - $params .= "\&$1=$2" if ($val =~ /^(msg|att)=([0-9]+)/); - $filename = $1 if ($val =~ /^filename=(.*)$/); - } - $params .= "&archive=yes" if ($common_archive); - my $pathinfo = ''; - $pathinfo = "/$filename" if $filename ne ''; + my $pathinfo = ''; + $pathinfo = '/'.uri_escape($filename) if $filename ne ''; - return urlsanit("bugreport.cgi$pathinfo?$params"); + return urlsanit("bugreport.cgi" . $pathinfo . "?" . $params); + } } -sub mboxurl { - my $ref = shift; - return urlsanit("bugreport.cgi" . "?" . "bug=$ref&mbox=yes"); -} +sub dlurl { bugurl(@_); } +sub mboxurl { return bugurl($ref, "mbox"); } sub allbugs { return @{getbugs(sub { 1 })}; } +sub bugmatches { + my ($hash, $status) = @_; + foreach my $key( keys( %$hash ) ) { + my $value = $hash->{$key}; + my $sub = $field_match{$key}; + return 1 if ($sub->($key, $value, $status)); + } + return 0; +} +sub bugfilter { + my ($bug, $status,$seen_merged,$common_include,$common_exclude,$repeat_merged,) = @_; + #our (%seenmerged); + if ($common_include) { + return 1 if (!bugmatches($common_include, $status)); + } + if ($common_exclude) { + return 1 if (bugmatches($common_exclude, $status)); + } + my @merged = sort {$a<=>$b} $bug, split(/ /, $status{mergedwith}); + my $daysold = int((time - $status{date}) / 86400); # seconds to days + return 1 unless ($common_mindays <= $daysold); + return 1 unless ($common_maxdays == -1 || $daysold <= $common_maxdays); + return 1 unless ($common_repeatmerged || !$seenmerged{$merged[0]}); + $seenmerged{$merged[0]} = 1; + return 0; +} + sub htmlizebugs { $b = $_[0]; my @bugs = @$b; - my @rawsort; - - my %section = (); + my $anydone = 0; - my %displayshowpending = ("pending", "outstanding", - "pending-fixed", "pending upload", - "fixed", "fixed in NMU", - "done", "resolved", - "forwarded", "forwarded to upstream software authors"); + my @status = (); + my %count; + my $header = ''; + my $footer = ''; if (@bugs == 0) { return "

No reports found!

\n"; @@ -346,103 +504,92 @@ sub htmlizebugs { foreach my $bug (@bugs) { my %status = %{getbugstatus($bug)}; next unless %status; - if (%common_include) { - my $okay = 0; - foreach my $t (split /\s+/, $status{tags}) { - $okay = 1, last if (defined $common_include{$t}); - } - if (defined $common_include{subj}) { - if (index($status{subject}, $common_include{subj}) > -1) { - $okay = 1; - } - } - next unless ($okay); - } - if (%common_exclude) { - my $okay = 1; - foreach my $t (split /\s+/, $status{tags}) { - $okay = 0, last if (defined $common_exclude{$t}); - } - if (defined $common_exclude{subj}) { - if (index($status{subject}, $common_exclude{subj}) > -1) { - $okay = 0; - } - } - next unless ($okay); - } - next if @common_pending_include and - not grep { $_ eq $status{pending} } @common_pending_include; - next if @common_severity_include and - not grep { $_ eq $status{severity} } @common_severity_include; - next if grep { $_ eq $status{pending} } @common_pending_exclude; - next if grep { $_ eq $status{severity} } @common_severity_exclude; - - my @merged = sort {$a<=>$b} ($bug, split(/ /, $status{mergedwith})); - next unless ($common_repeatmerged || !$seenmerged{$merged[0]}); - $seenmerged{$merged[0]} = 1; + next if bugfilter($bug, %status); my $html = sprintf "
  • #%d: %s\n
    ", bugurl($bug), $bug, htmlsanit($status{subject}); $html .= htmlindexentrystatus(\%status) . "\n"; - $section{$status{pending} . "_" . $status{severity}} .= $html; - push @rawsort, $html if $common_raw_sort; + 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 = ""; - my $anydone = 0; if ($common_raw_sort) { - $result .= "\n"; + $result .= "\n"; } else { - my @pendingList = qw(pending forwarded pending-fixed fixed done); - @pendingList = reverse @pendingList if $common_pending_reverse; -#print STDERR join(",",@pendingList)."\n"; -#print STDERR join(",",@common_pending_include).":$#common_pending_include\n"; - foreach my $pending (@pendingList) { - my @severityList = @debbugs::gSeverityList; - @severityList = reverse @severityList if $common_severity_reverse; -#print STDERR join(",",@severityList)."\n"; - -# foreach my $severity(@debbugs::gSeverityList) { - foreach my $severity(@severityList) { - $severity = $debbugs::gDefaultSeverity if ($severity eq ''); - next unless defined $section{${pending} . "_" . ${severity}}; - $result .= "

    $debbugs::gSeverityDisplay{$severity} - $displayshowpending{$pending}

    \n"; - #$result .= "(A list of all such bugs is available).\n"; - #$result .= "(A list of all such bugs used to be available).\n"; - $result .= "