summaryrefslogtreecommitdiffstats
path: root/duplicates.cgi
diff options
context:
space:
mode:
authortara%tequilarista.org <>2000-10-24 06:44:30 +0200
committertara%tequilarista.org <>2000-10-24 06:44:30 +0200
commitcf9b879f29f0d01c93882cc40f6c1ce63d870efc (patch)
treef97ddce4c83b542e12c1c3d7f3c0c945f18f0b03 /duplicates.cgi
parent1f1e223645c7f6f3fd3c96d3fef264743b251312 (diff)
downloadbugzilla-cf9b879f29f0d01c93882cc40f6c1ce63d870efc.tar.gz
bugzilla-cf9b879f29f0d01c93882cc40f6c1ce63d870efc.tar.xz
part of gervase markham's duplicates tracking functionality
Diffstat (limited to 'duplicates.cgi')
-rwxr-xr-xduplicates.cgi186
1 files changed, 186 insertions, 0 deletions
diff --git a/duplicates.cgi b/duplicates.cgi
new file mode 100755
index 000000000..a45da6bb2
--- /dev/null
+++ b/duplicates.cgi
@@ -0,0 +1,186 @@
+#!/usr/bonsaitools/bin/perl -w
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is Netscape Communications
+# Corporation. Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All
+# Rights Reserved.
+#
+# Contributor(s): Gervase Markham <gerv@gerv.net>
+#
+# Generates mostfreq list from data collected by collectstats.pl.
+
+use diagnostics;
+use strict;
+use CGI "param";
+use DB_File;
+require "globals.pl";
+require "CGI.pl";
+
+ConnectToDatabase();
+GetVersionTable();
+
+my %count;
+my $dobefore = 0;
+my $before = "";
+my %before;
+
+my $changedsince;
+my $maxrows = 500; # arbitrary limit on max number of rows
+
+my $today = &days_ago(0);
+
+# Open today's record of dupes
+if (-e "data/mining/dupes$today.db")
+{
+ dbmopen(%count, "data/mining/dupes${today}.db", 0644) || die "Can't open today's dupes file: $!";
+}
+else
+{
+ # Try yesterday's, then (in case today's hasn't been created yet) :-)
+ $today = &days_ago(1);
+ if (-e "data/mining/dupes$today.db")
+ {
+ dbmopen(%count, "data/mining/dupes${today}.db", 0644) || die "Can't open yesterday's dupes file: $!";
+ }
+ else
+ {
+ die "There are no duplicate statistics for today or yesterday.";
+ }
+}
+
+# Check for changedsince param, and see if it's a positive integer
+if (defined(param("changedsince")) && param("changedsince") =~ /^\d{1,4}$/)
+{
+ $changedsince = param("changedsince");
+}
+else
+{
+ # Otherwise, default to one week
+ $changedsince = "7";
+}
+
+$before = &days_ago($changedsince);
+
+# check for max rows parameter
+if (defined(param("maxrows")) && param("maxrows") =~ /^\d{1,4}$/)
+{
+ $maxrows = param("maxrows");
+}
+
+if (-e "data/mining/dupes${before}.db")
+{
+ dbmopen(%before, "data/mining/dupes${before}.db", 0644) && ($dobefore = 1);
+}
+
+print "Content-type: text/html\n";
+print "\n";
+PutHeader("Most Frequently Reported Bugs");
+
+print Param("mostfreqhtml");
+
+print "
+<table BORDER>
+
+<tr BGCOLOR=\"#CCCCCC\">
+<td><center><b>Bug #</b></center></td>
+<td><center><b>Dupe<br>Count</b></center></td>\n";
+
+if ($dobefore)
+{
+ print "<td><center><b>Change in last<br>$changedsince day(s)</b></center></td> ";
+}
+
+print "
+<td><center><b>Component</b></center></td>
+<td><center><b>Severity</b></center></td>
+<td><center><b>Op Sys</b></center></td>
+<td><center><b>Target<br>Milestone</b></center></td>
+<td><center><b>Summary</b></center></td>
+</tr>\n\n";
+
+my %delta;
+
+# Calculate the deltas if we are doing a "before"
+if ($dobefore)
+{
+ foreach (keys(%count))
+ {
+ $delta{$_} = $count{$_} - $before{$_};
+ }
+}
+
+# Offer the option of sorting on total count, or on the delta
+my @sortedcount;
+
+if (defined(param("sortby")) && param("sortby") == "delta")
+{
+ @sortedcount = sort by_delta keys(%count);
+}
+else
+{
+ @sortedcount = sort by_dup_count keys(%count);
+}
+
+my $i = 0;
+
+foreach (@sortedcount)
+{
+ my $id = $_;
+ SendSQL("SELECT component, bug_severity, op_sys, target_milestone, short_desc FROM " .
+ "bugs WHERE bug_id = $id");
+ my ($component, $severity, $op_sys, $milestone, $summary) = FetchSQLData();
+ print "<tr>";
+ print '<td><center><A HREF="show_bug.cgi?id=' . $id . '">';
+ print $id . "</A></center></td>";
+ print "<td><center>$count{$id}</center></td>";
+ if ($dobefore)
+ {
+ print "<td><center>$delta{$id}</center></td>";
+ }
+ print "<td>$component</td>\n ";
+ print "<td><center>$severity</center></td>";
+ print "<td><center>$op_sys</center></td>";
+ print "<td><center>$milestone</center></td>";
+ print "<td>$summary</td>";
+ print "</tr>\n";
+
+ $i++;
+ if ($i == $maxrows)
+ {
+ last;
+ }
+}
+
+print "</table><br><br>";
+PutFooter();
+
+
+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;
+}
+