summaryrefslogtreecommitdiff
path: root/patchtracker/ReqHandler.py
diff options
context:
space:
mode:
Diffstat (limited to 'patchtracker/ReqHandler.py')
-rwxr-xr-xpatchtracker/ReqHandler.py222
1 files changed, 0 insertions, 222 deletions
diff --git a/patchtracker/ReqHandler.py b/patchtracker/ReqHandler.py
deleted file mode 100755
index 90fc75a..0000000
--- a/patchtracker/ReqHandler.py
+++ /dev/null
@@ -1,222 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import cgi
-import os
-import sys
-
-import patchtracker.Conf as Conf
-from patchtracker.Templates import ErrorTemplate, PatchTemplate, PackageVersTemplate, LetterTocTemplate, FrontPageTemplate, SearchResultsTemplate
-from patchtracker.DiffGzHandler import DiffGzHandler, DiffGzException
-from patchtracker.DebTarHandler import DebTarHandler
-from patchtracker.CacheObject import CacheObject, CacheMissException
-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
-
-class ReqHandlerException(Exception):
- def __init__(self, msg, code="500 Oh noes"):
- Exception.__init__(self, msg)
- self.status=code
-
-class Cmd:
- def __init__(self):
- self.content_type = 'text/html'
- self.status = "200 OK"
-
-class ErrorCmd(Cmd):
- def __init__(self, msg, code="500 Oh noes"):
- Cmd.__init__(self)
- self.status = code
- self.msg = msg
-
- def output(self):
- return str(ErrorTemplate(self.msg))
-
-class PatchCmd(Cmd):
- def __init__(self, args):
- Cmd.__init__(self)
- 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:
- raise ReqHandlerException("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:
- raise ReqHandlerException("unhandled display mode '%s'"%(mode))
- if mode == "dl":
- self.content_type = "text/x-diff"
-
- # XXX this is kinda ugly...
- def make_diffhandler(self, pkgname, vers):
- dfile = self.db.findDiffGz(pkgname,vers)
- if dfile:
- return DiffGzHandler(dfile)
- else:
- dfile = self.db.findDebTar(pkgname, vers)
- if dfile:
- return DebTarHandler(dfile)
- else:
- raise ReqHandlerException("can not find diff file for %s / %s"%(pkgname,vers))
-
- def output(self):
- if self.mode == "dl":
- return str(self.content)
- else:
- return str(PatchTemplate(pkg=self.pkgname,vers=self.version,
- patch=self.content,name=self.patchname,
- patchtype=self.patchtype))
-
-class PackageCmd(Cmd):
- def __init__(self, args):
- Cmd.__init__(self)
- 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 there's no match, try with a wildcard match
- if not self.toc.size():
- # ... but don't allow pathologically short names
- if len(self.name) < 3:
- raise ReqHandlerException("search terms must be 3 or more letters...")
- else:
- self.toc = db.findCollection(package="%"+self.name+"%", version=version)
-
- plist = self.toc.getletter(self.name)
- if not plist or len(plist) == 0:
- raise ReqHandlerException("can't find any package named or containing '%s'"%self.name, code="404 ENOPKG kthxbye")
-
- def output(self):
- p = self.toc.getpackage(self.name)
- # 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"
- return str(SearchResultsTemplate(self.name, querydesc, self.toc))
- else:
- return str(PackageVersTemplate(p.popitem()[1]))
-
-class IndexCmd(Cmd):
- def __init__(self, args):
- Cmd.__init__(self)
- if len(args) < 1 or not len(args[0]):
- raise ReqHandlerException("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):
- return str(LetterTocTemplate(self.letter, self.toc))
-
-class MaintCmd(Cmd):
- def __init__(self, args):
- Cmd.__init__(self)
- if len(args) < 1 or not len(args[0]):
- raise ReqHandlerException("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):
- return str(SearchResultsTemplate(self.email, "maintainer email", self.toc))
-
-class JumpCmd(Cmd):
- def __init__(self, env):
- Cmd.__init__(self)
- form = cgi.FieldStorage(fp=env['wsgi.input'],environ=env)
- self.name = form.getfirst("package")
- self.uri = "%s/package/%s"%(Conf.root_url, self.name)
- self.status = "302 Try this other place kthx"
-
- def output(self):
- return ""
-
-class FrontPageCmd(Cmd):
- def __init__(self):
- Cmd.__init__(self)
- self.db = PatchTrackerDB()
- self.index = self.db.findIndices()
-
- def output(self):
- return str(FrontPageTemplate(self.index))
-
-class CmdHandler:
- def __init__(self, env):
- self.headers = []
- uri = Conf.root_url+env['PATH_INFO']
- self.cacheobj = None
- #print "Accept:",env['HTTP_ACCEPT']
-
- args = uri[len(Conf.root_url)+1:].split("/")
- cmdarg = args[0]
- cacheable = False
- if cmdarg == "patch":
- self.cmd = PatchCmd(args[1:])
- cacheable = True
- elif cmdarg == "package":
- self.cmd = PackageCmd(args[1:])
- if len(args[1:]) > 1:
- cacheable = True
- elif cmdarg == "index":
- self.cmd = IndexCmd(args[1:])
- elif cmdarg == "jump":
- self.cmd = JumpCmd(env)
- self.headers.append( ('Location', self.cmd.uri) )
- elif cmdarg == "email":
- self.cmd = MaintCmd(args[1:])
- elif not len(cmdarg):
- self.cmd = FrontPageCmd()
- else:
- self.cmd = ErrorCmd("invalid command/location '%s'"%(cmdarg), "404 Not found")
-
- if Conf.caching and cacheable:
- self.cacheobj = CacheObject(key=uri)
-
- self.headers.append( ('Content-type', self.cmd.content_type) )
- self.status = self.cmd.status
-
- def output(self):
- result = None
- try:
- if self.cacheobj:
- result = self.cacheobj.get()
- else:
- result = self.cmd.output()
- except CacheMissException:
- result = self.cmd.output()
- self.cacheobj.put(result)
- except DiffGzException, e:
- return ErrorCmd(str(e), "500 Oh Noez!!1!").output()
-
- return result
-
-if __name__ == '__main__':
- fake_env = { 'PATH_INFO': sys.argv[1] }
- cmdh = CmdHandler(fake_env)
- print "Status: %s\nHeaders: %s"%(cmdh.status, cmdh.headers)
- print cmdh.output()