From faf2e2dcec78484e261a70df3257fc011eeb75f7 Mon Sep 17 00:00:00 2001 From: "gerv%gerv.net" <> Date: Thu, 11 Apr 2002 05:29:57 +0000 Subject: Bug 199635 - templatise duplicates.cgi. Patch by gerv, r=myk, bbaetz. --- duplicates.cgi | 354 ++++++++++++++++++++------------------------------------- 1 file changed, 125 insertions(+), 229 deletions(-) (limited to 'duplicates.cgi') diff --git a/duplicates.cgi b/duplicates.cgi index 78f29829f..a85eb6bb7 100755 --- a/duplicates.cgi +++ b/duplicates.cgi @@ -25,7 +25,7 @@ use diagnostics; use strict; -use CGI "param"; + use AnyDBM_File; use lib qw(.); @@ -33,260 +33,156 @@ use lib qw(.); require "globals.pl"; require "CGI.pl"; +# Use global templatisation variables. +use vars qw($template $vars); + ConnectToDatabase(1); GetVersionTable(); quietly_check_login(); -# Silly used-once warnings -$::userid = $::userid; -$::usergroupset = $::usergroupset; +use vars qw (%FORM $userid $usergroupset @legal_product); my %dbmcount; my %count; -my $dobefore = 0; -my $before = ""; my %before; # Get params from URL - -my $changedsince = 7; # default one week -my $maxrows = 100; # arbitrary limit on max number of rows -my $sortby = "dup_count"; # default to sorting by dup count - -if (defined(param("sortby"))) -{ - $sortby = param("sortby"); -} - -# Check for changedsince param, and see if it's a positive integer -if (defined(param("changedsince")) && param("changedsince") =~ /^\d{1,4}$/) -{ - $changedsince = param("changedsince"); +sub formvalue { + my ($name, $default) = (@_); + return $FORM{$name} || $default || ""; } -# check for max rows param, and see if it's a positive integer -if (defined(param("maxrows")) && param("maxrows") =~ /^\d{1,4}$/) -{ - $maxrows = param("maxrows"); -} +my $sortby = formvalue("sortby"); +my $changedsince = formvalue("changedsince", 7); +my $maxrows = formvalue("maxrows", 100); +my $openonly = formvalue("openonly"); +my $reverse = formvalue("reverse"); +my $product = formvalue("product"); +my $sortvisible = formvalue("sortvisible"); +my @buglist = (split(/[:,]/, formvalue("bug_id"))); -# Start the page -print "Content-type: text/html\n"; -print "\n"; -PutHeader("Most Frequently Reported Bugs"); +# Small backwards-compatibility hack, dated 2002-04-10. +$sortby = "count" if $sortby eq "dup_count"; # Open today's record of dupes -my $today = &days_ago(0); +my $today = days_ago(0); +my $yesterday = days_ago(1); -if () -{ - dbmopen(%dbmcount, "data/duplicates/dupes$today", 0644) || - &die_politely("Can't open today's dupes file: $!"); +if () { + dbmopen(%dbmcount, "data/duplicates/dupes$today", 0644) + || DisplayError("Can't open today ($today)'s dupes file: $!") + && exit; +} +elsif () { + dbmopen(%dbmcount, "data/duplicates/dupes$yesterday", 0644) + || DisplayError("Can't open yesterday ($yesterday)'s dupes file: $!") + && exit; } -else -{ - # Try yesterday's, then (in case today's hasn't been created yet) - $today = &days_ago(1); - if () - { - dbmopen(%dbmcount, "data/duplicates/dupes$today", 0644) || - &die_politely("Can't open yesterday's dupes file: $!"); - } - else - { - &die_politely("There are no duplicate statistics for today ($today) or yesterday."); - } +else { + DisplayError("There are no duplicate statistics for today ($today) or + yesterday."); + exit; } # Copy hash (so we don't mess up the on-disk file when we remove entries) %count = %dbmcount; -my $key; -my $value; + +# Remove all those dupes under the threshold parameter. +# We do this, before the sorting, for performance reasons. my $threshold = Param("mostfreqthreshold"); -# Remove all those dupes under the threshold (for performance reasons) -while (($key, $value) = each %count) -{ - if ($value < $threshold) - { - delete $count{$key}; - } +while (my ($key, $value) = each %count) { + delete $count{$key} if ($value < $threshold); } # Try and open the database from "changedsince" days ago -$before = &days_ago($changedsince); - -if () -{ - dbmopen(%before, "data/duplicates/dupes$before", 0644) && ($dobefore = 1); -} - -print Param("mostfreqhtml"); - +my $dobefore = 0; my %delta; - -if ($dobefore) -{ - # Calculate the deltas if we are doing a "before" - foreach (keys(%count)) - { - $delta{$_} = $count{$_} - $before{$_}; - } -} - -# Sort, if required -my @sortedcount; - -if ($sortby eq "delta") -{ - @sortedcount = sort by_delta keys(%count); -} -elsif ($sortby eq "bug_no") -{ - @sortedcount = reverse sort by_bug_no keys(%count); -} -elsif ($sortby eq "dup_count") -{ - @sortedcount = sort by_dup_count keys(%count); -} - -my $i = 0; - -# Produce a string of bug numbers for a Bugzilla buglist. -my $commabugs = ""; -foreach (@sortedcount) -{ - last if ($i == $maxrows); - - $commabugs .= ($_ . ","); - $i++; -} - -# Avoid having a comma at the end - Bad Things happen. -chop $commabugs; - -print qq| - -
- - -Give this to me as a . (Note: the order may not be the same.) -
- - - - - -\n|; - -if ($dobefore) -{ - print ""; -} - -print " - - - - - -\n\n"; - -$i = 0; - -foreach (@sortedcount) -{ - my $id = $_; - SendSQL(SelectVisible("SELECT component, bug_severity, op_sys, target_milestone, short_desc, bug_status, resolution" . - " FROM bugs WHERE bugs.bug_id = $id", $::userid, $::usergroupset)); - next unless MoreSQLData(); - my ($component, $severity, $op_sys, $milestone, $summary, $bug_status, $resolution) = FetchSQLData(); - $summary = html_quote($summary); - - # Show all bugs except those CLOSED _OR_ VERIFIED but not INVALID or WONTFIX. - # We want to see VERIFIED INVALID and WONTFIX because common "bugs" which aren't - # bugs end up in this state. - unless ( ($bug_status eq "CLOSED") || ( ($bug_status eq "VERIFIED") && - ! ( ($resolution eq "INVALID") || ($resolution eq "WONTFIX") ) ) ) { - print ""; - print '"; - print ""; - if ($dobefore) - { - print ""; - } - print "\n "; - print ""; - print ""; - print ""; - print ""; - print "\n"; - - $i++; - } - - if ($i == $maxrows) - { - last; - } -} - -print "
-Bug # -
-Dupe
Count
-
- Change in - last
$changedsince day(s)
Component
Severity
Op Sys
Target
Milestone
Summary
'; - if ( ($bug_status eq "RESOLVED") || ($bug_status eq "VERIFIED") ) { - print ""; - } - print ""; - print $id . ""; - if ( ($bug_status eq "RESOLVED") || ($bug_status eq "VERIFIED") ) { - print ""; - } - print "
$count{$id}
$delta{$id}
$component
$severity
$op_sys
$milestone
$summary


"; -PutFooter(); - - -sub by_bug_no -{ - return ($a <=> $b); -} - -sub by_dup_count -{ - return -($count{$a} <=> $count{$b}); -} - -sub by_delta -{ - return -($delta{$a} <=> $delta{$b}); -} - -sub days_ago -{ - my ($dom, $mon, $year) = (localtime(time - ($_[0]*24*60*60)))[3, 4, 5]; - return sprintf "%04d-%02d-%02d", 1900 + $year, ++$mon, $dom; -} - -sub die_politely { - my $msg = shift; - - print < - - - - -
-$msg -
-

-FIN - - PutFooter(); - exit; +my $whenever = days_ago($changedsince); + +if () { + dbmopen(%before, "data/duplicates/dupes$whenever", 0644) + || DisplayError("Can't open $changedsince days ago ($whenever)'s " . + "dupes file: $!"); + + # Calculate the deltas + ($delta{$_} = $count{$_} - $before{$_}) foreach (keys(%count)); + + $dobefore = 1; +} + +# Don't add CLOSED, and don't add VERIFIED unless they are INVALID or +# WONTFIX. We want to see VERIFIED INVALID and WONTFIX because common +# "bugs" which aren't bugs end up in this state. +my $generic_query = " + SELECT component, bug_severity, op_sys, target_milestone, + short_desc, bug_status, resolution + FROM bugs + WHERE (bug_status != 'CLOSED') + AND ((bug_status = 'VERIFIED' AND resolution IN ('INVALID', 'WONTFIX')) + OR (bug_status != 'VERIFIED')) + AND "; + +# Limit to a single product if requested +$generic_query .= (" product = " . SqlQuote($product) . " AND ") if $product; + +my @bugs; +my @bug_ids; +my $loop = 0; + +foreach my $id (keys(%count)) { + # Maximum row count is dealt with in the template. + # If there's a buglist, restrict the bugs to that list. + next if $sortvisible && $buglist[0] && (lsearch(\@buglist, $id) == -1); + + SendSQL(SelectVisible("$generic_query bugs.bug_id = $id", + $userid, + $usergroupset)); + + next unless MoreSQLData(); + my ($component, $bug_severity, $op_sys, $target_milestone, + $short_desc, $bug_status, $resolution) = FetchSQLData(); + + # Limit to open bugs only if requested + next if $openonly && ($resolution ne ""); + + push (@bugs, { id => $id, + count => $count{$id}, + delta => $delta{$id}, + component => $component, + bug_severity => $bug_severity, + op_sys => $op_sys, + target_milestone => $target_milestone, + short_desc => $short_desc, + bug_status => $bug_status, + resolution => $resolution }); + push (@bug_ids, $id); + $loop++; +} + +$vars->{'bugs'} = \@bugs; +$vars->{'bug_ids'} = \@bug_ids; + +$vars->{'dobefore'} = $dobefore; +$vars->{'sortby'} = $sortby; +$vars->{'sortvisible'} = $sortvisible; +$vars->{'changedsince'} = $changedsince; +$vars->{'maxrows'} = $maxrows; +$vars->{'openonly'} = $openonly; +$vars->{'reverse'} = $reverse; +$vars->{'product'} = $product; +$vars->{'products'} = \@::legal_product; + +print "Content-type: text/html\n\n"; + +# Generate and return the UI (HTML page) from the appropriate template. +$template->process("report/duplicates.html.tmpl", $vars) + || DisplayError("Template process failed: " . $template->error()) + && exit; + + +sub days_ago { + my ($dom, $mon, $year) = (localtime(time - ($_[0]*24*60*60)))[3, 4, 5]; + return sprintf "%04d-%02d-%02d", 1900 + $year, ++$mon, $dom; } -- cgit v1.2.1