diff options
-rwxr-xr-x | gen-patch-info.py | 217 | ||||
-rwxr-xr-x | patchtracker/Conf.py | 7 | ||||
-rwxr-xr-x | patchtracker/SourceArchive.py | 148 | ||||
-rwxr-xr-x | patchtracker/Writers.py | 83 | ||||
-rw-r--r-- | patchtracker/__init__.py | 0 |
5 files changed, 243 insertions, 212 deletions
diff --git a/gen-patch-info.py b/gen-patch-info.py index 59c56eb..1a84372 100755 --- a/gen-patch-info.py +++ b/gen-patch-info.py @@ -10,224 +10,17 @@ from debian_bundle import deb822 from Cheetah.Template import Template from Cheetah.Compiler import Compiler -class Conf: - archive_root = '/scratch/debian-archive/debian' - archive_root_url = 'ftp://ftp.se.debian.org/debian' - output_dir = '/scratch/patches' - template_dir = './templates' - static_dir = './static' - root_url = 'http://people.debian.org/~seanius/pts/patches' - -class Archive: - root = None - distsdir = None - - def __init__(self, dir): - self.root = dir - self.distsdir = os.sep.join([dir, "dists"]) - - def suites(self): - for s in os.listdir(self.distsdir): - 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): - sfile=os.sep.join([self.distsdir,suite,component,"/source/Sources.gz"]) - for ent in deb822.Sources.iter_paragraphs(GzipFile(sfile)): - yield SourcePackage(ent) - - def __str__(self): - return "Archive rooted at "+self.root - -class PageWriter: - def __init__(self, filename, template): - try: - os.makedirs(os.path.dirname(filename)) - except OSError, e: - if e.errno != errno.EEXIST: - raise e - o = file(filename, "w") - o.write(str(template)) - o.close() - -class SourcePackage: - name = None - format = None - diffgz = None - loc = None - type = "Native" - version = None - seriespatches = {} - directpatches = [] - # 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" - - if self.diffgz != None: - self.debianonlydiff = "_".join([self.name, self.version, "debianonly.diff"]) - self.nondebiandiff = "_".join([self.name, self.version, "nondebian.diff"]) - - def idx(self): - name = str(self) - if len(name) < 4 or name[0:3] != "lib": - return name[0] - else: - return name[0:4] - - ## XXX okay, all of this could be made quite a bit cleaner - def diff_series(self, outdir): - if self.diffgz: - debdiff = os.sep.join([outdir, self.debianonlydiff]) - seriesdir = os.sep.join([outdir, "series"]) - try: - os.mkdir(os.sep.join([outdir,"series"])) - except OSError, e: - if e.errno != errno.EEXIST: - raise e - os.system("filterdiff -p 1 -i 'debian/patches/*' "+debdiff+"| ( cd "+ - seriesdir+"; patch -s )") - for (blah,blahblah,files) in os.walk(seriesdir): - try: - files.remove('series') - files.remove('00list') - except: - pass - for f in files: - p = os.sep.join([seriesdir, f]) - # get the info for summary generation - fd = os.popen("diffstat "+p) - self.seriespatches[f] = fd.read() - fd.close() - os.system("source-highlight -s diff -f xhtml -i "+p+" -o "+p+".html") - - def diff_debiandir(self, outdir): - try: - src = os.sep.join([Conf.archive_root, self.loc, self.diffgz['name']]) - dst = os.sep.join([outdir, self.debianonlydiff]) - os.system("filterdiff -z -p 1 -i 'debian/*' "+src+" > "+dst) - os.system("source-highlight -s diff -f xhtml -i "+dst+" -o "+dst+".html") - # in the case of native packages there is no diffgz - except TypeError: - pass - - def diff_nondebiandir(self, outdir): - try: - src = os.sep.join([Conf.archive_root, self.loc, self.diffgz['name']]) - dst = os.sep.join([outdir, self.nondebiandiff]) - os.system("filterdiff -z -p 1 -x 'debian/*' "+src+" > "+dst) - os.system("source-highlight -s diff -f xhtml -i "+dst+" -o "+dst+".html") - # in the case of native packages there is no diffgz - except TypeError: - pass - - def __str__(self): - return self.name - -class OurTemplate(Template): - def __init__(self, file): - Template.__init__(self, file=file, searchList={"conf":Conf}) - -class PackageVersTemplate(OurTemplate): - src = None - suite = None - - def __init__(self, srcpkg, suite): - self.src = srcpkg - self.suite = suite - tpl=os.sep.join([Conf.template_dir, "package_vers.tmpl"]) - OurTemplate.__init__(self, file=tpl) - -class PackageVersWriter(PageWriter): - def __init__(self, template): - dstdir = os.sep.join([Conf.output_dir, "packages", template.src.name, template.src.version]) - try: - os.makedirs(dstdir) - except OSError, e: - if e.errno != errno.EEXIST: - raise e - template.src.diff_debiandir(dstdir) - template.src.diff_nondebiandir(dstdir) - template.src.diff_series(dstdir) - dst = os.sep.join([dstdir, "index.html"]) - PageWriter.__init__(self, dst, template) - -class SourcePackageIndex: - 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 self.pkgs.iteritems(): - yield (k,v) - -class FrontPageTemplate(OurTemplate): - allindex = None - relindices = [] - - def __init__(self, allindex, release_indices=[]): - tpl = os.sep.join([Conf.template_dir, "frontpage.tmpl"]) - OurTemplate.__init__(self, file=tpl) - self.allindex = allindex - self.relindices = release_indices - -class FrontPageWriter(PageWriter): - def __init__(self, template): - dest = os.sep.join([Conf.output_dir, "index.html"]) - PageWriter.__init__(self, dest, template) - -class LetterTocTemplate(OurTemplate): - idx = None - pkgs = None - dists = None - - def releases(self): - return dists - - def __init__(self, letter, collection): - self.pkgs = collection - self.idx = letter - self.dists = {} - for name,packagelist in collection.iteritems(): - for d in packagelist.iterkeys(): - self.dists[d] = True - tpl = os.sep.join([Conf.template_dir, "letter_toc.tmpl"]) - OurTemplate.__init__(self, file=tpl) - -class LetterTocWriter(PageWriter): - - def __init__(self, template): - dest = os.sep.join([Conf.output_dir, "index", template.idx, "index.html"]) - PageWriter.__init__(self, dest, template) +import patchtracker.Conf as Conf +from patchtracker.Writers import LetterTocWriter, LetterTocTemplate, FrontPageWriter, FrontPageTemplate, PackageVersWriter, PackageVersTemplate +from patchtracker.SourceArchive import Archive, SourcePackage, SourcePackageIndex if __name__ == '__main__': os.system("cheetah compile templates/skeleton") a = Archive(Conf.archive_root) # just for now until development stablizes - os.system("rm -rf "+Conf.output_dir) - os.mkdir(Conf.output_dir) + #os.system("rm -rf "+Conf.output_dir) + #os.mkdir(Conf.output_dir) print a master_index = SourcePackageIndex() diff --git a/patchtracker/Conf.py b/patchtracker/Conf.py new file mode 100755 index 0000000..bc095b2 --- /dev/null +++ b/patchtracker/Conf.py @@ -0,0 +1,7 @@ +archive_root = '/scratch/debian-archive/debian' +archive_root_url = 'ftp://ftp.se.debian.org/debian' +output_dir = '/scratch/patches' +template_dir = './templates' +static_dir = './static' +#root_url = 'http://people.debian.org/~seanius/pts/patches' +root_url = '/patches' diff --git a/patchtracker/SourceArchive.py b/patchtracker/SourceArchive.py new file mode 100755 index 0000000..4ad4152 --- /dev/null +++ b/patchtracker/SourceArchive.py @@ -0,0 +1,148 @@ +import os +import errno +from fnmatch import fnmatch +from gzip import GzipFile +from debian_bundle import deb822 + +import patchtracker.Conf as Conf + +class Archive: + root = None + distsdir = None + + def __init__(self, dir): + self.root = dir + self.distsdir = os.sep.join([dir, "dists"]) + + def suites(self): + for s in os.listdir(self.distsdir): + 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): + sfile=os.sep.join([self.distsdir,suite,component,"/source/Sources.gz"]) + for ent in deb822.Sources.iter_paragraphs(GzipFile(sfile)): + if fnmatch(ent['Package'], 'av*'): + 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 + seriespatches = {} + directpatches = [] + # 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" + + if self.diffgz != None: + self.debianonlydiff = "_".join([self.name, self.version, "debianonly.diff"]) + self.nondebiandiff = "_".join([self.name, self.version, "nondebian.diff"]) + + def idx(self): + name = str(self) + if len(name) < 4 or name[0:3] != "lib": + return name[0] + else: + return name[0:4] + + ## XXX okay, all of this could be made quite a bit cleaner + def diff_series(self, outdir): + if self.diffgz: + debdiff = os.sep.join([outdir, self.debianonlydiff]) + seriesdir = os.sep.join([outdir, "series"]) + try: + os.mkdir(os.sep.join([outdir,"series"])) + except OSError, e: + if e.errno != errno.EEXIST: + raise e + # XXX better way to be idempotent + else: + return + os.system("filterdiff -p 1 -i 'debian/patches/*' "+debdiff+"| ( cd "+ + seriesdir+"; patch -s )") + for (blah,blahblah,files) in os.walk(seriesdir): + try: + files.remove('series') + files.remove('00list') + except: + pass + for f in files: + p = os.sep.join([seriesdir, f]) + # get the info for summary generation + fd = os.popen("diffstat "+p) + self.seriespatches[f] = fd.read() + fd.close() + os.system("source-highlight -s diff -f xhtml -i "+p+" -o "+p+".html") + + def diff_debiandir(self, outdir): + try: + src = os.sep.join([Conf.archive_root, self.loc, self.diffgz['name']]) + dst = os.sep.join([outdir, self.debianonlydiff]) + try: + os.stat(dst) + return + # XXX better way to be idempotent + except OSError, e: + pass + os.system("filterdiff -z -p 1 -i 'debian/*' "+src+" > "+dst) + os.system("source-highlight -s diff -f xhtml -i "+dst+" -o "+dst+".html") + # in the case of native packages there is no diffgz + except TypeError: + pass + + def diff_nondebiandir(self, outdir): + try: + src = os.sep.join([Conf.archive_root, self.loc, self.diffgz['name']]) + dst = os.sep.join([outdir, self.nondebiandiff]) + try: + os.stat(dst) + return + # XXX better way to be idempotent + except OSError, e: + pass + os.system("filterdiff -z -p 1 -x 'debian/*' "+src+" > "+dst) + os.system("source-highlight -s diff -f xhtml -i "+dst+" -o "+dst+".html") + # in the case of native packages there is no diffgz + except TypeError: + pass + + def __str__(self): + return self.name + +class SourcePackageIndex: + 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 self.pkgs.iteritems(): + yield (k,v) diff --git a/patchtracker/Writers.py b/patchtracker/Writers.py new file mode 100755 index 0000000..7e2d356 --- /dev/null +++ b/patchtracker/Writers.py @@ -0,0 +1,83 @@ +from patchtracker import Conf + +from Cheetah.Template import Template +from Cheetah.Compiler import Compiler +import os +import errno + +class OurTemplate(Template): + def __init__(self, file): + Template.__init__(self, file=file, searchList={"conf":Conf}) + +class PackageVersTemplate(OurTemplate): + src = None + suite = None + + def __init__(self, srcpkg, suite): + self.src = srcpkg + self.suite = suite + tpl=os.sep.join([Conf.template_dir, "package_vers.tmpl"]) + OurTemplate.__init__(self, file=tpl) + +class FrontPageTemplate(OurTemplate): + allindex = None + relindices = [] + + def __init__(self, allindex, release_indices=[]): + tpl = os.sep.join([Conf.template_dir, "frontpage.tmpl"]) + OurTemplate.__init__(self, file=tpl) + self.allindex = allindex + self.relindices = release_indices + +class LetterTocTemplate(OurTemplate): + idx = None + pkgs = None + dists = None + + def releases(self): + return dists + + def __init__(self, letter, collection): + self.pkgs = collection + self.idx = letter + self.dists = {} + for name,packagelist in collection.iteritems(): + for d in packagelist.iterkeys(): + self.dists[d] = True + tpl = os.sep.join([Conf.template_dir, "letter_toc.tmpl"]) + OurTemplate.__init__(self, file=tpl) + +class PageWriter: + def __init__(self, filename, template): + try: + os.makedirs(os.path.dirname(filename)) + except OSError, e: + if e.errno != errno.EEXIST: + raise e + o = file(filename, "w") + o.write(str(template)) + o.close() + +class PackageVersWriter(PageWriter): + def __init__(self, template): + dstdir = os.sep.join([Conf.output_dir, "packages", template.src.name, template.src.version]) + try: + os.makedirs(dstdir) + except OSError, e: + if e.errno != errno.EEXIST: + raise e + template.src.diff_debiandir(dstdir) + template.src.diff_nondebiandir(dstdir) + template.src.diff_series(dstdir) + dst = os.sep.join([dstdir, "index.html"]) + PageWriter.__init__(self, dst, template) + +class FrontPageWriter(PageWriter): + def __init__(self, template): + dest = os.sep.join([Conf.output_dir, "index.html"]) + PageWriter.__init__(self, dest, template) + +class LetterTocWriter(PageWriter): + def __init__(self, template): + dest = os.sep.join([Conf.output_dir, "index", template.idx, "index.html"]) + PageWriter.__init__(self, dest, template) diff --git a/patchtracker/__init__.py b/patchtracker/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/patchtracker/__init__.py |