summaryrefslogtreecommitdiff
path: root/patchtracker
diff options
context:
space:
mode:
authorSean Finney <seanius@debian.org>2008-06-04 00:21:45 +0200
committerSean Finney <seanius@debian.org>2008-06-04 00:21:45 +0200
commitadb7a8dcacbbb9e147f5306b6632c9c8b4bd0088 (patch)
tree3385daa7a161a326ce24dfee7b27c54f49f95c2d /patchtracker
parent1b16f0f567c163cef3da20b97f876003cd9ade61 (diff)
downloadpatch-tracker-adb7a8dcacbbb9e147f5306b6632c9c8b4bd0088.tar.gz
split up / modularize python code just a bit
Diffstat (limited to 'patchtracker')
-rwxr-xr-xpatchtracker/Conf.py7
-rwxr-xr-xpatchtracker/SourceArchive.py148
-rwxr-xr-xpatchtracker/Writers.py83
-rw-r--r--patchtracker/__init__.py0
4 files changed, 238 insertions, 0 deletions
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