[Buildbot-commits] [Buildbot] #371: ShellCommand argument "logfiles" does not properly work for HTML log files

Buildbot nobody at buildbot.net
Thu Mar 31 13:43:55 UTC 2011


#371: ShellCommand argument "logfiles" does not properly work for HTML log files
------------------------+--------------------
Reporter:  cli          |       Owner:
    Type:  enhancement  |      Status:  new
Priority:  major        |   Milestone:  0.8.+
 Version:  0.7.9        |  Resolution:
Keywords:               |
------------------------+--------------------

Comment (by lantictac):

 Here's the hack we're using locally here. Be warned it's ugly as hell and
 not ready for prime time but it does the job for us. Far more prefereable
 would be a MIME type associated with the log file.

 In logs.py...
 {{{
 # /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)

     asText = False
     asHTML = False
     subscribed = False

     def __init__(self, original):
         Resource.__init__(self)
         self.original = original

         # WPW: Awful, awful hack to detect HTML contents
         if original.getText().startswith('<html'):      # Original is a
 status.builder.LogFile instance
             self.asHTML = True;

     def getChild(self, path, req):
         if path == "text":
             self.asText = True
             return self
         elif path == "html":
             self.asHTML = True
             return self
         return HtmlResource.getChild(self, path, req)

     def content(self, entries):
         html_entries = []
         text_data = ''
         for type, entry in entries:
             if type >= len(builder.ChunkTypes) or type < 0:
                 # non-std channel, don't display
                 continue

             is_header = type == builder.HEADER

             if not self.asText and not self.asHTML:

                 # jinja only works with unicode, or pure ascii, so assume
 utf-8 in logs
                 if not isinstance(entry, unicode):
                     entry = unicode(entry, 'utf-8', 'replace')
                 html_entries.append(dict(type = builder.ChunkTypes[type],
                                          text = entry,
                                          is_header = is_header))
             elif not is_header:
                 text_data += entry

         if self.asText or self.asHTML:
             return text_data
         else:
             return self.template.module.chunks(html_entries)

     def render_HEAD(self, req):
         self._setContentType(req)

         # vague approximation, ignores markup
         req.setHeader("content-length", self.original.length)
         return ''

     def render_GET(self, req):
         self._setContentType(req)
         self.req = req

         if not self.asText and not self.asHTML:
             self.template =
 req.site.buildbot_service.templates.get_template("logs.html")

             data = self.template.module.page_header(
                     title = "Log File contents",
                     texturl = req.childLink("text"),
                     path_to_root = path_to_root(req))
             data = data.encode('utf-8')
             req.write(data)

         self.original.subscribeConsumer(ChunkConsumer(req, self))
         return server.NOT_DONE_YET

     def _setContentType(self, req):
         if self.asText:
             req.setHeader("content-type", "text/plain; charset=utf-8")
         else:
             req.setHeader("content-type", "text/html; charset=utf-8")

     def finished(self):
         if not self.req:
             return
         try:
             if not self.asText and not self.asHTML:

                 data = self.template.module.page_footer()
                 data = data.encode('utf-8')
                 self.req.write(data)
             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

         # release template
         self.template = None

 components.registerAdapter(TextLog, interfaces.IStatusLog, IHTMLLog)
 }}}

-- 
Ticket URL: <http://trac.buildbot.net/ticket/371#comment:5>
Buildbot <http://buildbot.net/>
Buildbot: build/test automation


More information about the Commits mailing list