]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 556167: Move the setting of dependson/blocked from process_bug.cgi
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Sun, 16 May 2010 22:25:53 +0000 (15:25 -0700)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Sun, 16 May 2010 22:25:53 +0000 (15:25 -0700)
into Bugzilla::Bug::set_all
r=dkl, a=mkanat

Bugzilla/Bug.pm
process_bug.cgi

index ee53a0aaeee1d6c1c137d63c25665c8a28093b7b..26e71c4f8c398f9d3e7e3042a03907113a213548 100644 (file)
@@ -1854,6 +1854,36 @@ sub set_all {
     my $self = shift;
     my ($params) = @_;
 
+    if (exists $params->{'dependson'} or exists $params->{'blocked'}) {
+        my %set_deps;
+        foreach my $name (qw(dependson blocked)) {
+            my @dep_ids = @{ $self->$name };
+            # If only one of the two fields was passed in, then we need to
+            # retain the current value for the other one.
+            if (!exists $params->{$name}) {
+                $set_deps{$name} = \@dep_ids;
+                next;
+            }
+
+            # Explicitly setting them to a particular value overrides
+            # add/remove.
+            if (exists $params->{$name}->{set}) {
+                $set_deps{$name} = $params->{$name}->{set};
+                next;
+            }
+
+            foreach my $add (@{ $params->{$name}->{add} || [] }) {
+                push(@dep_ids, $add) if !grep($_ == $add, @dep_ids);
+            }
+            foreach my $remove (@{ $params->{$name}->{remove} || [] }) {
+                @dep_ids = grep($_ != $remove, @dep_ids);
+            }
+            $set_deps{$name} = \@dep_ids;
+        }
+
+        $self->set_dependencies($set_deps{'dependson'}, $set_deps{'blocked'});
+    }
+
     if (exists $params->{'keywords'}) {
         $self->modify_keywords($params->{'keywords'},
                                $params->{'keywords_action'});
index 0753773dff49cef730647ab7d3936c8bfcdc9cea..bac09450f8a81592fc8f760effd6ff6934523b16 100755 (executable)
@@ -280,32 +280,6 @@ if ($cgi->param('id')) {
     $first_bug->set_flags($flags, $new_flags);
 }
 
-if ($cgi->param('id') && (defined $cgi->param('dependson')
-                          || defined $cgi->param('blocked')) )
-{
-    $first_bug->set_dependencies(scalar $cgi->param('dependson'),
-                                 scalar $cgi->param('blocked'));
-}
-elsif (should_set('dependson') || should_set('blocked')) {
-    foreach my $bug (@bug_objects) {
-        my %temp_deps;
-        foreach my $type (qw(dependson blocked)) {
-            $temp_deps{$type} = { map { $_ => 1 } @{$bug->$type} };
-            if (should_set($type) && $cgi->param($type . '_action') =~ /^(add|remove)$/) {
-                foreach my $id (split(/[,\s]+/, $cgi->param($type))) {
-                    if ($cgi->param($type . '_action') eq 'remove') {
-                        delete $temp_deps{$type}{$id};
-                    }
-                    else {
-                        $temp_deps{$type}{$id} = 1;
-                    }
-                }
-            }
-        }
-        $bug->set_dependencies([ keys %{$temp_deps{'dependson'}} ], [ keys %{$temp_deps{'blocked'}} ]);
-    }
-}
-
 # Component, target_milestone, and version are in here just in case
 # the 'product' field wasn't defined in the CGI. It doesn't hurt to set
 # them twice.
@@ -348,6 +322,17 @@ if (should_set('see_also')) {
 if (should_set('remove_see_also')) {
     $set_all_fields{'see_also'}->{remove} = [$cgi->param('remove_see_also')];
 }
+foreach my $dep_field (qw(dependson blocked)) {
+    if (should_set($dep_field)) {
+        if (my $dep_action = $cgi->param("${dep_field}_action")) {
+            $set_all_fields{$dep_field}->{$dep_action} =
+                [split(/\s,/, $cgi->param($dep_field))];
+        }
+        else {
+            $set_all_fields{$dep_field}->{set} = $cgi->param($dep_field);
+        }
+    }
+}
 
 my @custom_fields = Bugzilla->active_custom_fields;
 foreach my $field (@custom_fields) {