diff options
Diffstat (limited to 'patchtracker')
-rw-r--r-- | patchtracker/DB.py | 27 | ||||
-rw-r--r-- | patchtracker/DebTarHandler.py | 27 | ||||
-rw-r--r-- | patchtracker/Patch.py | 65 | ||||
-rwxr-xr-x | patchtracker/ReqHandler.py | 8 | ||||
-rwxr-xr-x | patchtracker/SourceArchive.py | 14 | ||||
-rwxr-xr-x | patchtracker/Templates.py | 13 |
6 files changed, 123 insertions, 31 deletions
diff --git a/patchtracker/DB.py b/patchtracker/DB.py index 88d2886..0bb0966 100644 --- a/patchtracker/DB.py +++ b/patchtracker/DB.py @@ -16,6 +16,10 @@ def srcpkg_factory(cursor, row): diffgz = {'name':d['diffgz_name'], 'size':d['diffgz_size'], 'md5sum':d['diffgz_md5sum'] } info['Files'].append(diffgz) + if d['debtar_name']: + debtar = {'name':d['debtar_name'], 'size':d['debtar_size'], + 'md5sum':d['debtar_md5sum'] } + info['Files'].append(debtar) colmap = {'name':'Package','version':'Version','format':'Format', 'loc':'Directory','maintainer':'Maintainer','uploaders':'Uploaders'} @@ -39,6 +43,10 @@ def srcpkg_collection_factory(cursor, row): diffgz = {'name':d['diffgz_name'], 'size':d['diffgz_size'], 'md5sum':d['diffgz_md5sum'] } info['Files'].append(diffgz) + if d['debtar_name']: + debtar = {'name':d['debtar_name'], 'size':d['debtar_size'], + 'md5sum':d['debtar_md5sum'] } + info['Files'].append(debtar) colmap = {'name':'Package','version':'Version','format':'Format', 'loc':'Directory','maintainer':'Maintainer','uploaders':'Uploaders'} @@ -70,11 +78,14 @@ class PatchTrackerDB: cursor = self.db.cursor() #print "creating new record for",srcpkg q = "INSERT OR IGNORE INTO packages \ - (name,format,loc,version,diffgz_name,diffgz_size,diffgz_md5sum,maintainer,uploaders) \ - VALUES (?,?,?,?,?,?,?,?,?)" + (name,format,loc,version,diffgz_name,diffgz_size,diffgz_md5sum,debtar_name,debtar_size,debtar_md5sum,maintainer,uploaders) \ + VALUES (?,?,?,?,?,?,?,?,?,?,?,?)" cursor.execute(q, (srcpkg.name,srcpkg.format,srcpkg.loc, srcpkg.version,srcpkg.diffgz_name,srcpkg.diffgz_size, - srcpkg.diffgz_md5sum,srcpkg.maintainers,srcpkg.uploaders)) + srcpkg.diffgz_md5sum, + srcpkg.debtar_name,srcpkg.debtar_size, + srcpkg.debtar_md5sum, + srcpkg.maintainers,srcpkg.uploaders)) def saveSuite(self, suite): q = "INSERT INTO suites (name) VALUES (?)" @@ -146,6 +157,16 @@ class PatchTrackerDB: except: return None + def findDebTar(self, pkgname, version): + q = "SELECT debtar_name,loc FROM packages WHERE name=? AND version=?" + cursor = self.db.cursor() + cursor.execute(q, (pkgname, version)) + try: + debtar,loc = cursor.fetchone() + return os.sep.join([Conf.archive_root, loc, debtar]) + except: + return None + def prune(self): q = "DELETE FROM package_rel_map WHERE marked != 1" cursor = self.db.cursor() diff --git a/patchtracker/DebTarHandler.py b/patchtracker/DebTarHandler.py new file mode 100644 index 0000000..311e39b --- /dev/null +++ b/patchtracker/DebTarHandler.py @@ -0,0 +1,27 @@ +import os +import stat +import sys + +import Patch + +class DebTarHandler: + diff = None + def __init__(self,fname): + self.tarfile = fname + self.size = os.stat(fname)[stat.ST_SIZE] + + def series(self): + return Patch.Quilt30PatchSeries(self.tarfile) + +if __name__ == "__main__": + print "DebTarHandler testing" + try: + dh = DebTarHandler(sys.argv[1]) + except IndexError: + print "usage: %s <diffgz>"%(sys.argv[0]) + sys.exit(1) + + print "series:" + for f,p in dh.series(): + print f + print p diff --git a/patchtracker/Patch.py b/patchtracker/Patch.py index 670f389..e19ad8c 100644 --- a/patchtracker/Patch.py +++ b/patchtracker/Patch.py @@ -2,6 +2,7 @@ import sys import os import errno from glob import glob +import tarfile class Diffstat: def __init__(self, patch): @@ -38,9 +39,35 @@ class Patch: def diffstat(self): return Diffstat(self) -# XXX this entire __init__ stuff is way to ugly -class PatchSeries (list): +class GenericPatchSeries (list): + def blank(self): + self.names = [] + self.style = "unknown" + self.patches = {} + self.patchargs = {} + + # WTF am i doing this for, again? + def iterpatches(self): + for p in self.names: + yield (p, self.patches[p]) + + def __iter__(self): + return self.iterpatches() + + def __getitem__(self, y): + return self.patches[self.names[y]] + + def __len__(self): + return len(self.names) + + def fetch(self, name): + return self.patches[name] + + def __str__(self): + return "\n".join(self.names) +# XXX this entire __init__ stuff is way to ugly +class PatchSeries (GenericPatchSeries): def __init__(self, dir): fd = None self.blank() @@ -110,27 +137,19 @@ class PatchSeries (list): for p in removelater: self.names.remove(p) - def blank(self): - self.names = [] - self.style = "unknown" - self.patches = {} - self.patchargs = {} - - def iterpatches(self): - for p in self.names: - yield (p, self.patches[p]) - - def __getitem__(self, y): - return self.patches[self.names[y]] - - def __len__(self): - return len(self.names) - - def fetch(self, name): - return self.patches[name] - - def __str__(self): - return "\n".join(self.names) +class Quilt30PatchSeries (GenericPatchSeries): + def __init__(self, tarBall): + self.blank() + self.style = "quilt (3.0)" + self.tarfh = tarfile.open(tarBall, 'r:*') + try: + series_fh = self.tarfh.extractfile("debian/patches/debian.series") + except KeyError: + series_fh = self.tarfh.extractfile("debian/patches/series") + self.names = ["debian/patches/"+fn.strip() for fn in series_fh.readlines()] + # XXX to lazy eval this might be better + for name in self.names: + self.patches[name] = Patch(self.tarfh.extractfile(name)) if __name__ == "__main__": print "Patch.py testing" diff --git a/patchtracker/ReqHandler.py b/patchtracker/ReqHandler.py index af54116..90fc75a 100755 --- a/patchtracker/ReqHandler.py +++ b/patchtracker/ReqHandler.py @@ -7,6 +7,7 @@ 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 @@ -66,12 +67,17 @@ class PatchCmd(Cmd): 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: - raise ReqHandlerException("can not find diff file for %s / %s"%(pkgname,vers)) + 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": diff --git a/patchtracker/SourceArchive.py b/patchtracker/SourceArchive.py index 6134682..da18e83 100755 --- a/patchtracker/SourceArchive.py +++ b/patchtracker/SourceArchive.py @@ -91,10 +91,19 @@ def getidx(letter): class SourcePackage: def __init__(self, info): + # attributes for debian .diff.gz source packages self.diffgz_name = None self.diffgz_size = None self.diffgz_md5sum = None self.diffgz = None + + # attributes for debian .debian.tar.gz source packages + self.debtar_name = None + self.debtar_size = None + self.debtar_md5sum = None + self.debtar = None + + # some other defaults self.type = "Native" self.name = info['Package'] self.format = info['Format'] @@ -120,6 +129,11 @@ class SourcePackage: self.diffgz_size=f['size'] self.diffgz_md5sum=f['md5sum'] self.type = "Debian-diff" + elif fnmatch(f['name'], '*.debian.tar.gz'): + self.debtar_name=f['name'] + self.debtar_size=f['size'] + self.debtar_md5sum=f['md5sum'] + self.type = "Debian-tar" def __str__(self): return self.name diff --git a/patchtracker/Templates.py b/patchtracker/Templates.py index a30e2c0..42140a8 100755 --- a/patchtracker/Templates.py +++ b/patchtracker/Templates.py @@ -1,5 +1,6 @@ -from patchtracker import Conf +from patchtracker import Conf, DB from patchtracker.DiffGzHandler import DiffGzHandler +from patchtracker.DebTarHandler import DebTarHandler from patchtracker.SourceArchive import ReleaseList from Cheetah.Template import Template @@ -34,11 +35,15 @@ class PackageVersTemplate(OurTemplate): self.src = srcpkg tpl=os.sep.join([Conf.template_dir, "package_vers.tmpl"]) sl = {} - if srcpkg.diffgz_name: - dfile = os.sep.join([Conf.archive_root,srcpkg.loc,srcpkg.diffgz_name]) + # XXX c/p from PatchCmd.make_diffhandler + db = DB.PatchTrackerDB() + dfile = db.findDiffGz(srcpkg.name,srcpkg.version) + if dfile: sl['diffhandler'] = DiffGzHandler(dfile) else: - sl['diffhandler'] = None + dfile = db.findDebTar(srcpkg.name, srcpkg.version) + if dfile: + sl['diffhandler'] = DebTarHandler(dfile) sl['crumbs'] = [("package/"+srcpkg.name,srcpkg.name), ("package/"+srcpkg.name+"/"+srcpkg.version, srcpkg.name+"/"+srcpkg.version)] |