summaryrefslogtreecommitdiffstats
path: root/showdependencygraph.cgi
diff options
context:
space:
mode:
Diffstat (limited to 'showdependencygraph.cgi')
-rwxr-xr-xshowdependencygraph.cgi165
1 files changed, 165 insertions, 0 deletions
diff --git a/showdependencygraph.cgi b/showdependencygraph.cgi
new file mode 100755
index 000000000..1e3a02e2a
--- /dev/null
+++ b/showdependencygraph.cgi
@@ -0,0 +1,165 @@
+#!/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.0 (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): Terry Weissman <terry@mozilla.org>
+
+use diagnostics;
+use strict;
+
+require "CGI.pl";
+
+my $id = $::FORM{'id'};
+my $urlbase = Param("urlbase");
+
+my %seen;
+my %edgesdone;
+
+sub AddLink {
+ my ($blocked, $dependson) = (@_);
+ my $key = "$blocked,$dependson";
+ if (!exists $edgesdone{$key}) {
+ $edgesdone{$key} = 1;
+ print DOT "$blocked -> $dependson\n";
+ $seen{$blocked} = 1;
+ $seen{$dependson} = 1;
+ }
+}
+
+
+print "Content-type: text/html\n\n";
+PutHeader("Dependency graph", "Dependency graph", $id);
+
+if (defined $id) {
+ ConnectToDatabase();
+
+ mkdir("data/webdot", 0777);
+
+ my $filename = "data/webdot/$$.dot";
+ open(DOT, ">$filename") || die "Can't create $filename";
+ print DOT "digraph G {";
+ print DOT qq{
+graph [URL="${urlbase}query.cgi"]
+node [URL="${urlbase}show_bug.cgi?id=\\N", style=filled, color=lightgrey]
+};
+ my %baselist;
+
+ foreach my $i (split('[\s,]+', $::FORM{'id'})) {
+ $i = trim($i);
+ if ($i ne "") {
+ $baselist{$i} = 1;
+ }
+ }
+
+ if ($::FORM{'doall'}) {
+ SendSQL("select blocked, dependson from dependencies");
+
+ while (MoreSQLData()) {
+ my ($blocked, $dependson) = (FetchSQLData());
+ AddLink($blocked, $dependson);
+ }
+ } else {
+ my @stack = keys(%baselist);
+ while (@stack) {
+ my $id = shift @stack;
+ SendSQL("select blocked, dependson from dependencies where blocked = $id or dependson = $id");
+ while (MoreSQLData()) {
+ my ($blocked, $dependson) = (FetchSQLData());
+ if ($blocked != $id && !exists $seen{$blocked}) {
+ push @stack, $blocked;
+ }
+ if ($dependson != $id && !exists $seen{$dependson}) {
+ push @stack, $dependson;
+ }
+ AddLink($blocked, $dependson);
+ }
+ }
+ }
+
+ foreach my $k (keys(%seen)) {
+ my $summary = "";
+ my $stat;
+ if ($::FORM{'showsummary'}) {
+ SendSQL("select bug_status, short_desc from bugs where bug_id = $k");
+ ($stat, $summary) = (FetchSQLData());
+ } else {
+ SendSQL("select bug_status from bugs where bug_id = $k");
+ $stat = FetchOneColumn();
+ }
+ my @params;
+# print DOT "$k [URL" . qq{="${urlbase}show_bug.cgi?id=$k"};
+ if ($summary ne "") {
+ $summary =~ s/([\\\"])/\\$1/g;
+ push(@params, qq{label="$k\\n$summary"});
+ }
+ if (exists $baselist{$k}) {
+ push(@params, "shape=box");
+ }
+ my $opened = ($stat eq "NEW" || $stat eq "ASSIGNED" ||
+ $stat eq "REOPENED");
+ if ($opened) {
+ push(@params, "color=green");
+ }
+ if (@params) {
+ print DOT "$k [" . join(',', @params) . "]\n";
+ } else {
+ print DOT "$k\n";
+ }
+ }
+
+
+ print DOT "}\n";
+ close DOT;
+ chmod 0777, $filename;
+
+ my $url = PerformSubsts(Param("webdotbase")) . $filename;
+
+ print qq{<a href="$url.map"> <img src="$url.gif" ismap> </a><hr>\n};
+
+ # Cleanup any old .dot files created from previous runs.
+ my $since = time() - 24 * 60 * 60;
+ foreach my $f (glob("data/webdot/*.dot")) {
+ if (ModTime($f) < $since) {
+ unlink $f;
+ }
+ }
+} else {
+ $::FORM{'id'} = "";
+ $::FORM{'doall'} = 0;
+ $::FORM{'showsummary'} = 0;
+}
+
+print "
+<form>
+<table>
+<tr>
+<th align=right>Bug numbers:</th>
+<td><input name=id value=\"" . value_quote($::FORM{'id'}) . "\"></td>
+<td><input type=checkbox name=doall" . ($::FORM{'doall'} ? " checked" : "") .
+">Show <b>every</b> bug in the system with
+dependencies</td>
+</tr>
+<tr><td colspan=3><input type=checkbox name=showsummary" .
+($::FORM{'showsummary'} ? " checked" : "") . ">Show the summary of all bugs
+</tr>
+</table>
+<input type=submit value=\"Submit\">
+</form>
+ ";
+
+navigation_header();