view treepkg/web.py @ 579:97a5e09c84dc tip

Fix: pass url to command expand to be able to checkout a new git repository
author Bjoern Ricks <bricks@intevation.de>
date Sat, 03 Sep 2011 12:32:32 +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()
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)