import tempfile import sys import os import stat from Patch import Patch, PatchSeries 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, ghost=False): 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, ghost=ghost) o.close() 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, ghost=False): return self.filterdiff(exclude='debian/*', ghost=ghost) def series(self, ghost=False): patches = None # XXX *cough* cache *cough* td = tempfile.mkdtemp() i,o,e=os.popen3("filterdiff -z -p 1 -i 'debian/patches*' %s | patch -d %s -p3" % (self.diff, td)) o.close() i.close() err = e.read() if len(err): raise Exception("unable to extract series patches:\n"+err) patches = PatchSeries(td, ghost=ghost) 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()