Don't send mail for policy_checklist comments.

This changes the policy_checklist review handler to not send mail when
publishing comments. This is so patch authors don't receive nag mail,
but reviewers have the review bot comments for reference.

BUG=None
R=agable@chromium.org

Review URL: https://codereview.chromium.org/23576004

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/reviewbot@219800 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/handlers/policy_checklist/handler.py b/handlers/policy_checklist/handler.py
index ec26e37..a2153eb 100644
--- a/handlers/policy_checklist/handler.py
+++ b/handlers/policy_checklist/handler.py
@@ -31,6 +31,16 @@
     loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))
 
 
+def prepare_address_list(addr, email_list):
+  """Prepares |email_list| for use as rietveld query parameter.
+
+  Canonicalizes the entries in |email_list|, removes any occurrences of |addr|,
+  joins the entries with commas and returns the result.
+  """
+  return ','.join([util.canonicalize_email(entry)
+                   for entry in email_list if entry != addr])
+
+
 def process(addr, message, review, rietveld):
   """Handles reviews for chrome/app/policy/policy_templates.json.
 
@@ -78,4 +88,7 @@
   # Finally, post all inline comments.
   if len(chunks) > 0:
     template = JINJA_ENVIRONMENT.get_template(REVIEW_MESSAGE_TEMPLATE)
-    rietveld.post_comment(review.issue_id, template.render(review=review), True)
+    rietveld.publish_inline_comments(
+        review.issue_id, template.render(review=review),
+        prepare_address_list(addr, review.issue_data.reviewers),
+        prepare_address_list(addr, review.issue_data.cc))
diff --git a/rietveld.py b/rietveld.py
index 0e3d405..8cf29e6 100644
--- a/rietveld.py
+++ b/rietveld.py
@@ -66,14 +66,18 @@
   def post_issue_data(self, issue, req, payload):
     return self.post_data('%s/%s' % (issue, req), payload)
 
-  def post_comment(self, issue, comment, submit_inline_comments=False):
+  def publish_inline_comments(self, issue, comment, reviewers, cc,
+                              subject=None, send_mail=False):
     publish_payload = {
-        'message_only': 0 if submit_inline_comments else 1,
-        'send_mail': 1,
-        'add_as_reviewer': 0,
+        'cc': cc,
         'message': comment,
+        'message_only': 0,
         'no_redirect': 1,
+        'reviewers': reviewers,
+        'send_mail': 1 if send_mail else 0,
     }
+    if subject is not None:
+      publish_payload['subject'] = subject
     self.post_issue_data(issue, 'publish', publish_payload)
 
   def add_inline_comment(self, issue_id, patchset_id, patch_id, line, a_or_b,
diff --git a/util.py b/util.py
index 85c7687..3eb5934 100644
--- a/util.py
+++ b/util.py
@@ -86,3 +86,10 @@
       [ 'test@example.com', 'committers@chromium.org' ]
   """
   return [entry[1] for entry in email.utils.getaddresses([string])]
+
+
+def canonicalize_email(address):
+  """Takes an email address and returns its canonicalized form."""
+  emails = get_emails(address)
+  assert len(emails) == 1
+  return emails[0]