[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