Date: Tue, 19 Feb 2013 02:25:39 +0000 (UTC) From: Mark Linimon <linimon@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r246962 - user/bugmeister/gnats/tools Message-ID: <201302190225.r1J2Pdll015622@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: linimon (doc,ports committer) Date: Tue Feb 19 02:25:39 2013 New Revision: 246962 URL: http://svnweb.freebsd.org/changeset/base/246962 Log: Production copy of www/en/cgi/query-pr-summary.cgi. Added: user/bugmeister/gnats/tools/query-pr-summary.cgi (contents, props changed) Added: user/bugmeister/gnats/tools/query-pr-summary.cgi ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/bugmeister/gnats/tools/query-pr-summary.cgi Tue Feb 19 02:25:39 2013 (r246962) @@ -0,0 +1,792 @@ +#!/usr/bin/perl -T +# $FreeBSD: www/en/cgi/query-pr-summary.cgi,v 1.53 2005/11/17 04:43:38 fenner Exp $ + +# NOTE: locally modified by linimon + +sub escape($) { $_ = $_[0]; s/&/&/g; s/</</g; s/>/>/g; $_; } + +$html_mode = 1 if $ENV{'DOCUMENT_ROOT'}; +$self_ref = $ENV{'SCRIPT_NAME'}; +($query_pr_ref = $self_ref) =~ s/-summary//; + +$ENV{'PATH'} = '/bin:/usr/bin:/usr/sbin:/sbin:/usr/local/bin'; + +$project = 'FreeBSD'; +$mail_prefix = 'freebsd-'; +$mail_unass = 'freebsd-bugs'; +$ports_unass = 'ports-bugs'; +$closed_too = 0; + +require '/home/gnats/tools/cgi-lib.pl'; +require '/home/gnats/tools/cgi-style.pl'; +require 'getopts.pl'; + +if ($ENV{'QUERY_STRING'} eq 'query') { + print &html_header("Query $project problem reports"); + &displayform; + print &html_footer; + exit(0); +} + +if ($html_mode) { + $query_args = '--restricted '; + &ReadParse(*input) if $html_mode; + +} else { + &Getopts('CcQqRr:s:T:t:'); + + $input{'responsible'} = 'summary' if $opt_R; + if ($opt_r) { + ($input{'responsible'}) = ($opt_r =~ m/^(\^?[-_a-zA-Z0-9@.]*\$?)$/); + die 'Insecure args' if ($input{'responsible'} ne $opt_r) + } + if ($opt_s) { + ($input{'state'}) = ($opt_s =~ m/^([a-zA-Z]*)$/); + die 'Insecure args' if ($input{'state'} ne $opt_s) + } + # XXX MCL 20080907 not informative + #$input{'very_quiet'} = 'yes' if $opt_Q; + $input{'quiet'} = 'yes' if $opt_q || $opt_Q; + if ($opt_C) { + $query_args = '--confidential=yes '; + } elsif (!$opt_c) { + $query_args = '--restricted '; + } + # tag, ignoring severity + if ($opt_T) { + ($tag) = ($opt_T =~ m/^(\^?[-_a-zA-Z0-9@.]*\$?)$/); + die 'Insecure args' if ($tag ne $opt_T); + $input{'text'} = '\[' . $tag . '\]'; + } + # tag, by severity + if ($opt_t) { + ($tag) = ($opt_t =~ m/^(\^?[-_a-zA-Z0-9@.]*\$?)$/); + die 'Insecure args' if ($tag ne $opt_t); + $input{'text'} = '\[' . $tag . '\]'; + } +} + +$closed_too = 1 if $input{'state'} eq 'closed' || $input{'closedtoo'}; + +#------------------------------------------------------------------------ + +%mons = ('Jan', '01', 'Feb', '02', 'Mar', '03', + 'Apr', '04', 'May', '05', 'Jun', '06', + 'Jul', '07', 'Aug', '08', 'Sep', '09', + 'Oct', '10', 'Nov', '11', 'Dec', '12'); + + +if ($html_mode) { + + $pr = '<pre>'; $pr_e = '</pre>'; + $h1 = '<h1>'; $h1_e = '</h1>'; + $h3 = '<h3>'; $h3_e = '</h3>'; + $hr = '<hr/>'; + + $table = "<table width='100%' border='0' cellspacing='1' cellpadding='0'>"; + $table_e = '</table>'; + + # Customizations for the look and feel of the summary tables. + $t_style = "<style type='text/css'><!--\n" . + "table { background-color: #ccc; color: #000; }\n" . + "tr { padding: 0; }\n" . + "th { background-color: #cbd2ec; color: #000; padding: 2px;\n" . + " text-align: left; font-weight: normal; font-style: italic; }\n" . + "td { color: #000; padding: 2px; }\n" . + "td a { text-decoration: none; }\n" . + ".o { background-color: #fff; }\n" . + ".a { background-color: #cffafd; }\n" . + ".f { background-color: #ffc; }\n" . + ".p { background-color: #d1fbd6; }\n" . + ".r { background-color: #d6cfc4; }\n" . + ".s { background-color: #fcccd9; }\n" . + ".c { background-color: #c1d5db; }\n" . + "--></style>"; + +} else { + + $pr = ''; $pr_e = ''; + $h1 = ''; $h1_e = ''; + $h3 = ''; $h3_e = ''; + $hr = "\n----------------------------------------" . + "----------------------------------------\n"; + + $table = ''; + $table_e = ''; +} + +sub cgiparam { + local ($result) = @_; + + $result =~ s/[^A-Za-z0-9+.@-]/"%".sprintf("%02X", unpack("C", $&))/ge; + $result; +} + +sub header_info { + if ($html_mode) { + print &html_header("Current $project problem reports"); + } + else { + # XXX MCL 20080907 not informative + #if (!$input{'very_quiet'}) { + # print "Current $project problem reports\n"; + #} + } + if (!$input{'quiet'}) { + # 20080915 added the hrefs + print "The following is a listing of current problems submitted by $project users.\n" . + "These represent problem reports covering all versions including\n" . + "experimental development code and obsolete releases.\n\n"; + "See also http://www.freebsd.org/support/bugreports.html and.\n"; + "http://www.freebsd.org/doc/en_US.ISO8859-1/articles/pr-guidelines/pr-states.html.\n"; + +# XXX MCL moved to bottom 20080907 +# if ($html_mode) { +# print <<EOM; +# +#<p> +#Bugs can be in one of several states: +#</p> +#<dl> +#<dt class='o'><strong>o - open</strong></dt> +#<dd>A problem report has been submitted, no sanity checking +#performed.</dd> +# +#<dt class='a'><strong>a - analyzed</strong></dt> +#<dd>The problem is understood and a solution is being sought.</dd> +# +#<dt class='f'><strong>f - feedback</strong></dt> +#<dd>Further work requires additional information from the originator +#or the community - possibly confirmation of the effectiveness of a +#proposed solution.</dd> +# +#<dt class='p'><strong>p - patched</strong></dt> +#<dd>A patch has been committed, but some issues (MFC and / or +#confirmation from originator) are still open.</dd> +# +#<dt class='r'><strong>r - repocopy</strong></dt> +#<dd>The resolution of the problem report is dependent on a repocopy +#operation within the CVS repository which is awaiting completion.</dd> +# +#<dt class='s'><strong>s - suspended</strong></dt> +#<dd>The problem is not being worked on, due to lack of information or +#resources. This is a prime candidate for somebody who is looking for a +#project to do. If the problem cannot be solved at all, it will be +#closed, rather than suspended.</dd> +# +#<dt class='c'><strong>c - closed</strong></dt> +#<dd>A problem report is closed when any changes have been integrated, +#documented, and tested -- or when fixing the problem is abandoned.</dd> +#</dl> +#EOM +# +# } else { +# +#print <<EOM; +# +#Bugs can be in one of several states: +# +#o - open +#A problem report has been submitted, no sanity checking performed. +# +#a - analyzed +#The problem is understood and a solution is being sought. +# +#f - feedback +#Further work requires additional information from the +# originator or the community - possibly confirmation of +# the effectiveness of a proposed solution. +# +#p - patched +#A patch has been committed, but some issues (MFC and / or +# confirmation from originator) are still open. +# +#r - repocopy +#The resolution of the problem report is dependent on +# a repocopy operation within the CVS repository which +# is awaiting completion. +# +#s - suspended +#The problem is not being worked on, due to lack of information +# or resources. This is a prime candidate +# for somebody who is looking for a project to do. +# If the problem cannot be solved at all, +# it will be closed, rather than suspended. +# +#c - closed +#A problem report is closed when any changes have been integrated, +# documented, and tested -- or when fixing the problem is abandoned. +# +#EOM +# } +# XXX MCL moved to bottom 20080907 + } + + if ($html_mode) { + +# These self references are attempts to only change a single variable at a time. +# If someone does a multiple-variable query they will probably do weird things. + +$self_ref1 = $self_ref . '?'; +$self_ref1 .= 'sort=' . escape($input{'sort'}) if $input{'sort'}; +print "<p>You may view summaries by <a href='$self_ref1'>Severity</a>, "; +$self_ref1 .= '&' if ($self_ref1 !~/\?$/); +print "<a href='${self_ref1}state=summary'>State</a>, "; +print "<a href='${self_ref1}category=summary'>Category</a>, or "; +print "<a href='${self_ref1}responsible=summary'>Responsible Party</a>."; + +$self_ref2 = $self_ref . '?'; +foreach ('category', 'originator', 'priority', 'class', 'responsible', + 'severity', 'state', 'submitter', 'text', 'multitext', 'closedtoo') { + if ($input{$_}) { + $self_ref2 .= '&' if ($self_ref2 !~/\?$/); + $self_ref2 .= $_ . '=' . cgiparam($input{$_}); + } +} + +print 'You may also sort by '; +print "<a href='$self_ref2&sort=lastmod'>Last-Modified</a>, "; +print "<a href='$self_ref2&sort=category'>Category</a>, or "; +print "<a href='$self_ref2&sort=responsible'>Responsible Party</a>.\n"; +print "Or <a href='$self_ref?query'>formulate a specific query</a>.\n"; + +$self_ref3 = $self_ref . '?'; +foreach ('category', 'originator', 'priority', 'class', 'responsible', + 'severity', 'state', 'submitter', 'text', 'multitext', 'sort') { + if ($input{$_}) { + $self_ref3 .= '&' if ($self_ref2 !~/\?$/); + $self_ref3 .= $_ . '=' . cgiparam($input{$_}); + } +} + +if ($input{'closedtoo'}) { + print "<a href='$self_ref3'>Do not show closed reports</a>."; +} else { + print "<a href='$self_ref3&closedtoo=on'>Include closed reports too</a>."; +} + +print "</p>\n"; + + } +} + +&header_info; + +#Usage: query-pr [-FGhiPRqVx] [-C confidential] [-c category] [-d directory] +# [-e severity] [-m mtext] [-O originator] [-o outfile] [-p priority] +# [-L class] [-r responsible] [-S submitter] [-s state] [-t text] +# [-b date] [-a date] [-B date] [-M date] [-z date] [-Z date] +# [-y synopsis] [-A release] [--full] [--help] [--print-path] [--version] +# [--summary] [--sql] [--skip-closed] [--category=category] +# [--confidential=yes|no] [--directory=directory] [--output=outfile] +# [--originator=name] [--priority=level] [--class=class] +# [--responsible=person] [--release=release] [--restricted] +# [--quarter=quarter] [--keywords=regexp] +# [--required-before=date] [--required-after=date] +# [--arrived-before=date] [--arrived-after=date] +# [--modified-before=date] [--modified-after=date] +# [--closed-before=date] [--closed-after=date] +# [--severity=severity] [--state=state] [--submitter=submitter] +# [--list-categories] [--list-classes] [--list-responsible] +# [--list-states] [--list-submitters] [--list-config] +# [--synopsis=synopsis] [--text=text] [--multitext=mtext] [PR] [PR]... + +$query_args .= ' --skip-closed' unless $closed_too; + +# Only read the appropriate PR's. +foreach ('category', 'originator', 'priority', 'class', 'responsible', + 'release', 'severity', 'state', 'submitter', 'text', 'multitext') { + if ($input{$_} && $input{$_} ne 'summary') { + $d = $input{$_}; + $d =~ s/^"(.*)"$/$&/; + $d =~ s/'/\\'/; + $query_args .= " --${_}='$d'"; + } +} + +&read_gnats($query_args); + +if ($input{'sort'} eq 'lastmod') { + @prs = sort {$lastmod{$b} cmp $lastmod{$a}} @prs; +} elsif ($input{'sort'} eq 'category') { + @prs = sort {($ca,$na)=split(m|/|,$a); ($cb,$nb)=split(m|/|,$b); $ca eq $cb ? $na <=> $nb : $ca cmp $cb} @prs; +} elsif ($input{'sort'} eq 'responsible') { + @prs = sort {$resp{$a} cmp $resp{$b}} @prs; +} else { + # XXX MCL 20080907 + # $input{'sort'} = 'none'; + @prs = reverse @prs; +} + +if ($#prs < $[) { + print "\n${h1}No matches to your query${h1_e}\n"; + +} elsif ($input{'responsible'} eq 'summary') { + &resp_summary; + +} elsif ($input{'state'} eq 'summary') { + &state_summary; + +} elsif ($input{'category'} eq 'summary') { + &cat_summary; + +# XXX MCL 20080907 s/''/'summary'/ +} elsif ($input{'severity'} eq 'summary' && $opt_T eq '') { + &severity_summary; + +} else { + &printcnt(&gnats_summary(1, $html_mode)); + +} + +# XXX MCL code moved here 20080907 + if ($html_mode) { + print <<EOM; + +<p> +Bugs can be in one of several states: +</p> +<dl> +<dt class='o'><strong>o - open</strong></dt> +<dd>A problem report has been submitted, no sanity checking +performed.</dd> + +<dt class='a'><strong>a - analyzed</strong></dt> +<dd>The problem is understood and a solution is being sought.</dd> + +<dt class='f'><strong>f - feedback</strong></dt> +<dd>Further work requires additional information from the originator +or the community - possibly confirmation of the effectiveness of a +proposed solution.</dd> + +<dt class='p'><strong>p - patched</strong></dt> +<dd>A patch has been committed, but some issues (MFC and / or +confirmation from originator) are still open.</dd> + +<dt class='r'><strong>r - repocopy</strong></dt> +<dd>The resolution of the problem report is dependent on a repocopy +operation within the CVS repository which is awaiting completion.</dd> + +<dt class='s'><strong>s - suspended</strong></dt> +<dd>The problem is not being worked on, due to lack of information or +resources. This is a prime candidate for somebody who is looking for a +project to do. If the problem cannot be solved at all, it will be +closed, rather than suspended.</dd> + +<dt class='c'><strong>c - closed</strong></dt> +<dd>A problem report is closed when any changes have been integrated, +documented, and tested -- or when fixing the problem is abandoned.</dd> +</dl> +EOM + +# 20080915 test: declare this boilerplate obsolete +# } else { +# +#print <<EOM; +# +#Bugs can be in one of several states: +# +#o - open +#A problem report has been submitted, no sanity checking performed. +# +#a - analyzed +#The problem is understood and a solution is being sought. +# +#f - feedback +#Further work requires additional information from the +# originator or the community - possibly confirmation of +# the effectiveness of a proposed solution. +# +#p - patched +#A patch has been committed, but some issues (MFC and / or +# confirmation from originator) are still open. +# +#r - repocopy +#The resolution of the problem report is dependent on +# a repocopy operation within the CVS repository which +# is awaiting completion. +# +#s - suspended +#The problem is not being worked on, due to lack of information +# or resources. This is a prime candidate +# for somebody who is looking for a project to do. +# If the problem cannot be solved at all, +# it will be closed, rather than suspended. +# +#c - closed +#A problem report is closed when any changes have been integrated, +# documented, and tested -- or when fixing the problem is abandoned. +# +#EOM + } +# XXX MCL code moved here 20080907 + +print &html_footer if $html_mode; + +exit(0); + +#------------------------------------------------------------------------ + +sub getline { + local($_) = @_; + ($tag,$remainder) = split(/[ \t]+/, $_, 2); + return $remainder; +} + +sub html_fixline { + local($line) = @_[0]; + + $line =~ s/&/&/g; + $line =~ s/</</g; + $line =~ s/>/>/g; + + $line; +} + +sub printcnt { + local($cnt) = $_[0]; + + if ($cnt) { + printf("%d problem%s total.\n\n", $cnt, $cnt == 1 ? '' : 's'); + } +} + +sub cat_summary { + &get_categories; + foreach (keys %status) { + s|/\d+||; + $cat{$_}++; + } + foreach (@categories) { + next unless $cat{$_}; # skip categories with no bugs. + print "${h3}Problems in category: $_ ($catdesc{$_})${h3_e}\n"; + if (/^(\w+)/) { + &printcnt(&gnats_summary("\$cat eq \"$1\"", $html_mode)); + } else { + print "\n??? weird category $_\n"; + } + } +} + +sub resp_query { + local($resp) = @_[0]; + local($cnt); + + $cnt = &gnats_summary("\$resp eq \"$resp\"", $html_mode); + print "${hr}${b}No problem reports assigned to $resp${b_e}\n" + if (!$input{"quiet"} && $cnt == 0); +} + +sub resp_summary { + local($who, %who); + + foreach (keys %resp) { + $who{$resp{$_}}++; + } + foreach $who (sort keys %who) { + $cnt = &gnats_summary("\$resp eq \"$who\"", $html_mode); + } +} + +sub state_summary { + &get_states; + foreach (@states) { + next if ($_ eq "closed" && !$input{"closedtoo"}); + print "${h3}Problems in state: $_${h3_e}\n"; + if (/^(\w)/) { + &printcnt(&gnats_summary("\$state eq \"$1\" ", $html_mode)); + } else { + print "\n??? bad state $state\n"; + } + } +} + +sub severity_summary { + print "${h3}Critical problems${h3_e}\n"; + &printcnt(&gnats_summary('$severity eq "critical"', $html_mode)); + + print "${h3}Serious problems${h3_e}\n"; + &printcnt(&gnats_summary('$severity eq "serious"', $html_mode)); + + print "${h3}Non-critical problems${h3_e}\n"; + &printcnt(&gnats_summary('$severity eq "non-critical"', $html_mode)); +} + +sub get_categories { + @categories = (); + + open(Q, 'query-pr --list-categories 2>/dev/null |') || + die "Cannot get categories\n"; + + while(<Q>) { + chop; + local ($cat, $desc, $responsible, $notify) = split(/:/); + push(@categories, $cat); + $catdesc{$cat} = $desc; + } +} + +sub get_states { + @states = (); + + open(Q, 'query-pr --list-states 2>/dev/null |') || + die "Cannot get states\n"; + + while(<Q>) { + chop; + local ($state, $type, $desc) = split(/:/); + push(@states, $state); + $statedesc{$state} = $desc; + } +} + +sub get_classes { + @classes = (); + + open(Q, 'query-pr --list-classes 2>/dev/null |') || + die "Cannot get classes\n"; + + while(<Q>) { + chop; + local ($class, $type, $desc) = split(/:/); + push(@classes, $class); + $classdesc{$class} = $desc; + } +} + +sub read_gnats { + local($report) = @_[0]; + + open(Q, "query-pr $report 2>/dev/null |") || die "Cannot query the PR's\n"; + + while(<Q>) { + chop; + if(/^>Number:/) { + $number = &getline($_); + + } elsif (/Arrival-Date:/) { + $date = &getline($_); + # strip timezone if any (between HH:MM:SS and YYYY at end of line): + $date =~ s/(\d\d:\d\d:\d\d)\D+(\d{4})$/\1 \2/; + ($dow,$mon,$day,$time,$year,$xtra) = split(/[ \t]+/, $date); + $day = "0$day" if $day =~ /^[0-9]$/; + $date = "$year/$mons{$mon}/$day"; + + } elsif (/>Last-Modified:/) { + $lastmod = &getline($_); + if ($lastmod =~ /^[ ]*$/) { + $lastmod = $date; + } else { + # strip timezone if any (between HH:MM:SS and YYYY at end of line): + $lastmod =~ s/(\d\d:\d\d:\d\d)\D+(\d{4})$/\1 \2/; + ($dow,$mon,$day,$time,$year,$xtra) = split(/[ \t]+/, $lastmod); + $day = "0$day" if $day =~ /^[0-9]$/; + $lastmod = "$year/$mons{$mon}/$day"; + } + + } elsif (/>Category:/) { + $cat = &getline($_); + + } elsif (/>Severity:/) { + $sev = &getline($_); + + } elsif (/>Responsible:/) { + $resp = &getline($_); + $resp =~ s/@.*//; + $resp =~ tr/A-Z/a-z/; + $resp = "" if (($resp =~ /$mail_unass/o) or ($resp =~ /$ports_unass/o)); + $resp =~ s/^$mail_prefix//; + + } elsif (/>State:/) { + $status = &getline($_); + $status =~ s/(.).*/\1/; + + } elsif (/>Synopsis:/) { + $syn = &getline($_); + $syn =~ s/[\t]+/ /g; + + } elsif (/^$/) { + $_ = sprintf("%s/%s", $cat, $number); + + $status{$_} = $status; + $date{$_} = $date; + $resp{$_} = $resp; + $syn{$_} = $syn; + $sev{$_} = $sev; + $lastmod{$_} = $lastmod; + push(@prs,$_); + } + } + close(Q); +} + +sub gnats_summary { + local($report) = @_[0]; + local($htmlmode) = @_[1]; + local($counter) = 0; + + foreach (@prs) { + $state = $status{$_}; + $date = $date{$_}; + $resp = $resp{$_}; + $syn = $syn{$_}; + $severity = $sev{$_}; + ($cat, $number) = m|^([^/]+)/(\d+)$|; + + next if (($report ne '') && (eval($report) == 0)); + + if ($htmlmode) { + $title = "<a href='$query_pr_ref?pr=$cat/$number'>$_</a>"; + $syn = &html_fixline($syn); + gnats_summary_line_html($counter, $state, $date, $title, $resp, $syn); + } else { + $title = substr($cat,0,5) . '/' . $number; + gnats_summary_line_text($counter, $state, $date, $title, $resp, $syn); + } + + $counter++; + } + + if ($htmlmode) { + print "${table_e}\n" if $counter; + } else { + print "${pr_e}\n" if $counter; + } + + $counter; +} + +sub gnats_summary_line_html { + local($counter) = shift; + local($state) = shift; + local($date) = shift; + local($title) = shift; + local($resp) = shift; + local($syn) = shift; + + if ($counter == 0) { + print "$table<tr><th>S</th><th>Submitted</th><th>Tracker</th><th>Resp.</th><th>Description</th></tr>\n" + } + + print "<tr class='$state'><td>$state</td><td>$date</td><td>$title</td><td>$resp</td><td>$syn</td></tr>\n"; +} + +sub gnats_summary_line_text { + local($counter) = shift; + local($state) = shift; + local($date) = shift; + local($title) = shift; + local($resp) = shift; + local($syn) = shift; + + # Print the banner line if this is the first iteration. + print "${pr}\nS Tracker Resp. Description${hr}" + if ($counter == 0); + print "$state " . + $title . (' ' x (13 - length($title))) . + $resp . (' ' x (11 - length($resp))) . + substr($syn,0,54) . "\n"; +} + +sub displayform { +print qq` +<p> +Please select the items you wish to search for. Multiple items are AND'ed +together. +</p> +<form method='get' action='$self_ref'> + +<table> +<tr> +<td><b>Category</b>:</td> +<td><select name='category'> +<option selected='selected' value=''>Any</option>`; + +&get_categories; +foreach (sort @categories) { + #print "<option value='$_'>$_ ($catdesc{$_})</option>\n"; + print "<option>$_</option>\n"; +} + +print qq` +</select></td> +<td><b>Severity</b>:</td> +<td><select name='severity'> +<option selected='selected' value=''>Any</option> +<option>non-critical</option> +<option>serious</option> +<option>critical</option> +</select></td> +</tr><tr> +<td><b>Priority</b>:</td> +<td><select name='priority'> +<option selected='selected' value=''>Any</option> +<option>low</option> +<option>medium</option> +<option>high</option> +</select></td> +<td><b>Class</b>:</td> +<td><select name='class'> +<option selected='selected' value=''>Any</option> +`; + +&get_classes; +foreach (@classes) { + #print "<option value='$_'>$_ ($classdesc{$_})</option>\n"; + print "<option>$_</option>\n"; +} + +print qq`</select></td> +</tr><tr> +<td><b>State</b>:</td> +<td><select name='state'> +<option selected='selected' value=''>Any</option> +`; + +&get_states; +foreach (@states) { + ($us = $_) =~ s/^./\U$&/; + print "<option value='$_'>"; + #print "$us ($statedesc{$_})</option>\n"; + print "$us</option>\n"; +} + +print qq`</select></td> +<td><b>Sort by</b>:</td> +<td><select name='sort'> +<option value='none'>No Sort</option> +<option value='lastmod'>Last-Modified</option> +<option value='category'>Category</option> +<option value='responsible'>Responsible Party</option> +</select></td> +</tr><tr> +<!-- We don't use submitter Submitter: --> +<td><b>Text in single-line fields</b>:</td> +<td><input type='text' name='text' /></td> +<td><b>Responsible</b>:</td> +<td><input type='text' name='responsible' /></td> +</tr><tr> +<td><b>Text in multi-line fields</b>:</td> +<td><input type='text' name='multitext' /></td> +<td><b>Originator</b>:</td> +<td><input type='text' name='originator' /></td> +</tr><tr> +<td><b>Closed reports too</b>:</td> +<td><input name='closedtoo' value='on' type='checkbox' /></td> +<td><b>Release</b>:</td> +<td><select name='release'> +<option selected='selected' value=''>Any</option> +<option value='^FreeBSD [2345]'>Pre-6.x</option> +<option value='^FreeBSD 6'>6.x only</option> +<option value='^FreeBSD 5'>5.x only</option> +<option value='^FreeBSD 4'>4.x only</option> +<option value='^FreeBSD 3'>3.x only</option> +<option value='^FreeBSD 2'>2.x only</option> +</select></td> +</tr> +</table> +<input type='submit' value='Query PRs' /> +<input type='reset' value='Reset Form' /> +</form> +`; +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201302190225.r1J2Pdll015622>