]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 549586: Allow the See Also field to take an integer or a local
authorTiago Mello <timello@gmail.com>
Wed, 1 Sep 2010 23:31:22 +0000 (20:31 -0300)
committerTiago Mello <timello@gmail.com>
Wed, 1 Sep 2010 23:31:22 +0000 (20:31 -0300)
bugzilla url and treat them as a link to the local Bugzilla.
r/a=mkanat

Bugzilla/Bug.pm
template/en/default/global/user-error.html.tmpl

index 4c89223528b192ec9edcc186f96befdcaa474221..775c5f1a1c52d691e7a2eba515b8c2ffc3735f27 100644 (file)
@@ -952,6 +952,9 @@ sub update {
                                 join(', ', @$added_see)];
     }
 
+    # Call update for the referenced bugs.
+    $_->update() foreach @{ $self->{see_also_update} || [] };
+
     # Log bugs_activity items
     # XXX Eventually, when bugs_activity is able to track the dupe_id,
     # this code should go below the duplicates-table-updating code below.
@@ -1192,6 +1195,12 @@ sub send_changes {
         _send_bugmail({ forced => { changer => $user }, type => "dep",
                          id => $id }, $vars);
     }
+
+    # Sending emails for the referenced bugs.
+    foreach my $ref_bug (@{ $self->{see_also_update} || [] }) {
+        _send_bugmail({ forced => { changer => $user },
+                        id => $ref_bug->id }, $vars);
+    }
 }
 
 sub _send_bugmail {
@@ -2785,6 +2794,13 @@ sub add_see_also {
     my ($self, $input) = @_;
     $input = trim($input);
 
+    # If a bug id/alias has been taken, then treat it
+    # as a link to the local Bugzilla.
+    my $local_bug_uri = correct_urlbase() . "show_bug.cgi?id=";
+    if (my ($id) = $input =~ m/^(\w+)$/) {
+        $input = $local_bug_uri . $id;
+    }
+
     # We assume that the URL is an HTTP URL if there is no (something):// 
     # in front.
     my $uri = new URI($input);
@@ -2881,6 +2897,30 @@ sub add_see_also {
         # And remove any # part if there is one.
         $uri->fragment(undef);
         $result = $uri->canonical->as_string;
+
+        # See Also field of the referenced bug is updated
+        # to point to the current bug.
+        if ($result =~ m/\Q$local_bug_uri\E/) {
+            my $ref_bug = Bugzilla::Bug->check($bug_id);
+            if ($ref_bug->id == $self->id) {
+                ThrowUserError('see_also_self_reference');
+            }
+        
+            my $product = $ref_bug->product_obj;
+            if (!Bugzilla->user->can_edit_product($product->id)) {
+                ThrowUserError("product_edit_denied",
+                               { product => $product->name });
+            }
+
+            # We add it directly instead of calling $ref_bug->add_see_also
+            # to avoid recursion.
+            my $ref_input = $local_bug_uri . $self->id;
+            if (!grep($ref_input, @{ $ref_bug->see_also })) {
+                push @{ $ref_bug->see_also }, $ref_input;
+                push @{ $self->{see_also_update} }, $ref_bug;
+            }
+        }
+
     }
 
     if (length($result) > MAX_BUG_URL_LENGTH) {
index f63092c9651d11b06d8fcf6a327587839c50bb91..75badeb6e18a486517422724047c039f6d7f0d9d 100644 (file)
     field with the "[% search_descs.$operator FILTER html %]" 
     ([% operator FILTER html %]) search type.
 
+  [% ELSIF error == 'see_also_self_reference' %]
+    You cannot put this [% terms.bug %] into its own
+    [%+ field_descs.see_also %] field.
+
   [% ELSIF error == "series_already_exists" %]
     [% title = "Series Already Exists" %]
     [% docslinks = {'reporting.html' => 'Reporting'} %]