diff options
Diffstat (limited to 'patchtracker/Patch.py')
-rw-r--r-- | patchtracker/Patch.py | 64 |
1 files changed, 62 insertions, 2 deletions
diff --git a/patchtracker/Patch.py b/patchtracker/Patch.py index 09f4911..c872d1c 100644 --- a/patchtracker/Patch.py +++ b/patchtracker/Patch.py @@ -1,6 +1,8 @@ -import sys -import os import errno +import os +import stat +import sys +import tempfile from glob import glob import pygments import pygments.lexers @@ -175,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: |