Bug 330718: showdependencytree.cgi needs some cleanup - Patch by Fr�d�ric Buclin <LpSolit@gmail.com> r=wicked a=justdave

This commit is contained in:
lpsolit%gmail.com 2006-04-17 20:36:34 +00:00
Родитель ac6c650c88
Коммит 00bcf5505e
2 изменённых файлов: 34 добавлений и 86 удалений

Просмотреть файл

@ -22,16 +22,16 @@
# Andreas Franke <afranke@mathweb.org>
# Christian Reis <kiko@async.com.br>
# Myk Melez <myk@mozilla.org>
# Frédéric Buclin <LpSolit@gmail.com>
use strict;
use lib qw(.);
require "globals.pl";
use Bugzilla;
use Bugzilla::User;
use Bugzilla::Bug;
Bugzilla->login();
my $user = Bugzilla->login();
my $cgi = Bugzilla->cgi;
my $template = Bugzilla->template;
@ -48,6 +48,7 @@ my $dbh = Bugzilla->switch_to_shadow_db();
# bug that the user is authorized to access.
my $id = $cgi->param('id');
ValidateBugID($id);
my $current_bug = new Bugzilla::Bug($id, $user->id);
my $hide_resolved = $cgi->param('hide_resolved') ? 1 : 0;
@ -58,19 +59,12 @@ if ($maxdepth !~ /^\d+$/) { $maxdepth = 0 };
# Main Section #
################################################################################
# The column/value to select as the target milestone for bugs,
# either the target_milestone column or the empty string value
# (for installations that don't use target milestones). Makes
# it easier to query the database for bugs because we don't
# have to embed a conditional statement into each query.
my $milestone_column = Param('usetargetmilestone') ? "target_milestone" : "''";
# Stores the greatest depth to which either tree goes.
my $realdepth = 0;
# Generate the tree of bugs that this bug depends on and a list of IDs
# appearing in the tree.
my $dependson_tree = { $id => GetBug($id) };
my $dependson_tree = { $id => $current_bug };
my $dependson_ids = {};
GenerateTree($id, "dependson", 1, $dependson_tree, $dependson_ids);
$vars->{'dependson_tree'} = $dependson_tree;
@ -78,7 +72,7 @@ $vars->{'dependson_ids'} = [keys(%$dependson_ids)];
# Generate the tree of bugs that this bug blocks and a list of IDs
# appearing in the tree.
my $blocked_tree = { $id => GetBug($id) };
my $blocked_tree = { $id => $current_bug };
my $blocked_ids = {};
GenerateTree($id, "blocked", 1, $blocked_tree, $blocked_ids);
$vars->{'blocked_tree'} = $blocked_tree;
@ -89,7 +83,6 @@ $vars->{'realdepth'} = $realdepth;
$vars->{'bugid'} = $id;
$vars->{'maxdepth'} = $maxdepth;
$vars->{'hide_resolved'} = $hide_resolved;
$vars->{'canedit'} = UserInGroup("editbugs");
print $cgi->header();
$template->process("bug/dependency-tree.html.tmpl", $vars)
@ -102,15 +95,19 @@ $template->process("bug/dependency-tree.html.tmpl", $vars)
sub GenerateTree {
# Generates a dependency tree for a given bug. Calls itself recursively
# to generate sub-trees for the bug's dependencies.
my ($bug_id, $relationship, $depth, $bugs, $ids) = @_;
# Query the database for bugs with the given dependency relationship.
my @dependencies = GetDependencies($bug_id, $relationship);
my @dependencies;
if ($relationship eq 'dependson') {
@dependencies = @{$bugs->{$bug_id}->dependson};
}
else {
@dependencies = @{$bugs->{$bug_id}->blocked};
}
# Don't do anything if this bug doesn't have any dependencies.
return unless scalar(@dependencies);
# Record this depth in the global $realdepth variable if it's farther
# than we've gone before.
$realdepth = max($realdepth, $depth);
@ -120,7 +117,7 @@ sub GenerateTree {
# its sub-tree if we haven't already done so (which happens
# when bugs appear in dependency trees multiple times).
if (!$bugs->{$dep_id}) {
$bugs->{$dep_id} = GetBug($dep_id);
$bugs->{$dep_id} = new Bugzilla::Bug($dep_id, $user->id);
GenerateTree($dep_id, $relationship, $depth+1, $bugs, $ids);
}
@ -128,63 +125,14 @@ sub GenerateTree {
# if it exists, if we haven't exceeded the maximum depth the user
# wants the tree to go, and if the dependency isn't resolved
# (if we're ignoring resolved dependencies).
if ($bugs->{$dep_id}->{'exists'}
if (!$bugs->{$dep_id}->{'error'}
&& (!$maxdepth || $depth <= $maxdepth)
&& ($bugs->{$dep_id}->{'open'} || !$hide_resolved))
&& ($bugs->{$dep_id}->{'isopened'} || !$hide_resolved))
{
push (@{$bugs->{$bug_id}->{'dependencies'}}, $dep_id);
# Due to AUTOLOAD in Bug.pm, we cannot add 'dependencies'
# as a bug object attribute from here.
push(@{$bugs->{'dependencies'}->{$bug_id}}, $dep_id);
$ids->{$dep_id} = 1;
}
}
}
sub GetBug {
# Retrieves the necessary information about a bug, stores it in the bug cache,
# and returns it to the calling code.
my ($id) = @_;
my $dbh = Bugzilla->dbh;
my $bug = {};
if (Bugzilla->user->can_see_bug($id)) {
($bug->{'exists'},
$bug->{'status'},
$bug->{'resolution'},
$bug->{'summary'},
$bug->{'milestone'},
$bug->{'assignee_id'},
$bug->{'assignee_email'}) = $dbh->selectrow_array(
"SELECT 1,
bug_status,
resolution,
short_desc,
$milestone_column,
assignee.userid,
assignee.login_name
FROM bugs
INNER JOIN profiles AS assignee
ON bugs.assigned_to = assignee.userid
WHERE bugs.bug_id = ?", undef, $id);
}
$bug->{'open'} = $bug->{'exists'} && is_open_state($bug->{'status'});
$bug->{'dependencies'} = [];
return $bug;
}
sub GetDependencies {
# Returns a list of dependencies for a given bug.
my ($id, $relationship) = @_;
my $dbh = Bugzilla->dbh;
my $bug_type = ($relationship eq "blocked") ? "dependson" : "blocked";
my $dependencies = $dbh->selectcol_arrayref(
"SELECT $relationship
FROM dependencies
WHERE $bug_type = ?
ORDER BY $relationship", undef, $id);
return @$dependencies;
}

Просмотреть файл

@ -24,7 +24,7 @@
[% PROCESS global/variables.none.tmpl %]
[% filtered_desc = blocked_tree.$bugid.summary FILTER html %]
[% filtered_desc = blocked_tree.$bugid.short_desc FILTER html %]
[% PROCESS global/header.html.tmpl
title = "Dependency tree for $terms.Bug $bugid"
h1 = "Dependency tree for
@ -76,7 +76,7 @@
[% IF ids.size > 0 %]
([% IF maxdepth -%]Up to [% maxdepth %] level[% "s" IF maxdepth > 1 %] deep | [% END -%]
<a href="buglist.cgi?bug_id=[% ids.join(",") %]">view as [% terms.bug %] list</a>
[% IF canedit && ids.size > 1 %]
[% IF user.groups.editbugs && ids.size > 1 %]
| <a href="buglist.cgi?bug_id=[% ids.join(",") %]&amp;tweak=1">change several</a>
[% END %])
<ul class="tree">
@ -92,12 +92,12 @@
[% BLOCK display_tree %]
[%# INTERFACE
# - bugid: the ID of the bug being displayed
# - tree: a hash of bug objects
# - tree: a hash of bug objects and of bug dependencies
#%]
[% bug = tree.$bugid %]
<li>
[%- INCLUDE bullet bugid=bugid bug=bug -%]
<span class="summ[% "_deep" IF bug.dependencies.size %]"
[%- INCLUDE bullet bugid=bugid tree=tree -%]
<span class="summ[% "_deep" IF tree.dependencies.$bugid.size %]"
id="[% bugid FILTER html %]"
[% IF global.seen.$bugid %]
onMouseover="duplicatedover('[% bugid FILTER html %]')"
@ -109,9 +109,9 @@
<b><a title="Already displayed above; click to locate"
onclick="duplicated('[% bugid FILTER html %]')"
href="#b[% bugid %]">(*)</a></b>
[% ELSIF bug.dependencies.size %]
[% ELSIF tree.dependencies.$bugid.size %]
<ul>
[% FOREACH depid = bug.dependencies %]
[% FOREACH depid = tree.dependencies.$bugid %]
[% INCLUDE display_tree bugid=depid %]
[% END %]
</ul>
@ -121,7 +121,7 @@
[% END %]
[% BLOCK bullet %]
[% IF bug.dependencies.size > 0 && ! global.seen.$bugid %]
[% IF tree.dependencies.$bugid.size && ! global.seen.$bugid %]
[% extra_class = " b_open" %]
[% extra_args = 'onclick="return doToggle(this, event)"' %]
[% END %]
@ -132,21 +132,21 @@
[% END %]
[% BLOCK buglink %]
[% isclosed = !bug.open %]
[% isclosed = !bug.isopened %]
[% FILTER closed(isclosed) -%]
<a title="[% INCLUDE buginfo bug=bug %]"
href="show_bug.cgi?id=[% bugid %]">
<b>[%- bugid %]:</b>
<span class="summ_text">[%+ bug.summary FILTER html %]</span>
<span class="summ_text">[%+ bug.short_desc FILTER html %]</span>
<span class="summ_info">[[% INCLUDE buginfo %]]</span>
</a>
[% END %]
[% END %]
[% BLOCK buginfo %]
[% bug.status FILTER html %]
[%+ bug.resolution FILTER html %]; assigned to [% bug.assignee_email FILTER html %];
[% "Target: " _ bug.milestone IF bug.milestone %]
[% bug.bug_status FILTER html -%] [%+ bug.resolution FILTER html %];
[%-%] assigned to [% bug.assigned_to.login FILTER html %];
[%-%][% " Target: " _ bug.target_milestone IF bug.target_milestone %]
[% END %]
[%###########################################################################%]