Index: gatekeeper_mailer.py |
diff --git a/gatekeeper_mailer.py b/gatekeeper_mailer.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d8153465e5a2759983ebd97472fe6d69deaaccdd |
--- /dev/null |
+++ b/gatekeeper_mailer.py |
@@ -0,0 +1,94 @@ |
+#!/usr/bin/env python |
+# Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Provides mailer templates for gatekeeper_ng. |
+ |
+This module populates jinja mail templates to notify tree watchers when the |
+tree is closed. |
+""" |
+ |
+import jinja2 |
+import os |
+import utils |
+ |
+jinja_environment = jinja2.Environment( |
+ loader=jinja2.FileSystemLoader( |
+ os.path.join(os.path.dirname(__file__), 'templates')), |
+ autoescape=True) |
+jinja_environment.filters['urlquote'] = utils.urlquote |
+ |
+# From buildbot's results.py. |
+SUCCESS, WARNINGS, FAILURE, SKIPPED, EXCEPTION, RETRY = range(6) |
+Results = ["success", "warnings", "failure", "skipped", "exception", "retry"] |
+ |
+ |
+class MailTemplate(object): |
+ """Encapsulates a buildbot status email.""" |
+ |
+ status_header = 'Automatically closing tree for "%(steps)s" on "%(builder)s"' |
+ |
+ def __init__(self, waterfall_url, build_url, |
+ project_name, |
+ fromaddr, |
+ reply_to=None, |
+ subject='buildbot %(result)s in %(projectName)s on %(builder)s, ' |
+ 'revision %(revision)s'): |
+ |
+ self.reply_to = reply_to |
+ self.fromaddr = fromaddr |
+ self.subject = subject |
+ self.waterfall_url = waterfall_url.rstrip('/') + '/' |
+ self.build_url = build_url |
+ self.project_name = project_name |
+ |
+ def genMessageContent(self, build_status): |
+ builder_name = build_status['builderName'] |
+ us_steps = ','.join(build_status['unsatisfied']) |
+ revisions_list = build_status['revisions'] |
+ status_text = self.status_header % { |
+ 'builder': builder_name, |
+ 'steps': us_steps, |
+ } |
+ |
+ # Use the first line as a title. |
+ status_title = status_text.split('\n', 1)[0] |
+ blame_list = ','.join(build_status['blamelist']) |
+ revisions_string = '' |
+ latest_revision = 0 |
+ if revisions_list: |
+ revisions_string = ', '.join([str(rev) for rev in revisions_list]) |
+ latest_revision = max([rev for rev in revisions_list]) |
+ if build_status['result'] == FAILURE: |
+ result = 'failure' |
+ else: |
+ result = 'warning' |
+ |
+ context = { |
+ 'status_title': status_title, |
+ 'waterfall_url': self.waterfall_url, |
+ 'status': status_text.replace('\n', "<br>\n"), |
+ 'build_url': self.build_url, |
+ 'revisions': revisions_string, |
+ 'blame_list': blame_list, |
+ 'build_status': build_status, |
+ 'builder_name': builder_name, |
+ } |
+ |
+ html_content = jinja_environment.get_template('waterfall_mail.html').render( |
+ context) |
+ |
+ text_content = jinja_environment.get_template('mail_text.txt').render( |
+ context) |
+ |
+ subject = self.subject % { |
+ 'result': result, |
+ 'projectName': self.project_name, |
+ 'builder': builder_name, |
+ 'reason': build_status['reason'], |
+ 'revision': str(latest_revision), |
+ 'buildnumber': str(build_status['number']), |
+ } |
+ |
+ return text_content, html_content, subject |