Index: third_party/buildbot_7_12/buildbot/status/tinderbox.py |
diff --git a/third_party/buildbot_7_12/buildbot/status/tinderbox.py b/third_party/buildbot_7_12/buildbot/status/tinderbox.py |
deleted file mode 100644 |
index 51d404b7b03f0fd9dda60c6c43ed0b5cc1bbe16d..0000000000000000000000000000000000000000 |
--- a/third_party/buildbot_7_12/buildbot/status/tinderbox.py |
+++ /dev/null |
@@ -1,223 +0,0 @@ |
- |
-from email.Message import Message |
-from email.Utils import formatdate |
- |
-from zope.interface import implements |
-from twisted.internet import defer |
- |
-from buildbot import interfaces |
-from buildbot.status import mail |
-from buildbot.status.builder import SUCCESS, WARNINGS |
-from buildbot.steps.shell import WithProperties |
- |
-import zlib, bz2, base64 |
- |
-# TODO: docs, maybe a test of some sort just to make sure it actually imports |
-# and can format email without raising an exception. |
- |
-class TinderboxMailNotifier(mail.MailNotifier): |
- """This is a Tinderbox status notifier. It can send e-mail to a number of |
- different tinderboxes or people. E-mails are sent at the beginning and |
- upon completion of each build. It can be configured to send out e-mails |
- for only certain builds. |
- |
- The most basic usage is as follows:: |
- TinderboxMailNotifier(fromaddr="buildbot@localhost", |
- tree="MyTinderboxTree", |
- extraRecipients=["tinderboxdaemon@host.org"]) |
- |
- The builder name (as specified in master.cfg) is used as the "build" |
- tinderbox option. |
- |
- """ |
- implements(interfaces.IEmailSender) |
- |
- compare_attrs = ["extraRecipients", "fromaddr", "categories", "builders", |
- "addLogs", "relayhost", "subject", "binaryURL", "tree", |
- "logCompression", "errorparser", "columnName", |
- "useChangeTime"] |
- |
- def __init__(self, fromaddr, tree, extraRecipients, |
- categories=None, builders=None, relayhost="localhost", |
- subject="buildbot %(result)s in %(builder)s", binaryURL="", |
- logCompression="", errorparser="unix", columnName=None, |
- useChangeTime=False): |
- """ |
- @type fromaddr: string |
- @param fromaddr: the email address to be used in the 'From' header. |
- |
- @type tree: string |
- @param tree: The Tinderbox tree to post to. |
- |
- @type extraRecipients: tuple of string |
- @param extraRecipients: E-mail addresses of recipients. This should at |
- least include the tinderbox daemon. |
- |
- @type categories: list of strings |
- @param categories: a list of category names to serve status |
- information for. Defaults to None (all |
- categories). Use either builders or categories, |
- but not both. |
- |
- @type builders: list of strings |
- @param builders: a list of builder names for which mail should be |
- sent. Defaults to None (send mail for all builds). |
- Use either builders or categories, but not both. |
- |
- @type relayhost: string |
- @param relayhost: the host to which the outbound SMTP connection |
- should be made. Defaults to 'localhost' |
- |
- @type subject: string |
- @param subject: a string to be used as the subject line of the message. |
- %(builder)s will be replaced with the name of the |
- %builder which provoked the message. |
- This parameter is not significant for the tinderbox |
- daemon. |
- |
- @type binaryURL: string |
- @param binaryURL: If specified, this should be the location where final |
- binary for a build is located. |
- (ie. http://www.myproject.org/nightly/08-08-2006.tgz) |
- It will be posted to the Tinderbox. |
- |
- @type logCompression: string |
- @param logCompression: The type of compression to use on the log. |
- Valid options are"bzip2" and "gzip". gzip is |
- only known to work on Python 2.4 and above. |
- |
- @type errorparser: string |
- @param errorparser: The error parser that the Tinderbox server |
- should use when scanning the log file. |
- Default is "unix". |
- |
- @type columnName: string |
- @param columnName: When columnName is None, use the buildername as |
- the Tinderbox column name. When columnName is a |
- string this exact string will be used for all |
- builders that this TinderboxMailNotifier cares |
- about (not recommended). When columnName is a |
- WithProperties instance it will be interpolated |
- as such. See WithProperties for more detail. |
- @type useChangeTime: bool |
- @param useChangeTime: When True, the time of the first Change for a |
- build is used as the builddate. When False, |
- the current time is used as the builddate. |
- """ |
- |
- mail.MailNotifier.__init__(self, fromaddr, categories=categories, |
- builders=builders, relayhost=relayhost, |
- subject=subject, |
- extraRecipients=extraRecipients, |
- sendToInterestedUsers=False) |
- self.tree = tree |
- self.binaryURL = binaryURL |
- self.logCompression = logCompression |
- self.errorparser = errorparser |
- self.useChangeTime = useChangeTime |
- assert columnName is None or type(columnName) is str \ |
- or isinstance(columnName, WithProperties), \ |
- "columnName must be None, a string, or a WithProperties instance" |
- self.columnName = columnName |
- |
- def buildStarted(self, name, build): |
- builder = build.getBuilder() |
- if self.builders is not None and name not in self.builders: |
- return # ignore this Build |
- if self.categories is not None and \ |
- builder.category not in self.categories: |
- return # ignore this build |
- self.buildMessage(name, build, "building") |
- |
- def buildMessage(self, name, build, results): |
- text = "" |
- res = "" |
- # shortform |
- t = "tinderbox:" |
- |
- text += "%s tree: %s\n" % (t, self.tree) |
- # the start time |
- # getTimes() returns a fractioned time that tinderbox doesn't understand |
- builddate = int(build.getTimes()[0]) |
- # attempt to pull a Change time from this Build's Changes. |
- # if that doesn't work, fall back on the current time |
- if self.useChangeTime: |
- try: |
- builddate = build.getChanges()[-1].when |
- except: |
- pass |
- text += "%s builddate: %s\n" % (t, builddate) |
- text += "%s status: " % t |
- |
- if results == "building": |
- res = "building" |
- text += res |
- elif results == SUCCESS: |
- res = "success" |
- text += res |
- elif results == WARNINGS: |
- res = "testfailed" |
- text += res |
- else: |
- res += "busted" |
- text += res |
- |
- text += "\n"; |
- |
- if self.columnName is None: |
- # use the builder name |
- text += "%s build: %s\n" % (t, name) |
- elif type(self.columnName) is str: |
- # use the exact string given |
- text += "%s build: %s\n" % (t, self.columnName) |
- elif isinstance(self.columnName, WithProperties): |
- # interpolate the WithProperties instance, use that |
- text += "%s build: %s\n" % (t, build.getProperties().render(self.columnName)) |
- else: |
- raise Exception("columnName is an unhandled value") |
- text += "%s errorparser: %s\n" % (t, self.errorparser) |
- |
- # if the build just started... |
- if results == "building": |
- text += "%s END\n" % t |
- # if the build finished... |
- else: |
- text += "%s binaryurl: %s\n" % (t, self.binaryURL) |
- text += "%s logcompression: %s\n" % (t, self.logCompression) |
- |
- # logs will always be appended |
- logEncoding = "" |
- tinderboxLogs = "" |
- for log in build.getLogs(): |
- l = "" |
- if self.logCompression == "bzip2": |
- compressedLog = bz2.compress(log.getText()) |
- l = base64.encodestring(compressedLog) |
- logEncoding = "base64"; |
- elif self.logCompression == "gzip": |
- compressedLog = zlib.compress(log.getText()) |
- l = base64.encodestring(compressedLog) |
- logEncoding = "base64"; |
- else: |
- l = log.getText() |
- tinderboxLogs += l |
- |
- text += "%s logencoding: %s\n" % (t, logEncoding) |
- text += "%s END\n\n" % t |
- text += tinderboxLogs |
- text += "\n" |
- |
- m = Message() |
- m.set_payload(text) |
- |
- m['Date'] = formatdate(localtime=True) |
- m['Subject'] = self.subject % { 'result': res, |
- 'builder': name, |
- } |
- m['From'] = self.fromaddr |
- # m['To'] is added later |
- |
- d = defer.DeferredList([]) |
- d.addCallback(self._gotRecipients, self.extraRecipients, m) |
- return d |
- |