From ed7ec0bee144f913463ac17698cf97f7167030e9 Mon Sep 17 00:00:00 2001 From: warner Date: Thu, 2 Aug 2007 00:05:45 +0100 Subject: [PATCH] web: implement addSlash, fix path_to_root --- Branch.notes | 19 +++++++++++++++++++ buildbot/status/web/base.py | 16 +++++++++++++++- buildbot/status/web/baseweb.py | 3 +++ buildbot/status/web/build.py | 29 ++++++++++++++++++----------- buildbot/status/web/builder.py | 8 ++++++-- buildbot/status/web/logs.py | 6 ++++-- buildbot/status/web/step.py | 14 +++++--------- 7 files changed, 70 insertions(+), 25 deletions(-) diff --git a/Branch.notes b/Branch.notes index b4ffd80..dbe11f9 100644 --- a/Branch.notes +++ b/Branch.notes @@ -14,3 +14,22 @@ next steps: Waterfall. then start implementing the RSS and machine-parseable interfaces + + +what's left before merge? + + upgrade + mkdir public_html seems plenty. Add a note that to add WebStatus they need + to populate public_html. + compatibility + css links still broken, I think ../ is not right for the top level + need to decide about addslash + rfc2386 p21 section 5.2 para6[efg] + fixed path_to_root, implemented addSlash + CSS is now fetched properly but not having an effect + although WebDeveloper toolbar's 'Edit CSS' causes it to be applied. weird. + index + can I populate public_html/ with an index.html that redirects to /waterfall? + or to 'waterfall'? Or add a splash page. + CSS/templating + probably works well enough for now diff --git a/buildbot/status/web/base.py b/buildbot/status/web/base.py index 0d54c54..4440f21 100644 --- a/buildbot/status/web/base.py +++ b/buildbot/status/web/base.py @@ -126,8 +126,18 @@ class HtmlResource(resource.Resource): # this is a cheap sort of template thingy contentType = "text/html; charset=UTF-8" title = "Dummy" + addSlash = False # adapted from Nevow + + def getChild(self, path, request): + if self.addSlash and path == "" and len(request.postpath) == 0: + return self + return resource.Resource.getChild(self, path, request) def render(self, request): + if self.addSlash and request.prepath[-1] != '': + request.redirect(request.URLPath().child('')) + return '' + data = self.content(request) if isinstance(data, unicode): data = data.encode("utf-8") @@ -146,7 +156,11 @@ class HtmlResource(resource.Resource): return request.site.buildbot_service.parent.change_svc def path_to_root(self, request): - return "../" * len(request.prepath) + segs = len(request.prepath) + if request.prepath and request.prepath[-1] == '': + segs -= 1 + root = "../" * segs + return root def getTitle(self, request): return self.title diff --git a/buildbot/status/web/baseweb.py b/buildbot/status/web/baseweb.py index f5541fd..6b915bb 100644 --- a/buildbot/status/web/baseweb.py +++ b/buildbot/status/web/baseweb.py @@ -444,6 +444,9 @@ class Waterfall(WebStatus): robots_txt=None): WebStatus.__init__(self, http_port, distrib_port, allowForce) self.css = css + if css: + data = open(css, "rb").read() + self.putChild("buildbot.css", static.Data(data, "text/plain")) self.favicon = favicon self.robots_txt = robots_txt if favicon: diff --git a/buildbot/status/web/build.py b/buildbot/status/web/build.py index a46ec90..90d5151 100644 --- a/buildbot/status/web/build.py +++ b/buildbot/status/web/build.py @@ -14,6 +14,7 @@ from buildbot.status.web.step import StepsResource # builders/$builder/builds/$buildnum class StatusResourceBuild(HtmlResource): title = "Build" + addSlash = True def __init__(self, build_status, build_control, builder_control): HtmlResource.__init__(self) @@ -187,23 +188,29 @@ class StatusResourceBuild(HtmlResource): if path == "tests": return TestsResource(self.build_status) - return NoResource("No such resource '%s'" % path) + return HtmlResource.getChild(self, path, req) class BuildsResource(HtmlResource): + addSlash = True + def __init__(self, builder_status, builder_control): HtmlResource.__init__(self) self.builder_status = builder_status self.builder_control = builder_control def getChild(self, path, req): - num = int(path) - build_status = self.builder_status.getBuild(num) - if build_status: - build_control = None - if self.builder_control: - builder_control = self.builder_control.getBuild(num) - return StatusResourceBuild(build_status, build_control, - self.builder_control) - - return NoResource("No such Build '%d'" % num) + try: + num = int(path) + except ValueError: + num = None + if num is not None: + build_status = self.builder_status.getBuild(num) + if build_status: + build_control = None + if self.builder_control: + builder_control = self.builder_control.getBuild(num) + return StatusResourceBuild(build_status, build_control, + self.builder_control) + + return HtmlResource.getChild(self, path, req) diff --git a/buildbot/status/web/builder.py b/buildbot/status/web/builder.py index 7b607cd..a1f74cb 100644 --- a/buildbot/status/web/builder.py +++ b/buildbot/status/web/builder.py @@ -14,6 +14,7 @@ from buildbot.status.web.build import BuildsResource # $builder class StatusResourceBuilder(HtmlResource): + addSlash = True def __init__(self, builder_status, builder_control): HtmlResource.__init__(self) @@ -163,10 +164,12 @@ class StatusResourceBuilder(HtmlResource): if path == "builds": return BuildsResource(self.builder_status, self.builder_control) - return NoResource("really weird URL %s" % path) + return HtmlResource.getChild(self, path, req) class BuildersResource(HtmlResource): + addSlash = True + def getChild(self, path, req): s = self.getStatus(req) if path in s.getBuilderNames(): @@ -177,4 +180,5 @@ class BuildersResource(HtmlResource): builder_control = c.getBuilder(path) return StatusResourceBuilder(builder_status, builder_control) - return NoResource("No such Builder '%s'" % path) + return HtmlResource.getChild(self, path, req) + diff --git a/buildbot/status/web/logs.py b/buildbot/status/web/logs.py index a1eaf48..335f91a 100644 --- a/buildbot/status/web/logs.py +++ b/buildbot/status/web/logs.py @@ -66,7 +66,7 @@ class TextLog(Resource): if path == "text": self.asText = True return self - return NoResource("bad pathname") + return HtmlResource.getChild(self, path, req) def htmlHeader(self, request): title = "Log File contents" @@ -151,6 +151,8 @@ components.registerAdapter(HTMLLog, builder.HTMLLogFile, IHTMLLog) class LogsResource(HtmlResource): + addSlash = True + def __init__(self, step_status): HtmlResource.__init__(self) self.step_status = step_status @@ -161,4 +163,4 @@ class LogsResource(HtmlResource): if log.hasContents(): return IHTMLLog(interfaces.IStatusLog(log)) return NoResource("Empty Log '%s'" % path) - return NoResource("No such Log '%s'" % path) + return HtmlResource.getChild(self, path, req) diff --git a/buildbot/status/web/step.py b/buildbot/status/web/step.py index acc2acb..669262c 100644 --- a/buildbot/status/web/step.py +++ b/buildbot/status/web/step.py @@ -10,6 +10,7 @@ from buildbot.status.web.logs import LogsResource # builders/$builder/builds/$buildnum/steps/$stepname class StatusResourceBuildStep(HtmlResource): title = "Build Step" + addSlash = True def __init__(self, build_status, step_status): HtmlResource.__init__(self) @@ -66,18 +67,13 @@ class StatusResourceBuildStep(HtmlResource): def getChild(self, path, req): if path == "logs": return LogsResource(self.step_status) - logname = path - try: - log = self.step.getLogs()[int(logname)] - if log.hasContents(): - return IHTMLLog(interfaces.IStatusLog(log)) - return NoResource("Empty Log '%s'" % logname) - except (IndexError, ValueError): - return NoResource("No such Log '%s'" % logname) + return HtmlResource.getChild(self, path, req) class StepsResource(HtmlResource): + addSlash = True + def __init__(self, build_status): HtmlResource.__init__(self) self.build_status = build_status @@ -86,4 +82,4 @@ class StepsResource(HtmlResource): for s in self.build_status.getSteps(): if s.getName() == path: return StatusResourceBuildStep(self.build_status, s) - return NoResource("No such BuildStep '%s'" % path) + return HtmlResource.getChild(self, path, req) -- 2.11.4.GIT