mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-04 13:07:52 +00:00
Landing Gerv and Adam's changes for bug #6682
This commit is contained in:
parent
f0fc64531d
commit
3347f61971
@ -27,11 +27,16 @@
|
||||
use DB_File;
|
||||
use diagnostics;
|
||||
use strict;
|
||||
use vars @::legal_product,
|
||||
@::legal_bug_status;
|
||||
use vars @::legal_product;
|
||||
|
||||
require "globals.pl";
|
||||
|
||||
# tidy up after graphing module
|
||||
chdir("data/mining");
|
||||
unlink <*.gif>;
|
||||
unlink <*.png>;
|
||||
chdir("../..");
|
||||
|
||||
ConnectToDatabase();
|
||||
GetVersionTable();
|
||||
|
||||
@ -71,32 +76,36 @@ sub collect_stats {
|
||||
if (open DATA, ">>$file") {
|
||||
push my @row, &today;
|
||||
|
||||
foreach my $status (@::legal_bug_status) {
|
||||
foreach my $status ('NEW', 'ASSIGNED', 'REOPENED', 'UNCONFIRMED', 'RESOLVED', 'VERIFIED', 'CLOSED') {
|
||||
if( $product eq "-All-" ) {
|
||||
SendSQL("select count(bug_status) from bugs where bug_status='$status'");
|
||||
} else {
|
||||
SendSQL("select count(bug_status) from bugs where bug_status='$status' and product='$product'");
|
||||
}
|
||||
|
||||
push @row, FetchOneColumn();
|
||||
}
|
||||
|
||||
if (! $exists)
|
||||
{
|
||||
print DATA <<FIN;
|
||||
# Bugzilla daily bug stats
|
||||
#
|
||||
# do not edit me! this file is generated.
|
||||
#
|
||||
# product: $product
|
||||
# created: $when
|
||||
FIN
|
||||
print DATA "# field: DATE";
|
||||
foreach my $status (@::legal_bug_status) {
|
||||
print DATA "|$status";
|
||||
foreach my $resolution ('FIXED', 'INVALID', 'WONTFIX', 'LATER', 'REMIND', 'DUPLICATE', 'WORKSFORME', 'MOVED') {
|
||||
if( $product eq "-All-" ) {
|
||||
SendSQL("select count(resolution) from bugs where resolution='$resolution'");
|
||||
} else {
|
||||
SendSQL("select count(resolution) from bugs where resolution='$resolution' and product='$product'");
|
||||
}
|
||||
print DATA "\n";
|
||||
push @row, FetchOneColumn();
|
||||
}
|
||||
|
||||
if (! $exists) {
|
||||
print DATA <<FIN;
|
||||
# Bugzilla Daily Bug Stats
|
||||
#
|
||||
# Do not edit me! This file is generated.
|
||||
#
|
||||
# Fields: DATE|NEW|ASSIGNED|REOPENED|UNCONFIRMED|FIXED|INVALID|WONTFIX|LATER|REMIND|DUPLICATE|WORKSFORME|MOVED
|
||||
# Product: $product
|
||||
# Created: $when
|
||||
FIN
|
||||
}
|
||||
print DATA (join '|', @row) . "\n";
|
||||
close DATA;
|
||||
} else {
|
||||
|
@ -28,19 +28,28 @@
|
||||
# Joe Robins <jmrobins@tgix.com>,
|
||||
# If using the usebuggroups parameter, users shouldn't be able to see
|
||||
# reports for products they don't have access to.
|
||||
# Gervase Markham <gerv@gerv.net> and Adam Spiers <adam@spiers.net>
|
||||
# Added ability to chart any combination of resolutions/statuses.
|
||||
# Derive the choice of resolutions/statuses from the -All- data file
|
||||
# Removed hardcoded order of resolutions/statuses when reading from
|
||||
# daily stats file, so now works independently of collectstats.pl
|
||||
# version
|
||||
# Added image caching by date and datasets
|
||||
|
||||
use diagnostics;
|
||||
use strict;
|
||||
|
||||
use GD;
|
||||
eval "use Chart::Lines";
|
||||
|
||||
require "CGI.pl";
|
||||
require "globals.pl";
|
||||
use vars qw(%FORM); # globals from CGI.pl
|
||||
|
||||
use vars @::legal_product;
|
||||
require "globals.pl";
|
||||
use vars qw(@legal_product); # globals from er, globals.pl
|
||||
|
||||
my $dir = "data/mining";
|
||||
my $week = 60 * 60 * 24 * 7;
|
||||
|
||||
my @status = qw (NEW ASSIGNED REOPENED);
|
||||
my %bugsperperson;
|
||||
|
||||
@ -66,14 +75,12 @@ print "Content-type: text/html\n";
|
||||
print "Content-disposition: inline; filename=bugzilla_report.html\n\n";
|
||||
|
||||
# If we're here for the first time, give a banner. Else respect the banner flag.
|
||||
if ( (!defined $::FORM{'product'}) || ($::FORM{'banner'}) )
|
||||
{
|
||||
if ( (!defined $FORM{'product'}) || ($FORM{'banner'}) ) {
|
||||
PutHeader ("Bug Reports")
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
else {
|
||||
print("<html><head><title>Bug Reports</title></head><body bgcolor=\"#FFFFFF\">");
|
||||
}
|
||||
}
|
||||
|
||||
GetVersionTable();
|
||||
|
||||
@ -82,7 +89,7 @@ GetVersionTable();
|
||||
my @myproducts;
|
||||
if(Param("usebuggroups")) {
|
||||
push( @myproducts, "-All-");
|
||||
foreach my $this_product (@::legal_product) {
|
||||
foreach my $this_product (@legal_product) {
|
||||
if(GroupExists($this_product) && !UserInGroup($this_product)) {
|
||||
next;
|
||||
} else {
|
||||
@ -90,22 +97,21 @@ if(Param("usebuggroups")) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
push( @myproducts, "-All-", @::legal_product );
|
||||
push( @myproducts, "-All-", @legal_product );
|
||||
}
|
||||
|
||||
$::FORM{'output'} = $::FORM{'output'} || "most_doomed"; # a reasonable default
|
||||
$FORM{'output'} ||= "most_doomed"; # a reasonable default
|
||||
|
||||
if (! defined $::FORM{'product'})
|
||||
{
|
||||
if (! defined $FORM{'product'}) {
|
||||
&choose_product;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
else {
|
||||
# If usebuggroups is on, we don't want people to be able to view
|
||||
# reports for products they don't have permissions for...
|
||||
if(Param("usebuggroups") &&
|
||||
GroupExists($::FORM{'product'}) &&
|
||||
!UserInGroup($::FORM{'product'})) {
|
||||
GroupExists($FORM{'product'}) &&
|
||||
!UserInGroup($FORM{'product'}))
|
||||
{
|
||||
print "<H1>Permission denied.</H1>\n";
|
||||
print "Sorry; you do not have the permissions necessary to view\n";
|
||||
print "reports for this product.\n";
|
||||
@ -118,41 +124,37 @@ else
|
||||
# can be called from outside. modify %reports
|
||||
# accordingly when a new report type is added
|
||||
|
||||
if (! exists $reports{$::FORM{'output'}})
|
||||
{
|
||||
$::FORM{'output'} = "most_doomed"; # a reasonable default
|
||||
if (! exists $reports{$FORM{'output'}}) {
|
||||
$FORM{'output'} = "most_doomed"; # a reasonable default
|
||||
}
|
||||
|
||||
my $f = $reports{$::FORM{'output'}};
|
||||
my $f = $reports{$FORM{'output'}};
|
||||
|
||||
if (! defined $f)
|
||||
{
|
||||
if (! defined $f) {
|
||||
print "start over, your form data was all messed up.<p>\n";
|
||||
foreach (keys %::FORM)
|
||||
{
|
||||
foreach (keys %::FORM) {
|
||||
print "<font color=blue>$_</font> : " .
|
||||
($::FORM{$_} ? $::FORM{$_} : "undef") . "<br>\n";
|
||||
($FORM{$_} ? $FORM{$_} : "undef") . "<br>\n";
|
||||
}
|
||||
PutFooter() if $::FORM{banner};
|
||||
PutFooter() if $FORM{banner};
|
||||
exit;
|
||||
}
|
||||
|
||||
&{$f};
|
||||
}
|
||||
}
|
||||
|
||||
print <<FIN;
|
||||
<p>
|
||||
FIN
|
||||
|
||||
PutFooter() if $::FORM{banner};
|
||||
PutFooter() if $FORM{banner};
|
||||
|
||||
|
||||
##################################
|
||||
# user came in with no form data #
|
||||
##################################
|
||||
|
||||
sub choose_product
|
||||
{
|
||||
sub choose_product {
|
||||
my $product_popup = make_options (\@myproducts, $myproducts[0]);
|
||||
my $charts = defined $Chart::Lines::VERSION && -d $dir ? "<option value=\"show_chart\">Bug Charts" : "";
|
||||
# get rid of warning:
|
||||
@ -185,11 +187,45 @@ FIN
|
||||
$charts
|
||||
</select>
|
||||
<tr>
|
||||
<td align=center><b>Chart datasets:</b></td>
|
||||
<td align=center>
|
||||
<select name="datasets" multiple size=5>
|
||||
FIN
|
||||
|
||||
my @datasets = ();
|
||||
|
||||
my $datafile = daily_stats_filename('-All-');
|
||||
if (! open(DATA, "$dir/$datafile")) {
|
||||
die_politely("Couldn't read daily statistics file");
|
||||
}
|
||||
|
||||
while (<DATA>) {
|
||||
if (/^# fields?: (.+)\s*$/) {
|
||||
@datasets = grep ! /date/i, (split /\|/, $1);
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
close(DATA);
|
||||
|
||||
my %default_sel = map { $_ => 1 }
|
||||
qw/UNCONFIRMED NEW ASSIGNED REOPENED/;
|
||||
foreach my $dataset (@datasets) {
|
||||
my $sel = $default_sel{$dataset} ? ' selected' : '';
|
||||
print qq{<option value="$dataset:"$sel>$dataset</option>\n};
|
||||
}
|
||||
|
||||
print <<FIN;
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center><b>Switches:</b></td>
|
||||
<td align=left>
|
||||
<input type=checkbox name=links checked value=1> Links to Bugs<br>
|
||||
<input type=checkbox name=banner checked value=1> Banner<br>
|
||||
FIN
|
||||
|
||||
if (Param('usequip')) {
|
||||
print "<input type=checkbox name=quip value=1> Quip<br>";
|
||||
} else {
|
||||
@ -210,16 +246,15 @@ FIN
|
||||
#Add this above to get a control for showing the SQL query:
|
||||
#<input type=checkbox name=showsql value=1> Show SQL<br>
|
||||
PutFooter();
|
||||
}
|
||||
}
|
||||
|
||||
sub most_doomed
|
||||
{
|
||||
sub most_doomed {
|
||||
my $when = localtime (time);
|
||||
|
||||
print <<FIN;
|
||||
<center>
|
||||
<h1>
|
||||
Bug Report for $::FORM{'product'}
|
||||
Bug Report for $FORM{'product'}
|
||||
</h1>
|
||||
$when<p>
|
||||
FIN
|
||||
@ -242,8 +277,8 @@ where bugs.assigned_to = assign.userid
|
||||
and bugs.reporter = report.userid
|
||||
FIN
|
||||
|
||||
if( $::FORM{'product'} ne "-All-" ) {
|
||||
$query .= "and bugs.product=".SqlQuote($::FORM{'product'});
|
||||
if ($FORM{'product'} ne "-All-" ) {
|
||||
$query .= "and bugs.product=".SqlQuote($FORM{'product'});
|
||||
}
|
||||
|
||||
$query .= <<FIN;
|
||||
@ -257,7 +292,7 @@ FIN
|
||||
# End build up $query string
|
||||
|
||||
print "<font color=purple><tt>$query</tt></font><p>\n"
|
||||
unless (! exists $::FORM{'showsql'});
|
||||
unless (! exists $FORM{'showsql'});
|
||||
|
||||
SendSQL ($query);
|
||||
|
||||
@ -277,8 +312,8 @@ FIN
|
||||
# suck contents of database #
|
||||
#############################
|
||||
|
||||
while (my ($bid, $a, $sev, $st, $prod, $who, $rep, $ts) = FetchSQLData())
|
||||
{
|
||||
my $week = 60 * 60 * 24 * 7;
|
||||
while (my ($bid, $a, $sev, $st, $prod, $who, $rep, $ts) = FetchSQLData()) {
|
||||
next if (exists $bugs_lookup{$bid});
|
||||
|
||||
$bugs_lookup{$bid} ++;
|
||||
@ -292,13 +327,10 @@ FIN
|
||||
$bugs_totals{$who}{$st} ++;
|
||||
}
|
||||
|
||||
if ($::FORM{'quip'})
|
||||
{
|
||||
if (open (COMMENTS, "<data/comments"))
|
||||
{
|
||||
if ($FORM{'quip'}) {
|
||||
if (open (COMMENTS, "<data/comments")) {
|
||||
my @cdata;
|
||||
while (<COMMENTS>)
|
||||
{
|
||||
while (<COMMENTS>) {
|
||||
push @cdata, $_;
|
||||
}
|
||||
close COMMENTS;
|
||||
@ -345,10 +377,9 @@ FIN
|
||||
<p>
|
||||
FIN
|
||||
|
||||
if ($bugs_count == 0)
|
||||
{
|
||||
if ($bugs_count == 0) {
|
||||
print "No bugs found!\n";
|
||||
PutFooter() if $::FORM{banner};
|
||||
PutFooter() if $FORM{banner};
|
||||
exit;
|
||||
}
|
||||
|
||||
@ -364,16 +395,14 @@ FIN
|
||||
</tr>
|
||||
FIN
|
||||
|
||||
foreach my $who (sort keys %bugs_summary)
|
||||
{
|
||||
foreach my $who (sort keys %bugs_summary) {
|
||||
my $bugz = 0;
|
||||
print <<FIN;
|
||||
<tr>
|
||||
<td align=left><tt>$who</tt></td>
|
||||
FIN
|
||||
|
||||
foreach my $st (@status)
|
||||
{
|
||||
foreach my $st (@status) {
|
||||
$bugs_totals{$who}{$st} += 0;
|
||||
print <<FIN;
|
||||
<td align=center>$bugs_totals{$who}{$st}
|
||||
@ -407,25 +436,20 @@ FIN
|
||||
</tr>
|
||||
FIN
|
||||
|
||||
foreach my $who (sort keys %bugs_summary)
|
||||
{
|
||||
foreach my $who (sort keys %bugs_summary) {
|
||||
print <<FIN;
|
||||
<tr>
|
||||
<td align=left><tt>$who</tt></td>
|
||||
FIN
|
||||
|
||||
foreach my $st (@status)
|
||||
{
|
||||
foreach my $st (@status) {
|
||||
my @l;
|
||||
|
||||
foreach (sort { $a <=> $b } @{$bugs_summary{$who}{$st}})
|
||||
{
|
||||
if ($::FORM{'links'})
|
||||
{
|
||||
foreach (sort { $a <=> $b } @{$bugs_summary{$who}{$st}}) {
|
||||
if ($FORM{'links'}) {
|
||||
push @l, "<a href=\"show_bug.cgi?id=$_\">$_</a>\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
push @l, $_;
|
||||
}
|
||||
}
|
||||
@ -447,119 +471,167 @@ FIN
|
||||
</table>
|
||||
<p>
|
||||
FIN
|
||||
}
|
||||
}
|
||||
|
||||
sub is_legal_product
|
||||
{
|
||||
sub is_legal_product {
|
||||
my $product = shift;
|
||||
return grep { $_ eq $product} @myproducts;
|
||||
}
|
||||
|
||||
sub daily_stats_filename {
|
||||
my ($prodname) = @_;
|
||||
$prodname =~ s/\//-/gs;
|
||||
return $prodname;
|
||||
}
|
||||
|
||||
sub show_chart {
|
||||
if (! is_legal_product ($FORM{'product'})) {
|
||||
&die_politely ("Unknown product: $FORM{'product'}");
|
||||
}
|
||||
|
||||
sub show_chart
|
||||
{
|
||||
my $when = localtime (time);
|
||||
|
||||
if (! is_legal_product ($::FORM{'product'}))
|
||||
{
|
||||
&die_politely ("Unknown product: $::FORM{'product'}");
|
||||
if (! $FORM{datasets}) {
|
||||
die_politely("You didn't select any datasets to plot");
|
||||
}
|
||||
|
||||
print <<FIN;
|
||||
<center>
|
||||
FIN
|
||||
|
||||
my @dates;
|
||||
my @open; my @assigned; my @reopened;
|
||||
my @resolved; my @verified; my @closed;
|
||||
my $type = chart_image_type();
|
||||
my $data_file = daily_stats_filename($FORM{product});
|
||||
my $image_file = chart_image_name($data_file, $type);
|
||||
my $url_image = "$dir/" . url_quote($image_file);
|
||||
|
||||
my $prodname = $::FORM{'product'};
|
||||
|
||||
$prodname =~ s/\//-/gs;
|
||||
|
||||
my $testimg = Chart::Lines->new(2,2);
|
||||
my $x = '$testimg->gif()';
|
||||
eval $x;
|
||||
my $type = ($@ =~ /Can't locate object method/) ? "png" : "gif";
|
||||
|
||||
my $file = join '/', $dir, $prodname;
|
||||
my $image = "$file.$type";
|
||||
my $url_image = $dir . "/" . url_quote($prodname) . ".$type";
|
||||
|
||||
if (! open FILE, $file)
|
||||
{
|
||||
&die_politely ("The tool which gathers bug counts has not been run yet.");
|
||||
if (! -e "$dir/$image_file") {
|
||||
generate_chart("$dir/$data_file", "$dir/$image_file", $type);
|
||||
}
|
||||
|
||||
while (<FILE>)
|
||||
{
|
||||
chomp;
|
||||
next if ($_ =~ /^#/ or ! $_);
|
||||
my ($date, $open, $assigned, $reopened,
|
||||
$resolved, $verified, $closed) = split /\|/, $_;
|
||||
my ($yy, $mm, $dd) = $date =~ /^\d{2}(\d{2})(\d{2})(\d{2})$/;
|
||||
|
||||
push @dates, "$mm/$dd/$yy";
|
||||
push @open, $open;
|
||||
push @assigned, $assigned;
|
||||
push @reopened, $reopened;
|
||||
push @resolved, $resolved;
|
||||
push @verified, $verified;
|
||||
push @closed, $closed;
|
||||
}
|
||||
|
||||
close FILE;
|
||||
|
||||
if ($#dates < 1)
|
||||
{
|
||||
&die_politely ("We don't have enough data points to make a graph (yet)");
|
||||
}
|
||||
|
||||
my $img = Chart::Lines->new (800, 600);
|
||||
my @labels = qw (New Assigned Reopened Resolved Verified Closed);
|
||||
my @when;
|
||||
my $i = 0;
|
||||
my @data;
|
||||
|
||||
push @data, \@dates;
|
||||
push @data, \@open;
|
||||
push @data, \@assigned;
|
||||
push @data, \@reopened;
|
||||
push @data, \@resolved;
|
||||
push @data, \@verified;
|
||||
push @data, \@closed;
|
||||
|
||||
my $MAXTICKS = 20; # Try not to show any more x ticks than this.
|
||||
my $skip = 1;
|
||||
if (@dates > $MAXTICKS) {
|
||||
$skip = int((@dates + $MAXTICKS - 1) / $MAXTICKS);
|
||||
}
|
||||
|
||||
my %settings =
|
||||
(
|
||||
"title" => "Status Counts for $::FORM{'product'}",
|
||||
"x_label" => "Dates",
|
||||
"y_label" => "Bug Counts",
|
||||
"legend_labels" => \@labels,
|
||||
"skip_x_ticks" => $skip,
|
||||
"y_grid_lines" => "true",
|
||||
"grey_background" => "false"
|
||||
);
|
||||
|
||||
$img->set (%settings);
|
||||
|
||||
open IMAGE, ">$image" or die "$image: $!";
|
||||
$img->$type (*IMAGE, \@data);
|
||||
close IMAGE;
|
||||
|
||||
print <<FIN;
|
||||
<img src="$url_image">
|
||||
<br clear=left>
|
||||
<br>
|
||||
FIN
|
||||
}
|
||||
|
||||
sub chart_image_type {
|
||||
# what chart type should we be generating?
|
||||
my $testimg = Chart::Lines->new(2,2);
|
||||
my $type = $testimg->can('gif') ? "gif" : "png";
|
||||
undef $testimg;
|
||||
return $type;
|
||||
}
|
||||
|
||||
sub chart_image_name {
|
||||
my ($data_file, $type) = @_;
|
||||
|
||||
my $id = datasets_id($FORM{datasets});
|
||||
my $doy = day_of_year();
|
||||
|
||||
return "${data_file}_${id}.$type";
|
||||
}
|
||||
|
||||
# Cache charts by generating a unique filename based on what they
|
||||
# show. Charts should be deleted by collectstats.pl nightly.
|
||||
sub datasets_id {
|
||||
# Current method is very long filenames...
|
||||
my $longname = "";
|
||||
foreach (@_) {
|
||||
$longname .= $_;
|
||||
}
|
||||
return $longname;
|
||||
}
|
||||
|
||||
sub day_of_year {
|
||||
my ($mday, $month, $year) = (localtime())[3 .. 5];
|
||||
$month += 1;
|
||||
$year += 1900;
|
||||
my $date = sprintf "%02d%02d%04d", $mday, $month, $year;
|
||||
}
|
||||
|
||||
sub generate_chart {
|
||||
my ($data_file, $image_file, $type) = @_;
|
||||
|
||||
if (! open FILE, $data_file) {
|
||||
&die_politely ("The tool which gathers bug counts has not been run yet.");
|
||||
}
|
||||
|
||||
sub die_politely
|
||||
{
|
||||
my @fields;
|
||||
my @labels = qw(DATE);
|
||||
my %datasets = map { $_ => 1 } split /:/, $FORM{datasets};
|
||||
|
||||
my %data = ();
|
||||
while (<FILE>) {
|
||||
chomp;
|
||||
next unless $_;
|
||||
if (/^#/) {
|
||||
if (/^# fields?: (.*)\s*$/) {
|
||||
@fields = split /\|/, $1;
|
||||
&die_politely("`# fields: ' line didn't start with DATE, but with $fields[0]")
|
||||
unless $fields[0] =~ /date/i;
|
||||
push @labels, grep($datasets{$_}, @fields);
|
||||
}
|
||||
next;
|
||||
}
|
||||
|
||||
&die_politely("`# fields: ' line was not found before start of data")
|
||||
unless @fields;
|
||||
|
||||
my @line = split /\|/;
|
||||
my $date = $line[0];
|
||||
my ($yy, $mm, $dd) = $date =~ /^\d{2}(\d{2})(\d{2})(\d{2})$/;
|
||||
push @{$data{DATE}}, "$mm/$dd/$yy";
|
||||
|
||||
for my $i (1 .. $#fields) {
|
||||
my $field = $fields[$i];
|
||||
if (! defined $line[$i] or $line[$i] eq '') {
|
||||
# no data point given, don't plot (this will probably
|
||||
# generate loads of Chart::Base warnings, but that's not
|
||||
# our fault.
|
||||
push @{$data{$field}}, undef;
|
||||
}
|
||||
else {
|
||||
push @{$data{$field}}, $line[$i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
shift @labels;
|
||||
|
||||
close FILE;
|
||||
|
||||
if (! @{$data{DATE}}) {
|
||||
&die_politely ("We don't have enough data points to make a graph (yet)");
|
||||
}
|
||||
|
||||
my $img = Chart::Lines->new (800, 600);
|
||||
my $i = 0;
|
||||
|
||||
my $MAXTICKS = 20; # Try not to show any more x ticks than this.
|
||||
my $skip = 1;
|
||||
if (@{$data{DATE}} > $MAXTICKS) {
|
||||
$skip = int((@{$data{DATE}} + $MAXTICKS - 1) / $MAXTICKS);
|
||||
}
|
||||
|
||||
my %settings =
|
||||
(
|
||||
"title" => "Status Counts for $FORM{'product'}",
|
||||
"x_label" => "Dates",
|
||||
"y_label" => "Bug Counts",
|
||||
"legend_labels" => \@labels,
|
||||
"skip_x_ticks" => $skip,
|
||||
"y_grid_lines" => "true",
|
||||
"grey_background" => "false",
|
||||
"colors" => {
|
||||
# default dataset colours are too alike
|
||||
dataset4 => [0, 0, 0], # black
|
||||
},
|
||||
);
|
||||
|
||||
$img->set (%settings);
|
||||
$img->$type($image_file, [ @data{('DATE', @labels)} ]);
|
||||
}
|
||||
|
||||
sub die_politely {
|
||||
my $msg = shift;
|
||||
|
||||
print <<FIN;
|
||||
@ -569,35 +641,32 @@ sub die_politely
|
||||
<td align=center>
|
||||
<font color=blue>Sorry, but ...</font>
|
||||
<p>
|
||||
There is no graph available for <b>$::FORM{'product'}</b><p>
|
||||
There is no graph available for <b>$FORM{'product'}</b><p>
|
||||
|
||||
<font size=-1>
|
||||
$msg
|
||||
<p>
|
||||
</font>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p>
|
||||
FIN
|
||||
|
||||
PutFooter() if $::FORM{banner};
|
||||
PutFooter() if $FORM{banner};
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
sub bybugs {
|
||||
$bugsperperson{$a} <=> $bugsperperson{$b}
|
||||
}
|
||||
}
|
||||
|
||||
sub most_doomed_for_milestone
|
||||
{
|
||||
sub most_doomed_for_milestone {
|
||||
my $when = localtime (time);
|
||||
my $ms = "M" . Param("curmilestone");
|
||||
my $quip = "Summary";
|
||||
|
||||
print "<center>\n<h1>";
|
||||
if( $::FORM{'product'} ne "-All-" ) {
|
||||
print "Most Doomed for $ms ($::FORM{'product'})";
|
||||
if( $FORM{'product'} ne "-All-" ) {
|
||||
print "Most Doomed for $ms ($FORM{'product'})";
|
||||
} else {
|
||||
print "Most Doomed for $ms";
|
||||
}
|
||||
@ -607,25 +676,22 @@ sub most_doomed_for_milestone
|
||||
# start painting report #
|
||||
#########################
|
||||
|
||||
if ($::FORM{'quip'})
|
||||
{
|
||||
if (open (COMMENTS, "<data/comments"))
|
||||
{
|
||||
if ($FORM{'quip'}) {
|
||||
if (open (COMMENTS, "<data/comments")) {
|
||||
my @cdata;
|
||||
while (<COMMENTS>)
|
||||
{
|
||||
while (<COMMENTS>) {
|
||||
push @cdata, $_;
|
||||
}
|
||||
close COMMENTS;
|
||||
$quip = "<i>" . $cdata[int(rand($#cdata + 1))] . "</i>"; }
|
||||
$quip = "<i>" . $cdata[int(rand($#cdata + 1))] . "</i>";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Build up $query string
|
||||
my $query;
|
||||
$query = "select distinct assigned_to from bugs where target_milestone=\"$ms\"";
|
||||
if( $::FORM{'product'} ne "-All-" ) {
|
||||
$query .= "and bugs.product=".SqlQuote($::FORM{'product'});
|
||||
if ($FORM{'product'} ne "-All-" ) {
|
||||
$query .= "and bugs.product=".SqlQuote($FORM{'product'});
|
||||
}
|
||||
$query .= <<FIN;
|
||||
and
|
||||
@ -639,8 +705,7 @@ FIN
|
||||
|
||||
SendSQL ($query);
|
||||
my @people = ();
|
||||
while (my ($person) = FetchSQLData())
|
||||
{
|
||||
while (my ($person) = FetchSQLData()) {
|
||||
push @people, $person;
|
||||
}
|
||||
|
||||
@ -649,11 +714,10 @@ FIN
|
||||
#############################
|
||||
my $person = "";
|
||||
my $bugtotal = 0;
|
||||
foreach $person (@people)
|
||||
{
|
||||
foreach $person (@people) {
|
||||
my $query = "select count(bug_id) from bugs,profiles where target_milestone=\"$ms\" and userid=assigned_to and userid=\"$person\"";
|
||||
if( $::FORM{'product'} ne "-All-" ) {
|
||||
$query .= "and bugs.product=".SqlQuote($::FORM{'product'});
|
||||
if( $FORM{'product'} ne "-All-" ) {
|
||||
$query .= "and bugs.product=".SqlQuote($FORM{'product'});
|
||||
}
|
||||
$query .= <<FIN;
|
||||
and
|
||||
@ -678,15 +742,14 @@ FIN
|
||||
print "$totalpeople engineers have $bugtotal $ms bugs and features.\n";
|
||||
print "</TD></TR>\n";
|
||||
|
||||
while (@people)
|
||||
{
|
||||
while (@people) {
|
||||
$person = pop @people;
|
||||
print "<TR><TD>\n";
|
||||
SendSQL("select login_name from profiles where userid=$person");
|
||||
my $login_name= FetchSQLData();
|
||||
print("<A HREF=\"buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&target_milestone=$ms&assigned_to=$login_name");
|
||||
if( $::FORM{'product'} ne "-All-" ) {
|
||||
print "&product=" . url_quote($::FORM{'product'});
|
||||
if ($FORM{'product'} ne "-All-" ) {
|
||||
print "&product=" . url_quote($FORM{'product'});
|
||||
}
|
||||
print("\">\n");
|
||||
print("$bugsperperson{$person} bugs and features");
|
||||
@ -712,20 +775,17 @@ FIN
|
||||
}
|
||||
}
|
||||
print "</TABLE>\n";
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
sub most_recently_doomed
|
||||
{
|
||||
sub most_recently_doomed {
|
||||
my $when = localtime (time);
|
||||
my $ms = "M" . Param("curmilestone");
|
||||
my $quip = "Summary";
|
||||
|
||||
print "<center>\n<h1>";
|
||||
if( $::FORM{'product'} ne "-All-" ) {
|
||||
print "Most Recently Doomed ($::FORM{'product'})";
|
||||
if( $FORM{'product'} ne "-All-" ) {
|
||||
print "Most Recently Doomed ($FORM{'product'})";
|
||||
} else {
|
||||
print "Most Recently Doomed";
|
||||
}
|
||||
@ -735,33 +795,29 @@ sub most_recently_doomed
|
||||
# start painting report #
|
||||
#########################
|
||||
|
||||
if ($::FORM{'quip'})
|
||||
{
|
||||
if (open (COMMENTS, "<data/comments"))
|
||||
{
|
||||
if ($FORM{'quip'}) {
|
||||
if (open (COMMENTS, "<data/comments")) {
|
||||
my @cdata;
|
||||
while (<COMMENTS>)
|
||||
{
|
||||
while (<COMMENTS>) {
|
||||
push @cdata, $_;
|
||||
}
|
||||
close COMMENTS;
|
||||
$quip = "<i>" . $cdata[int(rand($#cdata + 1))] . "</i>"; }
|
||||
$quip = "<i>" . $cdata[int(rand($#cdata + 1))] . "</i>";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Build up $query string
|
||||
my $query;
|
||||
$query = "select distinct assigned_to from bugs where bugs.bug_status='NEW' and target_milestone='' and bug_severity!='enhancement' and status_whiteboard='' and (product='Browser' or product='MailNews')";
|
||||
if( $::FORM{'product'} ne "-All-" ) {
|
||||
$query .= "and bugs.product=".SqlQuote($::FORM{'product'});
|
||||
my $query = "select distinct assigned_to from bugs where bugs.bug_status='NEW' and target_milestone='' and bug_severity!='enhancement' and status_whiteboard='' and (product='Browser' or product='MailNews')";
|
||||
if ($FORM{'product'} ne "-All-" ) {
|
||||
$query .= "and bugs.product=".SqlQuote($FORM{'product'});
|
||||
}
|
||||
|
||||
# End build up $query string
|
||||
|
||||
SendSQL ($query);
|
||||
my @people = ();
|
||||
while (my ($person) = FetchSQLData())
|
||||
{
|
||||
while (my ($person) = FetchSQLData()) {
|
||||
push @people, $person;
|
||||
}
|
||||
|
||||
@ -770,11 +826,10 @@ sub most_recently_doomed
|
||||
#############################
|
||||
my $person = "";
|
||||
my $bugtotal = 0;
|
||||
foreach $person (@people)
|
||||
{
|
||||
foreach $person (@people) {
|
||||
my $query = "select count(bug_id) from bugs,profiles where bugs.bug_status='NEW' and userid=assigned_to and userid='$person' and target_milestone='' and bug_severity!='enhancement' and status_whiteboard='' and (product='Browser' or product='MailNews')";
|
||||
if( $::FORM{'product'} ne "-All-" ) {
|
||||
$query .= "and bugs.product='$::FORM{'product'}'";
|
||||
if( $FORM{'product'} ne "-All-" ) {
|
||||
$query .= "and bugs.product='$FORM{'product'}'";
|
||||
}
|
||||
SendSQL ($query);
|
||||
my $bugcount = FetchSQLData();
|
||||
@ -798,8 +853,7 @@ sub most_recently_doomed
|
||||
}
|
||||
print "</TD></TR>\n";
|
||||
|
||||
while (@people)
|
||||
{
|
||||
while (@people) {
|
||||
$person = pop @people;
|
||||
print "<TR><TD>\n";
|
||||
SendSQL("select login_name from profiles where userid=$person");
|
||||
@ -829,4 +883,4 @@ sub most_recently_doomed
|
||||
}
|
||||
print "</TABLE>\n";
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user