diff options
author | Tiago Mello <timello@gmail.com> | 2010-09-02 01:31:22 +0200 |
---|---|---|
committer | Tiago Mello <timello@gmail.com> | 2010-09-02 01:31:22 +0200 |
commit | 01e6cf5c2d719e7890453b760b330c6ab2c94293 (patch) | |
tree | ea94b05bfb78288ac571e17b2232a28d2071e4a5 /Bugzilla | |
parent | cd51ea1922c051e9536c00cd97c5d18b39c1c023 (diff) | |
download | bugzilla-01e6cf5c2d719e7890453b760b330c6ab2c94293.tar.gz bugzilla-01e6cf5c2d719e7890453b760b330c6ab2c94293.tar.xz |
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
Diffstat (limited to 'Bugzilla')
-rw-r--r-- | Bugzilla/Bug.pm | 40 |
1 files changed, 40 insertions, 0 deletions
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) { |