Bug 349555: Move dependency validation from post_bug into Bugzilla::Bug
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=bkor, a=justdave git-svn-id: svn://10.0.0.236/trunk@208122 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
1e47e87159
commit
0c5bdf786c
@ -341,6 +341,35 @@ sub _check_component {
|
||||
return $obj;
|
||||
}
|
||||
|
||||
# Takes two comma/space-separated strings and returns arrayrefs
|
||||
# of valid bug IDs.
|
||||
sub _check_dependencies {
|
||||
my ($depends_on, $blocks) = @_;
|
||||
|
||||
# Only editbugs users can set dependencies on bug entry.
|
||||
return ([], []) unless Bugzilla->user->in_group('editbugs');
|
||||
|
||||
$depends_on ||= '';
|
||||
$blocks ||= '';
|
||||
|
||||
# Make sure all the bug_ids are valid.
|
||||
my @results;
|
||||
foreach my $string ($depends_on, $blocks) {
|
||||
my @array = split(/[\s,]+/, $string);
|
||||
# Eliminate nulls
|
||||
@array = grep($_, @array);
|
||||
# $field is not passed to ValidateBugID to prevent adding new
|
||||
# dependencies on inaccessible bugs.
|
||||
ValidateBugID($_) foreach (@array);
|
||||
push(@results, \@array);
|
||||
}
|
||||
|
||||
# dependson blocks
|
||||
my %deps = ValidateDependencies($results[0], $results[1]);
|
||||
|
||||
return ($deps{'dependson'}, $deps{'blocked'});
|
||||
}
|
||||
|
||||
sub _check_keywords {
|
||||
my ($keyword_string) = @_;
|
||||
$keyword_string = trim($keyword_string);
|
||||
@ -1633,6 +1662,7 @@ sub ValidateBugAlias {
|
||||
# Validate and return a hash of dependencies
|
||||
sub ValidateDependencies {
|
||||
my $fields = {};
|
||||
# These can be arrayrefs or they can be strings.
|
||||
$fields->{'dependson'} = shift;
|
||||
$fields->{'blocked'} = shift;
|
||||
my $id = shift || 0;
|
||||
@ -1653,7 +1683,9 @@ sub ValidateDependencies {
|
||||
next unless $fields->{$target};
|
||||
|
||||
my %seen;
|
||||
foreach my $i (split('[\s,]+', $fields->{$target})) {
|
||||
my $target_array = ref($fields->{$target}) ? $fields->{$target}
|
||||
: [split(/[\s,]+/, $fields->{$target})];
|
||||
foreach my $i (@$target_array) {
|
||||
if ($id == $i) {
|
||||
ThrowUserError("dependency_loop_single");
|
||||
}
|
||||
|
||||
@ -227,26 +227,8 @@ my @keyword_ids = @{Bugzilla::Bug::_check_keywords($cgi->param('keywords'))};
|
||||
Bugzilla::Bug::_check_strict_isolation($product, $cc_ids,
|
||||
$cgi->param('assigned_to'), $cgi->param('qa_contact'));
|
||||
|
||||
# Check for valid dependency info.
|
||||
foreach my $field ("dependson", "blocked") {
|
||||
if (UserInGroup("editbugs") && $cgi->param($field)) {
|
||||
my @validvalues;
|
||||
foreach my $id (split(/[\s,]+/, $cgi->param($field))) {
|
||||
next unless $id;
|
||||
# $field is not passed to ValidateBugID to prevent adding new
|
||||
# dependencies on inaccessible bugs.
|
||||
ValidateBugID($id);
|
||||
push(@validvalues, $id);
|
||||
}
|
||||
$cgi->param(-name => $field, -value => join(",", @validvalues));
|
||||
}
|
||||
}
|
||||
# Gather the dependency list, and make sure there are no circular refs
|
||||
my %deps;
|
||||
if (UserInGroup("editbugs")) {
|
||||
%deps = Bugzilla::Bug::ValidateDependencies(scalar($cgi->param('dependson')),
|
||||
scalar($cgi->param('blocked')));
|
||||
}
|
||||
my ($depends_on_ids, $blocks_ids) = Bugzilla::Bug::_check_dependencies(
|
||||
scalar $cgi->param('dependson'), scalar $cgi->param('blocked'));
|
||||
|
||||
# get current time
|
||||
my $timestamp = $dbh->selectrow_array(q{SELECT NOW()});
|
||||
@ -415,6 +397,7 @@ if (UserInGroup("editbugs")) {
|
||||
WHERE bug_id = ?}, undef, ($timestamp, $kw_list, $id));
|
||||
}
|
||||
if ($cgi->param('dependson') || $cgi->param('blocked')) {
|
||||
my %deps = (dependson => $depends_on_ids, blocked => $blocks_ids);
|
||||
foreach my $pair (["blocked", "dependson"], ["dependson", "blocked"]) {
|
||||
my ($me, $target) = @{$pair};
|
||||
my $sth_dep = $dbh->prepare(qq{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user