Commit 18a03771 authored by lpsolit%gmail.com's avatar lpsolit%gmail.com

Bug 132893: Create header X-Bugzilla-Watch-Reason - Patch by Olav Vitters…

Bug 132893: Create header X-Bugzilla-Watch-Reason - Patch by Olav Vitters <bugzilla-mozilla@bkor.dhs.org> r=wicked a=myk
parent ebcf2fb8
...@@ -48,6 +48,9 @@ use MIME::QuotedPrint; ...@@ -48,6 +48,9 @@ use MIME::QuotedPrint;
use MIME::Parser; use MIME::Parser;
use Mail::Address; use Mail::Address;
use constant BIT_DIRECT => 1;
use constant BIT_WATCHING => 2;
# We need these strings for the X-Bugzilla-Reasons header # We need these strings for the X-Bugzilla-Reasons header
# Note: this hash uses "," rather than "=>" to avoid auto-quoting of the LHS. # Note: this hash uses "," rather than "=>" to avoid auto-quoting of the LHS.
my %rel_names = (REL_ASSIGNEE , "AssignedTo", my %rel_names = (REL_ASSIGNEE , "AssignedTo",
...@@ -338,6 +341,7 @@ sub ProcessOneBug { ...@@ -338,6 +341,7 @@ sub ProcessOneBug {
# A user_id => roles hash to keep track of people. # A user_id => roles hash to keep track of people.
my %recipients; my %recipients;
my %watching;
# Now we work out all the people involved with this bug, and note all of # Now we work out all the people involved with this bug, and note all of
# the relationships in a hash. The keys are userids, the values are an # the relationships in a hash. The keys are userids, the values are an
...@@ -347,24 +351,24 @@ sub ProcessOneBug { ...@@ -347,24 +351,24 @@ sub ProcessOneBug {
my $voters = $dbh->selectcol_arrayref( my $voters = $dbh->selectcol_arrayref(
"SELECT who FROM votes WHERE bug_id = ?", undef, ($id)); "SELECT who FROM votes WHERE bug_id = ?", undef, ($id));
push(@{$recipients{$_}}, REL_VOTER) foreach (@$voters); $recipients{$_}->{+REL_VOTER} = BIT_DIRECT foreach (@$voters);
# CCs # CCs
push(@{$recipients{$_}}, REL_CC) foreach (@ccs); $recipients{$_}->{+REL_CC} = BIT_DIRECT foreach (@ccs);
# Reporter (there's only ever one) # Reporter (there's only ever one)
push(@{$recipients{$reporter}}, REL_REPORTER); $recipients{$reporter}->{+REL_REPORTER} = BIT_DIRECT;
# QA Contact # QA Contact
if (Param('useqacontact')) { if (Param('useqacontact')) {
foreach (@qa_contacts) { foreach (@qa_contacts) {
# QA Contact can be blank; ignore it if so. # QA Contact can be blank; ignore it if so.
push(@{$recipients{$_}}, REL_QA) if $_; $recipients{$_}->{+REL_QA} = BIT_DIRECT if $_;
} }
} }
# Assignee # Assignee
push(@{$recipients{$_}}, REL_ASSIGNEE) foreach (@assignees); $recipients{$_}->{+REL_ASSIGNEE} = BIT_DIRECT foreach (@assignees);
# The last relevant set of people are those who are being removed from # The last relevant set of people are those who are being removed from
# their roles in this change. We get their names out of the diffs. # their roles in this change. We get their names out of the diffs.
...@@ -377,16 +381,16 @@ sub ProcessOneBug { ...@@ -377,16 +381,16 @@ sub ProcessOneBug {
if ($what eq "CC") { if ($what eq "CC") {
foreach my $cc_user (split(/[\s,]+/, $old)) { foreach my $cc_user (split(/[\s,]+/, $old)) {
my $uid = login_to_id($cc_user); my $uid = login_to_id($cc_user);
push(@{$recipients{$uid}}, REL_CC) if $uid; $recipients{$uid}->{+REL_CC} = BIT_DIRECT if $uid;
} }
} }
elsif ($what eq "QAContact") { elsif ($what eq "QAContact") {
my $uid = login_to_id($old); my $uid = login_to_id($old);
push(@{$recipients{$uid}}, REL_QA) if $uid; $recipients{$uid}->{+REL_QA} = BIT_DIRECT if $uid;
} }
elsif ($what eq "AssignedTo") { elsif ($what eq "AssignedTo") {
my $uid = login_to_id($old); my $uid = login_to_id($old);
push(@{$recipients{$uid}}, REL_ASSIGNEE) if $uid; $recipients{$uid}->{+REL_ASSIGNEE} = BIT_DIRECT if $uid;
} }
} }
} }
...@@ -398,12 +402,15 @@ sub ProcessOneBug { ...@@ -398,12 +402,15 @@ sub ProcessOneBug {
my $userwatchers = my $userwatchers =
$dbh->selectall_arrayref("SELECT watcher, watched FROM watch $dbh->selectall_arrayref("SELECT watcher, watched FROM watch
WHERE watched IN ($involved) WHERE watched IN ($involved)");
AND watcher NOT IN ($involved)");
# Mark these people as having the role of the person they are watching # Mark these people as having the role of the person they are watching
foreach my $watch (@$userwatchers) { foreach my $watch (@$userwatchers) {
$recipients{$watch->[0]} = $recipients{$watch->[1]}; while (my ($role, $bits) = each %{$recipients{$watch->[1]}}) {
$recipients{$watch->[0]}->{$role} |= BIT_WATCHING
if $bits & BIT_DIRECT;
}
push (@{$watching{$watch->[0]}}, $watch->[1]);
} }
} }
...@@ -414,7 +421,7 @@ sub ProcessOneBug { ...@@ -414,7 +421,7 @@ sub ProcessOneBug {
my @excluded; my @excluded;
foreach my $user_id (keys %recipients) { foreach my $user_id (keys %recipients) {
my @rels_which_want; my %rels_which_want;
my $sent_mail = 0; my $sent_mail = 0;
my $user = new Bugzilla::User($user_id); my $user = new Bugzilla::User($user_id);
...@@ -425,19 +432,20 @@ sub ProcessOneBug { ...@@ -425,19 +432,20 @@ sub ProcessOneBug {
{ {
# Go through each role the user has and see if they want mail in # Go through each role the user has and see if they want mail in
# that role. # that role.
foreach my $relationship (@{$recipients{$user_id}}) { foreach my $relationship (keys %{$recipients{$user_id}}) {
if ($user->wants_bug_mail($id, if ($user->wants_bug_mail($id,
$relationship, $relationship,
$diffs, $diffs,
$newcomments, $newcomments,
$changer)) $changer))
{ {
push(@rels_which_want, $relationship); $rels_which_want{$relationship} =
$recipients{$user_id}->{$relationship};
} }
} }
} }
if (scalar(@rels_which_want)) { if (scalar(%rels_which_want)) {
# So the user exists, can see the bug, and wants mail in at least # So the user exists, can see the bug, and wants mail in at least
# one role. But do we want to send it to them? # one role. But do we want to send it to them?
...@@ -469,7 +477,7 @@ sub ProcessOneBug { ...@@ -469,7 +477,7 @@ sub ProcessOneBug {
# OK, OK, if we must. Email the user. # OK, OK, if we must. Email the user.
$sent_mail = sendMail($user, $sent_mail = sendMail($user,
\@headerlist, \@headerlist,
\@rels_which_want, \%rels_which_want,
\%values, \%values,
\%defmailhead, \%defmailhead,
\%fielddescription, \%fielddescription,
...@@ -477,7 +485,9 @@ sub ProcessOneBug { ...@@ -477,7 +485,9 @@ sub ProcessOneBug {
$newcomments, $newcomments,
$anyprivate, $anyprivate,
$start, $start,
$id); $id,
exists $watching{$user_id} ?
$watching{$user_id} : undef);
} }
} }
...@@ -498,7 +508,7 @@ sub ProcessOneBug { ...@@ -498,7 +508,7 @@ sub ProcessOneBug {
sub sendMail { sub sendMail {
my ($user, $hlRef, $relRef, $valueRef, $dmhRef, $fdRef, my ($user, $hlRef, $relRef, $valueRef, $dmhRef, $fdRef,
$diffRef, $newcomments, $anyprivate, $start, $diffRef, $newcomments, $anyprivate, $start,
$id) = @_; $id, $watchingRef) = @_;
my %values = %$valueRef; my %values = %$valueRef;
my @headerlist = @$hlRef; my @headerlist = @$hlRef;
...@@ -568,17 +578,22 @@ sub sendMail { ...@@ -568,17 +578,22 @@ sub sendMail {
# the email template and letting it choose the text. # the email template and letting it choose the text.
my $reasonsbody = "------- You are receiving this mail because: -------\n"; my $reasonsbody = "------- You are receiving this mail because: -------\n";
foreach my $relationship (@$relRef) { while (my ($relationship, $bits) = each %{$relRef}) {
if ($relationship == REL_ASSIGNEE) { if ($relationship == REL_ASSIGNEE) {
$reasonsbody .= "You are the assignee for the bug, or are watching the assignee.\n"; $reasonsbody .= "You are the assignee for the bug.\n" if ($bits & BIT_DIRECT);
$reasonsbody .= "You are watching the assignee for the bug.\n" if ($bits & BIT_WATCHING);
} elsif ($relationship == REL_REPORTER) { } elsif ($relationship == REL_REPORTER) {
$reasonsbody .= "You reported the bug, or are watching the reporter.\n"; $reasonsbody .= "You reported the bug.\n" if ($bits & BIT_DIRECT);
$reasonsbody .= "You are watching the reporter.\n" if ($bits & BIT_WATCHING);
} elsif ($relationship == REL_QA) { } elsif ($relationship == REL_QA) {
$reasonsbody .= "You are the QA contact for the bug, or are watching the QA contact.\n"; $reasonsbody .= "You are the QA contact for the bug.\n" if ($bits & BIT_DIRECT);
$reasonsbody .= "You are watching the QA contact for the bug.\n" if ($bits & BIT_WATCHING);
} elsif ($relationship == REL_CC) { } elsif ($relationship == REL_CC) {
$reasonsbody .= "You are on the CC list for the bug, or are watching someone who is.\n"; $reasonsbody .= "You are on the CC list for the bug.\n" if ($bits & BIT_DIRECT);
$reasonsbody .= "You are watching someone on the CC list for the bug.\n" if ($bits & BIT_WATCHING);
} elsif ($relationship == REL_VOTER) { } elsif ($relationship == REL_VOTER) {
$reasonsbody .= "You are a voter for the bug, or are watching someone who is.\n"; $reasonsbody .= "You are a voter for the bug.\n" if ($bits & BIT_DIRECT);
$reasonsbody .= "You are watching a voter for the bug.\n" if ($bits & BIT_WATCHING);
} }
} }
...@@ -611,7 +626,17 @@ sub sendMail { ...@@ -611,7 +626,17 @@ sub sendMail {
$substs{"keywords"} = $values{'keywords'}; $substs{"keywords"} = $values{'keywords'};
$substs{"severity"} = $values{'bug_severity'}; $substs{"severity"} = $values{'bug_severity'};
$substs{"summary"} = $values{'short_desc'}; $substs{"summary"} = $values{'short_desc'};
$substs{"reasonsheader"} = join(" ", map { $rel_names{$_} } @$relRef); my (@headerrel, @watchingrel);
while (my ($rel, $bits) = each %{$relRef}) {
push @headerrel, ($rel_names{$rel}) if ($bits & BIT_DIRECT);
push @watchingrel, ($rel_names{$rel}) if ($bits & BIT_WATCHING);
}
push @headerrel, 'None' if !scalar(@headerrel);
push @watchingrel, 'None' if !scalar(@watchingrel);
push @watchingrel, map { &::DBID_to_name($_) } @$watchingRef;
$substs{"reasonsheader"} = join(" ", @headerrel);
$substs{"reasonswatchheader"} = join(" ", @watchingrel);
$substs{"reasonsbody"} = $reasonsbody; $substs{"reasonsbody"} = $reasonsbody;
$substs{"space"} = " "; $substs{"space"} = " ";
$substs{"changer"} = $values{'changer'}; $substs{"changer"} = $values{'changer'};
......
...@@ -70,6 +70,7 @@ To: %to% ...@@ -70,6 +70,7 @@ To: %to%
Subject: [Bug %bugid%] %neworchanged%%summary% Subject: [Bug %bugid%] %neworchanged%%summary%
%threadingmarker% %threadingmarker%
X-Bugzilla-Reason: %reasonsheader% X-Bugzilla-Reason: %reasonsheader%
X-Bugzilla-Watch-Reason: %reasonswatchheader%
X-Bugzilla-Product: %product% X-Bugzilla-Product: %product%
X-Bugzilla-Component: %component% X-Bugzilla-Component: %component%
X-Bugzilla-Keywords: %keywords% X-Bugzilla-Keywords: %keywords%
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment