From 01e6cf5c2d719e7890453b760b330c6ab2c94293 Mon Sep 17 00:00:00 2001 From: Tiago Mello Date: Wed, 1 Sep 2010 20:31:22 -0300 Subject: Bug 549586: Allow the See Also field to take an integer or a local bugzilla url and treat them as a link to the local Bugzilla. r/a=mkanat --- Bugzilla/Bug.pm | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'Bugzilla/Bug.pm') diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index 4c8922352..775c5f1a1 100644 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -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) { -- cgit v1.2.3-24-g4f1b