summaryrefslogtreecommitdiffstats
path: root/Bugzilla
diff options
context:
space:
mode:
authorTiago Mello <timello@gmail.com>2010-09-02 01:31:22 +0200
committerTiago Mello <timello@gmail.com>2010-09-02 01:31:22 +0200
commit01e6cf5c2d719e7890453b760b330c6ab2c94293 (patch)
treeea94b05bfb78288ac571e17b2232a28d2071e4a5 /Bugzilla
parentcd51ea1922c051e9536c00cd97c5d18b39c1c023 (diff)
downloadbugzilla-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.pm40
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) {