import tempfile import sys import os from Patch import Patch, PatchSeries class DiffGzHandler: diff = None def __init__(self,fname): self.diff = fname 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 Exception("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 "DiffGzHandler testing" try: dh = DiffGzHandler(sys.argv[1]) except IndexError: print "usage: %s "%(sys.argv[0]) sys.exit(1) print "debian dir:" print dh.debiandir().diffstat() print "nondebian dir:" print dh.nondebiandir().diffstat() print "series:" s = dh.series() print s for name,patch in s.iterpatches(): print "patch:",name print patch.diffstat()