From eedb25016b89e8090f35c4b4cc86c513264bb63a Mon Sep 17 00:00:00 2001 From: Guido Günther Date: Sat, 8 Nov 2008 20:30:01 +0100 Subject: add cgi --- index.cgi | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++ templates/index.html | 41 +++++++++++++++ 2 files changed, 185 insertions(+) create mode 100755 index.cgi create mode 100644 templates/index.html diff --git a/index.cgi b/index.cgi new file mode 100755 index 0000000..20a9f9e --- /dev/null +++ b/index.cgi @@ -0,0 +1,144 @@ +#!/usr/bin/python -u +# vim: set fileencoding=utf-8 : +# +# (C) 2008 Guido Guenther +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +"""Link Debian changelog entries to the VCS""" + +import cgi +import os +import re +import sys +#import cgitb; cgitb.enable(display=0, logdir='/tmp') +import urlgrabber +from lxml import etree +from genshi.template import TemplateLoader +import vcsbrowsers +from htmlchangelog import HTMLChangelog + +VERSION="0.0.1" +XMLNS='http://www.w3.org/1999/xhtml' +PTS='http://packages.qa.debian.org' +PKGNAMERE="[a-zA-Z0-9.+\-]+$" + + +def fetch_changelog(cl_url): + changelog = urlgrabber.urlread(cl_url).decode('utf-8') + return changelog + + +def fetch_pts_page(package): + pts = None + try: + url = "%s/%s" % (PTS, package) + pts = urlgrabber.urlopen(url) + except urlgrabber.grabber.URLGrabError, (code, msg): + if code == 14: + raise Exception, "Can't find package '%s' on '%s'" % (package, PTS) + else: + raise + return pts + + +def parse_pts_xhtml(pts): + cl_url = None + vcs_url = None + vcs = None + + tree = etree.parse(pts) + searcher = etree.ETXPath('/{%s}html/{%s}body//{%s}a[@href]' % (XMLNS, XMLNS, XMLNS)) + result = searcher(tree) + + for r in result: + if r.text == "Changelog": + cl_url = r.attrib['href'] + elif r.text == "browse": + vcs_url = r.attrib['href'] + parent = r.getparent() + vcs = parent.getchildren()[0].text.lower() + return cl_url, vcs_url, vcs + + +def get_vcsbrowser(vcs, vcs_url): + if vcs == "git": + return vcsbrowsers.GitWebBrowser(vcs_url) + elif vcs == "Mercurial": + return vcsbrowsers.HgBrowser(vcs_url) + + +def render_search_page(title, pkg=None, err=None): + loader = TemplateLoader('templates') + tmpl = loader.load('index.html') + print tmpl.generate(title=title, pkg=pkg, + err=err).render('xhtml', doctype='xhtml-strict') + + +def render_changelog_page(cl): + print cl + + +def main(argv): + title = "cl2vcs %s" % VERSION + err = "" + + print "Content-Type: text/html; charset=utf-8" + print + + try: + form = cgi.FieldStorage() + + if form.has_key('pkg'): + pkg = form.getfirst('pkg').decode('utf-8').strip() + else: + pkg = None + + if pkg: + if not re.match(PKGNAMERE, pkg): + return render_search_page(title=title, err=u"Invalid package name: '%s'" % pkg) + else: + return render_search_page(title=title, err=err) + + try: + pts = fetch_pts_page(pkg) + except Exception, exc_err: + err=exc_err + pts = None + + if not pts: + return render_search_page(title=title, pkg=pkg, err=err) + + cl_url, vcs_url, vcs = parse_pts_xhtml(pts) + if cl_url == None: + return render_search_page(pkg=pkg, err=err) + + cl_text = fetch_changelog(cl_url) + if vcs and vcs_url: + vcsbrowser = get_vcsbrowser(vcs, vcs_url) + else: + vcsbrowser = None + cl = HTMLChangelog(cl_text, vcsbrowser=vcsbrowser) + if cl: + render_changelog_page(cl) + except Exception, err: + import traceback + traceback.print_exc(file=sys.stderr) + render_search_page(title=title, err="Unknown error") + return 0 + +if __name__ == "__main__": + sys.exit(main(sys.argv)) + +# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·: diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..186626c --- /dev/null +++ b/templates/index.html @@ -0,0 +1,41 @@ + + + $title + + + + +
+

+ + + +

+
+ +
+ ${err} +
+ +
+
+ cl2vcs parses and displays + changelogs of Debian packages. If the package's + changelog lists + Vcs commit ids and if the package's debian/control file has a + Vcs-Browser field, cl2vcs adds links from the + changelog back to the version control system for easy patch review. A real + live package that supports this is libvirt. +
+ + + + + -- cgit v1.2.3