diff options
Diffstat (limited to 'patchtracker/Patch.py')
-rw-r--r-- | patchtracker/Patch.py | 75 |
1 files changed, 73 insertions, 2 deletions
diff --git a/patchtracker/Patch.py b/patchtracker/Patch.py index 6533910..c872d1c 100644 --- a/patchtracker/Patch.py +++ b/patchtracker/Patch.py @@ -1,7 +1,12 @@ -import sys -import os import errno +import os +import stat +import sys +import tempfile from glob import glob +import pygments +import pygments.lexers +import pygments.formatters import tarfile class Diffstat: @@ -39,6 +44,14 @@ class Patch: def diffstat(self): return Diffstat(self) + def highlight(self): + for enc in ['utf-8', 'latin-1']: + try: + return pygments.highlight(str(self).decode(enc), pygments.lexers.DiffLexer(), + pygments.formatters.HtmlFormatter(style='colorful', noclasses=True, encoding=enc, nobackground=True)) + except UnicodeDecodeError: + pass + class GenericPatchSeries (list): def blank(self): self.names = [] @@ -164,6 +177,64 @@ class Quilt30PatchSeries (GenericPatchSeries): for name in self.names: self.patches[name] = Patch(self.tarfh.extractfile("debian/patches/"+name)) +class DebTarHandler: + diff = None + def __init__(self,fname): + self.tarfile = fname + self.size = os.stat(fname)[stat.ST_SIZE] + + def series(self): + return Quilt30PatchSeries(self.tarfile) + +class DiffGzException(Exception): + pass + +class DiffGzHandler: + diff = None + def __init__(self,fname): + self.diff = fname + self.size = os.stat(fname)[stat.ST_SIZE] + + def filterdiff(self, include=None, exclude=None): + cmd = ["filterdiff","-z","-p","1"] + if include: + cmd += [ "-i", include] + elif exclude: + cmd += [ "-x", exclude] + else: + raise Exception("DiffGzHandler.filterdiff called w/o include/exclude") + i,o,e=os.popen3(cmd+[self.diff]) + i.close() + p = Patch(o) + err = e.read() + if len(err): + raise DiffGzException("filterdiff gave errors: "+err) + return p + + def debiandir(self): + return self.filterdiff(include='debian/*') + + def nondebiandir(self): + return self.filterdiff(exclude='debian/*') + + def series(self): + patches = None + embedded = self.filterdiff(include='debian/patches*') + + # XXX *cough* cache *cough* + if embedded.lines(): + td = tempfile.mkdtemp() + i,o,e=os.popen3("patch -d %s -p3"%(td)) + i.write(str(embedded)) + i.close() + err = e.read() + if len(err): + raise Exception("unable to extract series patches:\n"+err) + patches = PatchSeries(td) + os.system("rm -rf %s"%(td)) + + return patches + if __name__ == "__main__": print "Patch.py testing" try: |