| Index: third_party/buildbot_7_12/buildbot/status/web/logs.py
|
| diff --git a/third_party/buildbot_7_12/buildbot/status/web/logs.py b/third_party/buildbot_7_12/buildbot/status/web/logs.py
|
| deleted file mode 100644
|
| index 7a845ec9a4e46efa9d075f9d1fa5a31ebd7010ef..0000000000000000000000000000000000000000
|
| --- a/third_party/buildbot_7_12/buildbot/status/web/logs.py
|
| +++ /dev/null
|
| @@ -1,189 +0,0 @@
|
| -
|
| -from zope.interface import implements
|
| -from twisted.python import components
|
| -from twisted.spread import pb
|
| -from twisted.web import html, server
|
| -from twisted.web.resource import Resource
|
| -from twisted.web.error import NoResource
|
| -
|
| -from buildbot import interfaces
|
| -from buildbot.status import builder
|
| -from buildbot.status.web.base import IHTMLLog, HtmlResource
|
| -from buildbot.status.web.ansi2html import Ansi2HTML
|
| -
|
| -
|
| -textlog_stylesheet = """
|
| -<style type="text/css">
|
| - div.data {
|
| - font-family: "Courier New", courier, monotype;
|
| - }
|
| - span.stdout {
|
| - font-family: "Courier New", courier, monotype;
|
| - }
|
| - span.stderr {
|
| - font-family: "Courier New", courier, monotype;
|
| - color: red;
|
| - }
|
| - span.header {
|
| - font-family: "Courier New", courier, monotype;
|
| - color: blue;
|
| - }
|
| -</style>
|
| -"""
|
| -
|
| -class ChunkConsumer:
|
| - implements(interfaces.IStatusLogConsumer)
|
| -
|
| - def __init__(self, original, textlog):
|
| - self.original = original
|
| - self.textlog = textlog
|
| - def registerProducer(self, producer, streaming):
|
| - self.producer = producer
|
| - self.original.registerProducer(producer, streaming)
|
| - def unregisterProducer(self):
|
| - self.original.unregisterProducer()
|
| - def writeChunk(self, chunk):
|
| - formatted = self.textlog.content([chunk])
|
| - try:
|
| - if isinstance(formatted, unicode):
|
| - formatted = formatted.encode('utf-8')
|
| - self.original.write(formatted)
|
| - except pb.DeadReferenceError:
|
| - self.producing.stopProducing()
|
| - def finish(self):
|
| - self.textlog.finished()
|
| -
|
| -
|
| -# /builders/$builder/builds/$buildnum/steps/$stepname/logs/$logname
|
| -class TextLog(Resource):
|
| - # a new instance of this Resource is created for each client who views
|
| - # it, so we can afford to track the request in the Resource.
|
| - implements(IHTMLLog)
|
| -
|
| - printAs = "html"
|
| - subscribed = False
|
| -
|
| - def __init__(self, original):
|
| - Resource.__init__(self)
|
| - self.original = original
|
| -
|
| - def getChild(self, path, req):
|
| - if path == "ansi":
|
| - self.ansiParser = Ansi2HTML()
|
| -
|
| - if path == "text" or path == "ansi":
|
| - self.printAs = path
|
| - return self
|
| -
|
| - return HtmlResource.getChild(self, path, req)
|
| -
|
| - def htmlHeader(self, request):
|
| - title = "Log File contents"
|
| - data = "<html>\n<head><title>" + title + "</title>\n"
|
| - data += textlog_stylesheet
|
| - data += "</head>\n"
|
| - data += "<body vlink=\"#800080\">\n"
|
| - texturl = request.childLink("text")
|
| - data += '<a href="%s">(view as text)</a><br />\n' % texturl
|
| - ansiurl = request.childLink("ansi")
|
| - data += '<a href="%s">(view as ansi)</a><br />\n' % ansiurl
|
| - data += "<pre>\n"
|
| - return data
|
| -
|
| - def content(self, entries):
|
| - spanfmt = '<span class="%s">%s</span>'
|
| - data = ""
|
| - for type, entry in entries:
|
| - if type >= len(builder.ChunkTypes) or type < 0:
|
| - # non-std channel, don't display
|
| - continue
|
| - if self.printAs == "text":
|
| - if type != builder.HEADER:
|
| - data += entry
|
| - elif self.printAs == "ansi":
|
| - if type != builder.HEADER:
|
| - data += self.ansiParser.parseBlock(entry)
|
| - else:
|
| - data += spanfmt % (builder.ChunkTypes[type],
|
| - html.escape(entry))
|
| - return data
|
| -
|
| - def htmlFooter(self):
|
| - data = "</pre>\n"
|
| - data += "</body></html>\n"
|
| - return data
|
| -
|
| - def render_HEAD(self, request):
|
| - if self.printAs == "text":
|
| - request.setHeader("content-type", "text/plain")
|
| - else:
|
| - request.setHeader("content-type", "text/html")
|
| -
|
| - # vague approximation, ignores markup
|
| - request.setHeader("content-length", self.original.length)
|
| - return ''
|
| -
|
| - def render_GET(self, req):
|
| - self.req = req
|
| -
|
| - if self.printAs == "text":
|
| - req.setHeader("content-type", "text/plain")
|
| - else:
|
| - req.setHeader("content-type", "text/html")
|
| -
|
| - if self.printAs == "html":
|
| - req.write(self.htmlHeader(req))
|
| - if self.printAs == "ansi":
|
| - req.write(self.ansiParser.printHtmlHeader("Log File Contents"))
|
| - req.write(self.ansiParser.printHeader())
|
| -
|
| - self.original.subscribeConsumer(ChunkConsumer(req, self))
|
| - return server.NOT_DONE_YET
|
| -
|
| - def finished(self):
|
| - if not self.req:
|
| - return
|
| - try:
|
| - if self.printAs == "html":
|
| - self.req.write(self.htmlFooter())
|
| - if self.printAs == "ansi":
|
| - self.req.write(self.ansiParser.printFooter())
|
| - self.req.write(self.ansiParser.printHtmlFooter())
|
| - self.req.finish()
|
| - except pb.DeadReferenceError:
|
| - pass
|
| - # break the cycle, the Request's .notifications list includes the
|
| - # Deferred (from req.notifyFinish) that's pointing at us.
|
| - self.req = None
|
| -
|
| -components.registerAdapter(TextLog, interfaces.IStatusLog, IHTMLLog)
|
| -
|
| -
|
| -class HTMLLog(Resource):
|
| - implements(IHTMLLog)
|
| -
|
| - def __init__(self, original):
|
| - Resource.__init__(self)
|
| - self.original = original
|
| -
|
| - def render(self, request):
|
| - request.setHeader("content-type", "text/html")
|
| - return self.original.html
|
| -
|
| -components.registerAdapter(HTMLLog, builder.HTMLLogFile, IHTMLLog)
|
| -
|
| -
|
| -class LogsResource(HtmlResource):
|
| - addSlash = True
|
| -
|
| - def __init__(self, step_status):
|
| - HtmlResource.__init__(self)
|
| - self.step_status = step_status
|
| -
|
| - def getChild(self, path, req):
|
| - for log in self.step_status.getLogs():
|
| - if path == log.getName():
|
| - if log.hasContents():
|
| - return IHTMLLog(interfaces.IStatusLog(log))
|
| - return NoResource("Empty Log '%s'" % path)
|
| - return HtmlResource.getChild(self, path, req)
|
|
|