Mercurial > treepkg > treepkg
view treepkg/web.py @ 570:44c0f8404983
Refactor git pull command out of update
Tag MUST NOT use update because therefore it always changes the current local branch!
For listing the tags it's enough to pull the latest repo changes
author | Bjoern Ricks <bricks@intevation.de> |
---|---|
date | Fri, 02 Sep 2011 11:46:29 +0000 |
parents | 31874ce6d621 |
children |
line wrap: on
line source
# Copyright (C) 2007, 2008, 2009 by Intevation GmbH # Authors: # Bernhard Herzog <bh@intevation.de> # # This program is free software under the GPL (>=v2) # Read the file COPYING coming with the software for details. import os import shutil import re from genshi.template import TemplateLoader # TODO see issue #1557 eliminate the dependency on cherrypy # For now just ignore the warnings caused by cherrypy import warnings warnings.filterwarnings("ignore", "the md5 module is deprecated", category=DeprecationWarning, module=__name__) import cherrypy from cherrypy import expose from cherrypy.lib import cptools import report class Status(object): """Implements the tree packager status pages""" def __init__(self, treepkg_config, template, logs): self.treepkg_config = treepkg_config self.template = template self.logs = logs self.loader = TemplateLoader([os.path.join(os.path.dirname(__file__), os.path.pardir, "web")]) @expose def index(self): group = report.get_packager_group(self.treepkg_config) tmpl = self.loader.load(self.template) stream = tmpl.generate(report=report.prepare_report(group, self.logs)) return stream.render('html') def determine_log_filename(self, package_track_name, revdir, log_basename): """Returns the name of a log file of a revision if it exists""" if re.match("(?P<revno>[0-9a-f]+)-(?P<rulesrev>[0-9a-f]+)$", revdir): revno, rulesrev = map(str, revdir.split("-")) group = report.get_packager_group(self.treepkg_config) for track in group.get_package_tracks(): if track.name == package_track_name: for revision in track.get_revisions(): if (revision.revision == revno and revision.rules_revision == rulesrev): for title, filename in revision.list_log_files( self.logs): if os.path.basename(filename) == log_basename: return filename @expose def default(self, *rest): """Handles requests for logfiles of the form .../pkg/revno/*""" filename = None if len(rest) == 3: filename = self.determine_log_filename(*rest) if filename is not None: if filename.endswith(".html"): content_type = "text/html" else: content_type = "text/plain" return cptools.serveFile(filename, contentType=content_type) else: raise cherrypy.HTTPError(status="404") def create_static_site(self, destdir): """Creates a static web-page under destdir""" # make sure we have an empty destdir shutil.rmtree(destdir, True) os.makedirs(destdir) # create the index file f = open(os.path.join(destdir, "index.html"), "wt") f.write(self.index()) f.close() # symlink the build-logs group = report.get_packager_group(self.treepkg_config) for track in group.get_package_tracks(): trackdir = os.path.join(destdir, track.name) for revision in track.get_revisions(): revdir = os.path.join(trackdir, "%s-%s" % (revision.revision, revision.rules_revision)) if revision.has_build_log(): if not os.path.isdir(trackdir): os.mkdir(trackdir) os.mkdir(revdir) for title, filename in revision.list_log_files(self.logs): os.symlink(filename, os.path.join(revdir, os.path.basename(filename))) class TreePKG(object): """Root object for the tree packager web interface""" @expose def index(self): raise cherrypy.HTTPRedirect('/status') def runserver(treepkg_config, cherrypy_config, status_template): cherrypy.root = TreePKG() cherrypy.root.status = Status(treepkg_config=treepkg_config, template=status_template) cherrypy.config.update(file=cherrypy_config) cherrypy.server.start()