| 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
|
|
|