]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 132893: Create header X-Bugzilla-Watch-Reason - Patch by Olav Vitters <bugzilla...
authorlpsolit%gmail.com <>
Thu, 9 Mar 2006 06:30:29 +0000 (06:30 +0000)
committerlpsolit%gmail.com <>
Thu, 9 Mar 2006 06:30:29 +0000 (06:30 +0000)
Bugzilla/BugMail.pm
Bugzilla/Config/MTA.pm

index 2b76a211abf46fd6a7b66483bf8fb536183bd229..99851b932a6d33f3f8f79be5127830a9cae354d4 100644 (file)
@@ -48,6 +48,9 @@ use MIME::QuotedPrint;
 use MIME::Parser;
 use Mail::Address;
 
+use constant BIT_DIRECT    => 1;
+use constant BIT_WATCHING  => 2;
+
 # We need these strings for the X-Bugzilla-Reasons header
 # Note: this hash uses "," rather than "=>" to avoid auto-quoting of the LHS.
 my %rel_names = (REL_ASSIGNEE          , "AssignedTo", 
@@ -338,6 +341,7 @@ sub ProcessOneBug {
     
     # A user_id => roles hash to keep track of people.
     my %recipients;
+    my %watching;
     
     # 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
@@ -347,24 +351,24 @@ sub ProcessOneBug {
     my $voters = $dbh->selectcol_arrayref(
         "SELECT who FROM votes WHERE bug_id = ?", undef, ($id));
         
-    push(@{$recipients{$_}}, REL_VOTER) foreach (@$voters);
+    $recipients{$_}->{+REL_VOTER} = BIT_DIRECT foreach (@$voters);
 
     # CCs
-    push(@{$recipients{$_}}, REL_CC) foreach (@ccs);
+    $recipients{$_}->{+REL_CC} = BIT_DIRECT foreach (@ccs);
     
     # Reporter (there's only ever one)
-    push(@{$recipients{$reporter}}, REL_REPORTER);
+    $recipients{$reporter}->{+REL_REPORTER} = BIT_DIRECT;
     
     # QA Contact
     if (Param('useqacontact')) {
         foreach (@qa_contacts) {
             # QA Contact can be blank; ignore it if so.
-            push(@{$recipients{$_}}, REL_QA) if $_;
+            $recipients{$_}->{+REL_QA} = BIT_DIRECT if $_;
         }
     }
 
     # 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 
     # their roles in this change. We get their names out of the diffs.
@@ -377,16 +381,16 @@ sub ProcessOneBug {
             if ($what eq "CC") {
                 foreach my $cc_user (split(/[\s,]+/, $old)) {
                     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") {
                 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") {
                 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 {
 
         my $userwatchers = 
             $dbh->selectall_arrayref("SELECT watcher, watched FROM watch 
-                                      WHERE watched IN ($involved)
-                                      AND watcher NOT IN ($involved)");
+                                      WHERE watched IN ($involved)");
 
         # Mark these people as having the role of the person they are watching
         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 {
     my @excluded;
 
     foreach my $user_id (keys %recipients) {
-        my @rels_which_want;
+        my %rels_which_want;
         my $sent_mail = 0;
 
         my $user = new Bugzilla::User($user_id);
@@ -425,19 +432,20 @@ sub ProcessOneBug {
         {
             # Go through each role the user has and see if they want mail in
             # that role.
-            foreach my $relationship (@{$recipients{$user_id}}) {
+            foreach my $relationship (keys %{$recipients{$user_id}}) {
                 if ($user->wants_bug_mail($id,
                                           $relationship, 
                                           $diffs, 
                                           $newcomments, 
                                           $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
             # one role. But do we want to send it to them?
 
@@ -469,7 +477,7 @@ sub ProcessOneBug {
                 # OK, OK, if we must. Email the user.
                 $sent_mail = sendMail($user, 
                                       \@headerlist,
-                                      \@rels_which_want, 
+                                      \%rels_which_want, 
                                       \%values,
                                       \%defmailhead, 
                                       \%fielddescription, 
@@ -477,7 +485,9 @@ sub ProcessOneBug {
                                       $newcomments, 
                                       $anyprivate, 
                                       $start, 
-                                      $id);
+                                      $id,
+                                      exists $watching{$user_id} ?
+                                             $watching{$user_id} : undef);
             }
         }
        
@@ -498,7 +508,7 @@ sub ProcessOneBug {
 sub sendMail {
     my ($user, $hlRef, $relRef, $valueRef, $dmhRef, $fdRef,  
         $diffRef, $newcomments, $anyprivate, $start, 
-        $id) = @_;
+        $id, $watchingRef) = @_;
 
     my %values = %$valueRef;
     my @headerlist = @$hlRef;
@@ -568,17 +578,22 @@ sub sendMail {
     # the email template and letting it choose the text.
     my $reasonsbody = "------- You are receiving this mail because: -------\n";
 
-    foreach my $relationship (@$relRef) {
+    while (my ($relationship, $bits) = each %{$relRef}) {
         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) {
-            $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) {
-            $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) {
-            $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) {
-            $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 {
     $substs{"keywords"} = $values{'keywords'};
     $substs{"severity"} = $values{'bug_severity'};
     $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{"space"} = " ";
     $substs{"changer"} = $values{'changer'};
index d331927db516af4d3deda05e6a4887272209d021..d74e2cc00f0b95fcb27935309028c201988508c3 100644 (file)
@@ -70,6 +70,7 @@ To: %to%
 Subject: [Bug %bugid%] %neworchanged%%summary%
 %threadingmarker%
 X-Bugzilla-Reason: %reasonsheader%
+X-Bugzilla-Watch-Reason: %reasonswatchheader%
 X-Bugzilla-Product: %product%
 X-Bugzilla-Component: %component%
 X-Bugzilla-Keywords: %keywords%