diff options
author | gerv%gerv.net <> | 2002-04-04 17:39:16 +0200 |
---|---|---|
committer | gerv%gerv.net <> | 2002-04-04 17:39:16 +0200 |
commit | 6b54434eb4162a84694a87243d095c4b09b21ac7 (patch) | |
tree | 13e3b6cb46c599e8245e4ac399b55d01eb7dd00b | |
parent | 7f9b581340be60e5017d4387de4048881afcb075 (diff) | |
download | bugzilla-6b54434eb4162a84694a87243d095c4b09b21ac7.tar.gz bugzilla-6b54434eb4162a84694a87243d095c4b09b21ac7.tar.xz |
Bug 126793 - templatise showdependencygraph.cgi. Patch by gerv, r=bbaetz, myk.
-rwxr-xr-x | showdependencygraph.cgi | 272 | ||||
-rw-r--r-- | template/default/show/dependency-graph.html.tmpl | 97 |
2 files changed, 221 insertions, 148 deletions
diff --git a/showdependencygraph.cgi b/showdependencygraph.cgi index 7c59a26db..f30e4d24f 100755 --- a/showdependencygraph.cgi +++ b/showdependencygraph.cgi @@ -19,6 +19,7 @@ # Rights Reserved. # # Contributor(s): Terry Weissman <terry@mozilla.org> +# Gervase Markham <gerv@gerv.net> use diagnostics; use strict; @@ -31,27 +32,7 @@ ConnectToDatabase(); quietly_check_login(); -# More warning suppression silliness. -$::userid = $::userid; -$::usergroupset = $::usergroupset; - -###################################################################### -# Begin Data/Security Validation -###################################################################### - -# Make sure the bug ID is a positive integer representing an existing -# bug that the user is authorized to access. -if (defined $::FORM{'id'}) { - ValidateBugID($::FORM{'id'}); -} - -###################################################################### -# End Data/Security Validation -###################################################################### - -my $id = $::FORM{'id'}; - -my $urlbase = Param("urlbase"); +use vars qw($template $vars $userid $usergroupset); my %seen; my %edgesdone; @@ -67,153 +48,148 @@ sub AddLink { } } - -print "Content-type: text/html\n\n"; -PutHeader("Dependency graph", "Dependency graph", $id); - $::FORM{'rankdir'} = "LR" if !defined $::FORM{'rankdir'}; +if (!defined($::FORM{'id'})) { + DisplayError("No bug numbers given."); + exit; +} + +mkdir("data/webdot", 0777); -if (defined $id) { - mkdir("data/webdot", 0777); +my $filename = "data/webdot/$$.dot"; +my $urlbase = Param('urlbase'); - my $filename = "data/webdot/$$.dot"; - open(DOT, ">$filename") || die "Can't create $filename"; - print DOT "digraph G {"; - print DOT qq{ +open(DOT, ">$filename") || die "Can't create $filename"; +print DOT "digraph G {"; +print DOT qq{ graph [URL="${urlbase}query.cgi", rankdir=$::FORM{'rankdir'}, size="64,64"] 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; - } - } - my @basearray = keys(%baselist); +my %baselist; - if ($::FORM{'doall'}) { - SendSQL("select blocked, dependson from dependencies"); - +foreach my $i (split('[\s,]+', $::FORM{'id'})) { + $i = trim($i); + ValidateBugID($i); + $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); + foreach my $id (@stack) { + SendSQL("SELECT blocked, dependson + FROM dependencies + WHERE blocked = $id or dependson = $id"); while (MoreSQLData()) { - my ($blocked, $dependson) = (FetchSQLData()); + 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(%baselist)) { + $seen{$k} = 1; +} + +foreach my $k (keys(%seen)) { + my $summary = ""; + my $stat; + if ($::FORM{'showsummary'}) { + SendSQL(SelectVisible("SELECT bug_status, short_desc FROM bugs " . + "WHERE bugs.bug_id = $k", + $::userid, + $::usergroupset)); + ($stat, $summary) = FetchSQLData(); + $stat = "NEW" if !defined $stat; + $summary = "" if !defined $summary; } else { - my @stack = @basearray; - 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); - } - } + SendSQL("SELECT bug_status FROM bugs WHERE bug_id = $k"); + $stat = FetchOneColumn(); } + my @params; - foreach my $k (@basearray) { - $seen{$k} = 1; + if ($summary ne "") { + $summary =~ s/([\\\"])/\\$1/g; + push(@params, qq{label="$k\\n$summary"}); } - foreach my $k (keys(%seen)) { - my $summary = ""; - my $stat; - if ($::FORM{'showsummary'}) { - SendSQL(SelectVisible("SELECT bug_status, short_desc FROM bugs " . - "WHERE bugs.bug_id = $k", - $::userid, - $::usergroupset)); - ($stat, $summary) = (FetchSQLData()); - $stat = "NEW" if !defined $stat; - $summary = "" if !defined $summary; - } 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"; - } + + if (exists $baselist{$k}) { + push(@params, "shape=box"); } + if ($stat =~ /^(NEW|ASSIGNED|REOPENED)$/) { + push(@params, "color=green"); + } - print DOT "}\n"; - close DOT; - chmod 0777, $filename; - - my $webdotbase = Param('webdotbase'); - if($webdotbase =~ /^https?:/) { - my $url = PerformSubsts(Param("webdotbase")) . $filename; - print qq{<a href="$url.map"> <img src="$url.gif" ismap> </a><hr>\n}; + if (@params) { + print DOT "$k [" . join(',', @params) . "]\n"; } else { - my $pngfilename = "data/webdot/$$.png"; - my $mapfilename = "data/webdot/$$.map"; - system("$webdotbase","-Tpng","-o","$pngfilename","$filename"); - system("$webdotbase","-Timap","-o","$mapfilename","$filename"); - print qq{<a href="$mapfilename"> <img src="$pngfilename" 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 data/webdot/*.png data/webdot/*.map")) { - # Here we are deleting all old files. All entries are from the - # data/webdot/ directory. Since we're deleting the file (not following - # symlinks), this can't escape to delete anything it shouldn't - trick_taint($f); - if (ModTime($f) < $since) { - unlink $f; - } + print DOT "$k\n"; } +} + + +print DOT "}\n"; +close DOT; + +chmod 0777, $filename; + +my $webdotbase = Param('webdotbase'); + +if ($webdotbase =~ /^https?:/) { + # Remote dot server + my $url = PerformSubsts($webdotbase) . $filename; + $vars->{'image_url'} = $url . ".gif"; + $vars->{'map_url'} = $url . ".map"; } else { - $::FORM{'id'} = ""; - $::FORM{'doall'} = 0; - $::FORM{'showsummary'} = 0; -} + # Local dot installation + my $pngfilename = "data/webdot/$$.png"; + my $mapfilename = "data/webdot/$$.map"; + system("$webdotbase","-Tpng","-o","$pngfilename","$filename"); + system("$webdotbase","-Timap","-o","$mapfilename","$filename"); + $vars->{'image_url'} = $pngfilename; + $vars->{'map_url'} = $mapfilename; +} + +# Cleanup any old .dot files created from previous runs. +my $since = time() - 24 * 60 * 60; +foreach my $f (glob("data/webdot/*.dot + data/webdot/*.png + data/webdot/*.map")) +{ + # Here we are deleting all old files. All entries are from the + # data/webdot/ directory. Since we're deleting the file (not following + # symlinks), this can't escape to delete anything it shouldn't + trick_taint($f); + if (ModTime($f) < $since) { + unlink $f; + } +} + +$vars->{'bug_id'} = $::FORM{'id'}; +$vars->{'multiple_bugs'} = ($::FORM{'id'} =~ /[ ,]/); +$vars->{'doall'} = $::FORM{'doall'}; +$vars->{'rankdir'} = $::FORM{'rankdir'}; +$vars->{'showsummary'} = $::FORM{'showsummary'}; -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> -<tr><td colspan=3><select name=rankdir> -<option value=\"TB\"" . ($::FORM{'rankdir'} eq 'TB' ? 'selected' : '') . -">Orient top-to-bottom -<option value=\"LR\"" . ($::FORM{'rankdir'} eq 'LR' ? 'selected' : '') . -">Orient left-to-right -</select></td></tr> -</table> -<input type=submit value=\"Submit\"> -</form> - "; - -PutFooter(); +# Generate and return the UI (HTML page) from the appropriate template. +print "Content-type: text/html\n\n"; +$template->process("show/dependency-graph.html.tmpl", $vars) + || DisplayError("Template process failed: " . $template->error()) + && exit; diff --git a/template/default/show/dependency-graph.html.tmpl b/template/default/show/dependency-graph.html.tmpl new file mode 100644 index 000000000..1927aca43 --- /dev/null +++ b/template/default/show/dependency-graph.html.tmpl @@ -0,0 +1,97 @@ +[%# 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> + #%] + +[%# INTERFACE: + # bug_id: integer. The number of the bug(s). + # multiple_bugs: boolean. True if bug_id contains > 1 bug number. + # doall: boolean. True if we are displaying every bug in the database. + # showsummary: boolean. True if we are showing bug summaries. + # rankdir: string. "TB" if we are ranking top-to-bottom, + "LR" if left-to-right. + # image_url: string. The URL of the graphic showing the dependencies. + # map_url: string. The URL of the map file for the image. + #%] + +[% title = "Dependency Graph" + h1 = title + %] + +[% IF NOT multiple_bugs %] + [% title = "$title for bug $bug_id" + h1 = "$h1 for bug <a href='show_bug.cgi?id=$bug_id'>$bug_id</a>" + %] +[% END %] + +[% INCLUDE global/header %] + +<p> + Green circles represent open bugs. +</p> + +<a href="[% map_url %]"> + <img src="[% image_url %]" ismap> +</a> + +<hr> + +<form> + <table> + <tr> + <td> + Bug numbers: + <input name="id" value="[% bug_id %]"> + </td> + </tr> + + <tr> + <td> + <input type="checkbox" name="doall" + [% " checked" IF doall %]> + Show <b>every</b> bug in the system with dependencies + </td> + </tr> + + <tr> + <td colspan="3"> + <input type="checkbox" name="showsummary" + [% " checked" IF showsummary %]> + Show the summaries of all displayed bugs + </td> + </tr> + + <tr> + <td colspan="3"> + <select name="rankdir"> + <option value="TB" + [% " selected" IF rankdir == "TB" %]> + Orient top-to-bottom + </option> + <option value="LR" + [% " selected" IF rankdir == "LR" %]> + Orient left-to-right + </option> + </select> + </td> + </tr> + </table> + <input type="submit" value="Change Parameters"> +</form> + +[% INCLUDE global/footer %] |