[cig-commits] r12677 - cs/buildbot/trunk/buildbot/status

leif at geodynamics.org leif at geodynamics.org
Mon Aug 18 15:15:08 PDT 2008


Author: leif
Date: 2008-08-18 15:15:08 -0700 (Mon, 18 Aug 2008)
New Revision: 12677

Modified:
   cs/buildbot/trunk/buildbot/status/html.py
Log:
Simplified BBL code.  The old code had problems.


Modified: cs/buildbot/trunk/buildbot/status/html.py
===================================================================
--- cs/buildbot/trunk/buildbot/status/html.py	2008-08-18 21:46:06 UTC (rev 12676)
+++ cs/buildbot/trunk/buildbot/status/html.py	2008-08-18 22:15:08 UTC (rev 12677)
@@ -762,22 +762,28 @@
 
     raw = False
     subscribed = False
-    membername = None
+    
+    bblName = None
+    memberName = None
+    contentType = None
     data = ""
-    textWrapper = False
 
     def __init__(self, original):
         Resource.__init__(self)
         self.original = original
         name = original.getName()
         if name.endswith(".bbl"):
-            self.membername = name[0:-4]
+            self.bblName = name[0:-4]
             self.raw = True
         return
 
     def getChild(self, path, request):
-        if self.membername:
-            self.membername += "/" + path
+        if self.bblName:
+            if not path:
+                return self
+            if self.memberName is None:
+                self.memberName = self.bblName
+            self.memberName += "/" + path
             return self
         if path == "text":
             self.raw = True
@@ -805,7 +811,7 @@
             else:
                 data += spanfmt % (builder.ChunkTypes[type],
                                    html.escape(entry))
-        if self.membername:
+        if self.bblName:
             self.data += data
             return ""
         return data
@@ -835,20 +841,20 @@
 
     def setContentType(self, request):
         import mimetypes
-        if self.membername:
-            # Assume directories don't have confusing extensions.
-            ctype, encoding = mimetypes.guess_type(self.membername)
-            if ctype is not None and encoding is None:
-                request.setHeader("content-type", ctype)
+        
+        if self.bblName:
+            if self.memberName:
+                ctype, encoding = mimetypes.guess_type(self.memberName)
+                if ctype is not None and encoding is None:
+                    self.contentType = ctype
+                else:
+                    self.contentType = "text/plain"
             else:
-                # The member is a directory or a regular file (here,
-                # we can't discover which one it is, since we don't
-                # have access to the data yet).  Assume regular files
-                # are text.  But since directories are rendered as
-                # HTML, regular files must also be rendered as such.
-                self.textWrapper = True
-                request.setHeader("content-type", "text/html")
+                # either listArchiveContents() or index.html
+                self.contentType = "text/html"
+            request.setHeader("content-type", self.contentType)
             return
+        
         ctype, encoding = mimetypes.guess_type(self.original.getName())
         if ctype is not None and encoding is None:
             request.setHeader("content-type", ctype)
@@ -863,8 +869,8 @@
         if not self.req:
             return
         try:
-            if self.membername:
-                self.extractMember()
+            if self.bblName:
+                self.extract()
             elif not self.raw:
                 self.req.write(self.htmlFooter())
             self.req.finish()
@@ -874,59 +880,62 @@
         # Deferred (from req.notifyFinish) that's pointing at us.
         self.req = None
 
-    def extractMember(self):
+    def extract(self):
         import tarfile
         from StringIO import StringIO
-        from shutil import copyfileobj
 
-        stream = StringIO(self.data)
-        bbl = tarfile.open("log.bbl", 'r:gz', stream)
+        bbl = tarfile.open("log.bbl", 'r:gz', StringIO(self.data))
+        
+        if self.memberName:
+            self.extractMember(bbl)
+            return
+        
         try:
-            tarinfo = bbl.getmember(self.membername)
-        except KeyError, e:
-            if self.membername.endswith('/'):
-                self.req.write(self.htmlErrorMessage(str(e)))
+            index = bbl.getmember(self.bblName + "/index.html")
+            if index.isreg():
+                self.extractMember(bbl, tarinfo = index)
                 return
-            else:
-                try:
-                    self.membername += '/'
-                    tarinfo = bbl.getmember(self.membername)
-                except KeyError, e:
-                    self.req.write(self.htmlErrorMessage(str(e)))
-                    return
+        except KeyError:
+            pass
 
-        if tarinfo.isdir():
+        self.listArchiveContents(bbl)
+        return
+        
+    def extractMember(self, bbl, tarinfo = None):
+        from shutil import copyfileobj
+
+        if tarinfo is None:
             try:
-                index = bbl.getmember(self.membername + "index.html")
-                if index.isreg():
-                    tarinfo = index
-            except KeyError:
-                pass
+                tarinfo = bbl.getmember(self.memberName)
+            except KeyError, e:
+                self.error(str(e))
+                return
+        
+        if not tarinfo.isreg():
+            self.error("'%s' is not a regular file" % tarinfo.name)
+            return
 
-        if tarinfo.isreg():
-            if self.textWrapper:
-                self.req.write('<html><head><title>%s</title></head><body><p><pre>' % self.membername)
-            dataStream = bbl.extractfile(tarinfo)
-            copyfileobj(dataStream, self.req)
-            if self.textWrapper:
-                self.req.write('</pre></p></body></html>')
-        elif tarinfo.isdir():
-            data = '<html><head><title>%s</title></head><body><ul>' % self.membername
-            for name in bbl.getnames():
-                if name.startswith(self.membername):
-                    name = name[len(self.membername):]
-                    if name and name[0:-1].find('/') == -1:
-                        data += '<li><a href="%s">%s</a></li>' % (name, name)
-            data += '</ul></body></html>'
-            self.req.write(data)
-        else:
-            self.req.write(self.htmlErrorMessage("'%s' is neither a directory nor a regular file" % tarinfo.name))
+        copyfileobj(bbl.extractfile(tarinfo), self.req)
         return
 
-    def htmlErrorMessage(self, text):
-        return '<html><head><title>Error</title></head><body><p>%s</p></body></html>' % text
+    def listArchiveContents(self, bbl):
+        data = '<html><head><title>%s</title></head><body><ul>' % self.bblName
+        for tarinfo in bbl:
+            prefix = self.bblName + '/'
+            if tarinfo.name.startswith(prefix) and tarinfo.isreg():
+                name = tarinfo.name[len(prefix):]
+                data += '<li><a href="%s">%s</a></li>' % (name, name)
+        data += '</ul></body></html>'
+        self.req.write(data)
+        return
 
+    def error(self, text):
+        if self.contentType == "text/html":
+            text = '<html><head><title>Error</title></head><body><p>%s</p></body></html>' % text
+        self.req.write(text)
+        return
 
+
 components.registerAdapter(TextLog, interfaces.IStatusLog, IHTMLLog)
 
 



More information about the cig-commits mailing list