import os import errno from fnmatch import fnmatch from gzip import GzipFile from debian_bundle import deb822 from operator import itemgetter import patchtracker.Conf as Conf from DiffGzHandler import DiffGzHandler class Archive: root = None distsdir = None def __init__(self, dir): self.root = dir self.distsdir = os.sep.join([dir, "dists"]) def suites(self, filter=None): slist = os.listdir(self.distsdir) if filter: slist = set(filter).intersection(set(slist)) for s in sorted(slist): yield s def components(self, suite): f = file(self.distsdir + os.sep + os.sep.join([suite, "Release"])) rel = deb822.Release(f) for comp in rel['Components'].split(' '): yield comp def sourcepackages(self, suite, component, filter=None): sfile=os.sep.join([self.distsdir,suite,component,"/source/Sources.gz"]) k = itemgetter('Package') fdict = {} if filter: for name in filter: fdict[name] = True for ent in sorted(deb822.Sources.iter_paragraphs(GzipFile(sfile)), key=k): if filter and not fdict.has_key(ent['Package']): continue else: yield SourcePackage(ent) def __str__(self): return "Archive rooted at "+self.root class SourcePackage: name = None format = None diffgz = None loc = None type = "Native" version = None # todo vcs = {} def __init__(self, info): self.name = info['Package'] self.format = info['Format'] self.loc = info['Directory'] self.version = info['Version'] for f in info['Files']: if fnmatch(f['name'], '*.diff.gz'): self.diffgz=f self.type = "Debian-diff" def idx(self): name = str(self) if len(name) < 4 or name[0:3] != "lib": return name[0] else: return name[0:4] def __str__(self): return self.name class SourcePackageIndex: def __init__(self): self.pkgs = {} def ins(self, srcpkg, rel): idx = srcpkg.idx() if not self.pkgs.has_key(idx): self.pkgs[idx] = {} if not self.pkgs[idx].has_key(srcpkg.name): self.pkgs[idx][srcpkg.name] = {} if not self.pkgs[idx][srcpkg.name].has_key(rel): self.pkgs[idx][srcpkg.name][rel] = srcpkg def indices(self): for k,v in sorted(self.pkgs.iteritems()): yield (k,v)