summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Finney <seanius@debian.org>2008-06-26 01:55:58 +0200
committerSean Finney <seanius@debian.org>2008-06-26 01:55:58 +0200
commitbb37cf116269d5948d7f4d592557642696b5d9c7 (patch)
tree279809d4fd86e92043e5f8b70dbf2d502d902678
parentd08d138655cce56e9e10c4afbc01ccf4eb55a69e (diff)
downloadpatch-tracker-bb37cf116269d5948d7f4d592557642696b5d9c7.tar.gz
package search / versionless implementation
going to /packages/pkg now gives a table of contents with the available versions for the package, or the results of a widers search in the case of no exact matches also removed a bunch of dead code from DB mostly
-rwxr-xr-xpagehandler.py32
-rw-r--r--patchtracker/DB.py52
-rwxr-xr-xpatchtracker/SourceArchive.py14
-rwxr-xr-xpatchtracker/Templates.py15
4 files changed, 61 insertions, 52 deletions
diff --git a/pagehandler.py b/pagehandler.py
index eba862f..ea01be1 100755
--- a/pagehandler.py
+++ b/pagehandler.py
@@ -5,7 +5,7 @@ import cgi
import os
import sys
import patchtracker.Conf as Conf
-from patchtracker.Templates import ErrorTemplate, PatchTemplate, PackageVersTemplate, LetterTocTemplate, FrontPageTemplate
+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
@@ -83,15 +83,28 @@ class PatchCmd:
class PackageCmd:
def __init__(self, args):
- self.db = PatchTrackerDB()
- self.db.setFactory(DB.srcpkg_factory)
+ db = PatchTrackerDB()
self.name = args[0]
- self.version = args[1]
- self.srcpkg = self.db.findSourcePackage(self)
+ if len(args) > 1:
+ version = args[1]
+ else:
+ version = None
+ self.toc = db.findCollection(package=self.name, version=version)
+ if self.toc.size() == 0:
+ self.toc = db.findCollection(package="%"+self.name+"%", version=version)
def output(self):
- print "Content-Type: text/html\n\n"
- print PackageVersTemplate(self.srcpkg)
+ plist = self.toc.getletter(self.name)
+ 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 not p or len(p) > 1:
+ print SearchResultsTemplate(self.name, self.toc)
+ else:
+ print PackageVersTemplate(p.popitem()[1])
+
class IndexCmd:
def __init__(self, args):
@@ -112,9 +125,8 @@ class JumpCmd:
self.name = form.getfirst("package")
def output(self):
- print "Location: http://%s%s/index/%s#%s\n\n"%(
- os.getenv("HTTP_HOST"), Conf.root_url,
- SourceArchive.getidx(self.name), self.name)
+ print "Location: http://%s%s/package/%s\n\n"%(
+ os.getenv("HTTP_HOST"), Conf.root_url, self.name)
class FrontPageCmd:
def __init__(self):
diff --git a/patchtracker/DB.py b/patchtracker/DB.py
index 370d691..9324e97 100644
--- a/patchtracker/DB.py
+++ b/patchtracker/DB.py
@@ -66,13 +66,6 @@ class PatchTrackerDB:
def setFactory(self, factory):
self.db.row_factory = factory
- def findSourcePackage(self, srcpkg):
- q = "SELECT * FROM packages WHERE name=? AND version=?"
- cursor = self.db.cursor()
- cursor.execute(q, (srcpkg.name, srcpkg.version))
- s = cursor.fetchone()
- return s
-
def saveSourcePackage(self, srcpkg):
cursor = self.db.cursor()
#print "creating new record for",srcpkg
@@ -83,42 +76,31 @@ class PatchTrackerDB:
srcpkg.version,srcpkg.diffgz_name,srcpkg.diffgz_size,
srcpkg.diffgz_md5sum))
- def findSuite(self, suite):
- q = "SELECT * FROM suites WHERE name = ?"
+ def saveSuite(self, suite):
+ q = "INSERT OR REPLACE INTO suites (id,name) \
+ VALUES ((SELECT MAX(id)+1 FROM suites),?)"
cursor = self.db.cursor()
cursor.execute(q, (suite,))
- return cursor.fetchone()
- def saveSuite(self, suite):
- s = self.findSuite(suite)
- if not s:
- q = "INSERT INTO suites (id,name) \
- VALUES ((SELECT MAX(id)+1 FROM suites),?)"
- cursor = self.db.cursor()
- cursor.execute(q, (suite,))
-
- def findComponent(self, component):
- q = "SELECT * FROM components WHERE name = ?"
+ def saveComponent(self, component):
+ q = "INSERT OR REPLACE INTO components (id,name) \
+ VALUES ((SELECT MAX(id)+1 FROM components),?)"
cursor = self.db.cursor()
cursor.execute(q, (component,))
- return cursor.fetchone()
- def saveComponent(self, component):
- c = self.findComponent(component)
- if not c:
- q = "INSERT INTO components (id,name) \
- VALUES ((SELECT MAX(id)+1 FROM components),?)"
- cursor = self.db.cursor()
- cursor.execute(q, (component,))
-
- def findCollection(self, package="%"):
+ def findCollection(self, package="%", version=None):
oldfactory = self.db.row_factory
self.db.row_factory = srcpkg_collection_factory
cursor = self.db.cursor()
toc = SourceArchive.SourcePackageIndex()
q = "SELECT * FROM packages AS p,package_rel_map AS m,suites AS s \
WHERE p.name LIKE ? AND p.id = m.package_id AND m.suite_id = s.id"
- cursor.execute(q, (package,))
+ qargs = (package,)
+ if version:
+ q += " AND p.version = ?"
+ qargs += (version,)
+
+ cursor.execute(q, qargs)
# use srcpkg_factory to fetch sourcepackages, once per suite
for srcpkg,rest in cursor.fetchall():
toc.ins(srcpkg, rest["name"])
@@ -131,14 +113,6 @@ class PatchTrackerDB:
def findMasterIndex(self):
return self.findCollection(package="%")
- def findSourcePackageRelation(self, srcpkg, suite):
- q = "SELECT * FROM packages AS p,suites AS s,package_rel_map AS m \
- WHERE p.name=? AND s.name=? AND m.package_id=p.id \
- AND m.suite_id=s.id"
- cursor = self.db.cursor()
- cursor.execute(q, (srcpkg.name, suite))
- return cursor.fetchone()
-
def relateSourcePackage(self, name, version, suite, component):
q = "INSERT OR REPLACE INTO package_rel_map \
(package_id,suite_id,component_id) \
diff --git a/patchtracker/SourceArchive.py b/patchtracker/SourceArchive.py
index b8bc9eb..a30e07d 100755
--- a/patchtracker/SourceArchive.py
+++ b/patchtracker/SourceArchive.py
@@ -131,8 +131,20 @@ class SourcePackageIndex:
if not self.pkgs[srcpkg.idx][srcpkg.name].has_key(rel):
self.pkgs[srcpkg.idx][srcpkg.name][rel] = srcpkg
+ def size(self):
+ return sum([len(self.pkgs[i]) for i in self.pkgs.iterkeys()])
+
+ def getpackage(self, name):
+ try:
+ return self.getletter(name)[name]
+ except KeyError:
+ return None
+
def getletter(self, letter):
- return self.pkgs[getidx(letter)]
+ try:
+ return self.pkgs[getidx(letter)]
+ except KeyError:
+ return None
def indices(self):
return sorted(self.pkgs.iterkeys())
diff --git a/patchtracker/Templates.py b/patchtracker/Templates.py
index ba9764c..0848da1 100755
--- a/patchtracker/Templates.py
+++ b/patchtracker/Templates.py
@@ -44,8 +44,19 @@ class LetterTocTemplate(OurTemplate):
tpl = os.sep.join([Conf.template_dir, "letter_toc.tmpl"])
OurTemplate.__init__(self, file=tpl)
- def releases(self):
- return dists
+class SearchResultsTemplate(OurTemplate):
+ def __init__(self, search, collection):
+ self.pkgs = {}
+ self.idx = search
+ self.dists = {}
+ for idx in collection.indices():
+ for name,packagelist in collection.getletter(idx).iteritems():
+ self.pkgs[name] = packagelist
+ for d in packagelist.iterkeys():
+ self.dists[d] = True
+ tpl = os.sep.join([Conf.template_dir, "searchresults.tmpl"])
+ OurTemplate.__init__(self, file=tpl)
+
class ErrorTemplate(OurTemplate):
def __init__(self, msg):