summaryrefslogtreecommitdiff
path: root/pagehandler.py
diff options
context:
space:
mode:
Diffstat (limited to 'pagehandler.py')
-rwxr-xr-xpagehandler.py184
1 files changed, 17 insertions, 167 deletions
diff --git a/pagehandler.py b/pagehandler.py
index 639ac04..b5a12cd 100755
--- a/pagehandler.py
+++ b/pagehandler.py
@@ -1,175 +1,25 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
-import cgi
+# main (mod_python) request handler for patch-tracking system
+# this handler file basically farms out all its work to the ReqHandler
+# module, which in turn splits up the request URI and acts accordingly.
+
+from mod_python import apache
import os
import sys
-import patchtracker.Conf as Conf
-from patchtracker.Templates import ErrorTemplate, PatchTemplate, PackageVersTemplate, LetterTocTemplate, FrontPageTemplate, SearchResultsTemplate
-from patchtracker.DiffGzHandler import DiffGzHandler
-import patchtracker.DB as DB
-from patchtracker.DB import PatchTrackerDB
-import pygments
-from pygments.lexers import DiffLexer
-from pygments.formatters import HtmlFormatter
-import patchtracker.SourceArchive as SourceArchive
-
-def error(msg):
- print "Content-Type: text/html\n\n"
- print ErrorTemplate(msg)
- sys.exit(1)
-
-class PatchCmd:
- def __init__(self, args):
- self.db = PatchTrackerDB()
- self.patchtype,mode,pkgname,version = args[0:4]
- self.parsemode(mode)
- dh = self.make_diffhandler(pkgname,version)
- if self.patchtype == "series":
- self.patchname = os.sep.join(args[4:])
- self.content = dh.series().fetch(self.patchname)
- elif self.patchtype == "debianonly":
- self.patchname = "debian-dir only changes"
- self.content = dh.debiandir()
- elif self.patchtype == "nondebian":
- self.patchname = "direct (non packaging) changes"
- self.content = dh.nondebiandir()
- elif self.patchtype == "misc":
- self.patchname = os.sep.join(args[4:])
- self.content = dh.filterdiff(include=self.patchname)
- else:
- error("unhandled patch type '%s'"%(self.patchtype))
- self.pkgname = pkgname
- self.version = version
-
- def parsemode(self, mode):
- if mode == "view" or mode == "dl":
- self.mode = mode
- else:
- error("unhandled display mode '%s'"%(mode))
-
- def make_diffhandler(self, pkgname, vers):
- dfile = self.db.findDiffGz(pkgname,vers)
- if dfile:
- return DiffGzHandler(dfile)
- else:
- error("can not find diff file for %s / %s"%(pkgname,vers))
-
- def output(self):
- if self.mode == "dl":
- print "Content-Type: text/x-diff\n\n"
- print self.content
- else:
- print "Content-Type: text/html\n\n"
- print PatchTemplate(pkg=self.pkgname,vers=self.version,
- patch=self.content,name=self.patchname,
- patchtype=self.patchtype)
-
-class PackageCmd:
- def __init__(self, args):
- db = PatchTrackerDB()
- self.name = args[0]
- if len(args) > 1:
- version = args[1]
- else:
- version = None
- self.toc = db.findCollection(package=self.name, version=version)
- if self.toc.size() == 0:
- if len(self.name) >= 3:
- self.toc = db.findCollection(package="%"+self.name+"%", version=version)
-
- def output(self):
- plist = self.toc.getletter(self.name)
- if len(self.name) < 3:
- error("search terms must be 3 or more letters...")
- if not plist or len(plist) == 0:
- error("can't find any package named or containing '%s'"%self.name)
- else:
- p = self.toc.getpackage(self.name)
- print "Content-Type: text/html\n\n"
- # if there is no match, or if multiple versions were returned
- if not p or len(set(map(lambda x: x.version, p.values()))) > 1:
- querydesc = "package name contains"
- print SearchResultsTemplate(self.name, querydesc, self.toc)
- else:
- print PackageVersTemplate(p.popitem()[1])
-
-
-class IndexCmd:
- def __init__(self, args):
- if len(args) < 1 or not len(args[0]):
- error("please provide a letter on which to index")
- else:
- self.db = PatchTrackerDB()
- self.letter = args[0]
- self.toc = self.db.findLetterToc(self.letter)
-
- def output(self):
- print "Content-Type: text/html\n\n"
- print LetterTocTemplate(self.letter, self.toc)
-
-class MaintCmd:
- def __init__(self, args):
- if len(args) < 1 or not len(args[0]):
- error("please provide a email address on which to index")
- else:
- self.db = PatchTrackerDB()
- self.email = args[0]
- self.toc = self.db.findCollection(email=self.email)
-
- def output(self):
- print "Content-Type: text/html\n\n"
- print SearchResultsTemplate(self.email, "maintainer email", self.toc)
-
-class JumpCmd:
- def __init__(self):
- form = cgi.FieldStorage()
- self.name = form.getfirst("package")
-
- def output(self):
- print "Location: http://%s%s/package/%s\n\n"%(
- os.getenv("HTTP_HOST"), Conf.root_url, self.name)
-
-class FrontPageCmd:
- def __init__(self):
- self.db = PatchTrackerDB()
- self.index = self.db.findIndices()
-
- def output(self):
- print "Content-Type: text/html\n\n"
- print FrontPageTemplate(self.index)
-
-
-class CmdHandler:
- def __init__(self, uri):
- if len(uri)<len(Conf.root_url) or uri[0:len(Conf.root_url)]!=Conf.root_url:
- error("Invalid URL!")
- args = uri[len(Conf.root_url)+1:].split("/")
- cmdarg = args[0]
- if cmdarg == "patch":
- self.cmd = PatchCmd(args[1:])
- elif cmdarg == "package":
- self.cmd = PackageCmd(args[1:])
- elif cmdarg == "index":
- self.cmd = IndexCmd(args[1:])
- elif cmdarg == "jump":
- self.cmd = JumpCmd()
- elif cmdarg == "email":
- self.cmd = MaintCmd(args[1:])
- elif not len(cmdarg):
- self.cmd = FrontPageCmd()
- else:
- error("invalid command/location %s"%(cmdarg))
+def handler(req):
+ # the apache config sets a hint of where we are installed, which is
+ # needed in mod_python since cwd is not automatically set
+ try:
+ sys.path+=[req.subprocess_env["PT_INSTALLROOT"]]
+ os.chdir(req.subprocess_env["PT_INSTALLROOT"])
+ except:
+ pass
- def output(self):
- self.cmd.output()
+ import patchtracker.ReqHandler as ReqHandler
+ ReqHandler.Client.req = req
-if __name__ == "__main__":
- uri = os.getenv("REQUEST_URI")
- if not uri:
- uri = sys.argv[1]
- else:
- import cgitb;
- cgitb.enable()
- CmdHandler(uri).output()
+ req.write(ptcgi.CmdHandler(req).output())
+ return apache.OK