import sys import os import errno from glob import glob class Diffstat: def __init__(self, patch): self.patch = patch i,o = os.popen2("diffstat -p1") i.write(str(patch)) i.close() self.output = o.readlines() def stats(self): i,o = os.popen2("diffstat -p1 -t") i.write(str(self.patch)) i.close() o.readline() return [map(lambda x: x.strip(), l.split(",")) for l in o.readlines()] def summary(self): return self.output[-1] def __str__(self): return "".join(self.output) class Patch: def __init__(self, fh, level=1): self.p = fh.readlines() self.lvl = level def __str__(self): return "".join(self.p) def lines(self): return len(self.p) def diffstat(self): return Diffstat(self) # XXX this entire __init__ stuff is way to ugly class PatchSeries (list): def __init__(self, dir): fd = None self.blank() self.style = "simple" try: fd = file(os.sep.join([dir, "00list"])) self.style = "dpatch" except IOError, e: if e.errno != errno.ENOENT: #print "ERROR: unable to open dpatch list..." self.blank() return try: fd = file(os.sep.join([dir, "series"])) self.style = "quilt" except IOError, e: if e.errno != errno.ENOENT: #print "ERROR: series file is a directory..." self.blank() return if fd: # remove blank lines for line in filter(None, [n.strip() for n in fd.readlines()]): stuff = line.split(' ') # skip comments if stuff[0][0] == "#": continue # here's the name name = stuff[0] #print "\t\t\t%s: %s"%(self.style,name) self.names.append(name) # anything else are either patch args or comments self.patchargs[name] = [] for rest in filter(None, stuff[1:]): if rest[0][0] == "#": break else: self.patchargs[name].append(rest) else: self.names = os.listdir(dir) self.names.sort() for n in self.names: self.patchargs[n] = [] # XXX this code is too ugly removelater=[] for p in self.names: try: self.patches[p] = Patch(file(os.sep.join([dir, p]))) except IOError, e: if e.errno == errno.ENOENT and self.style == "dpatch": try: self.patches[p] = Patch(file(os.sep.join([dir, p+".dpatch"]))) except: #print "ERROR: could not find patch",p self.blank() return elif e.errno == errno.EISDIR: #print "WARNING: directory %s in patch dir, patch list incomplete"%(p) removelater.append(p) else: #print "ERROR: could not find patch",p self.blank() return for p in removelater: self.names.remove(p) def blank(self): self.names = [] self.style = "unknown" self.patches = {} self.patchargs = {} def iterpatches(self): for p in self.names: yield (p, self.patches[p]) def __getitem__(self, y): return self.patches[self.names[y]] def __len__(self): return len(self.names) def fetch(self, name): return self.patches[name] def __str__(self): return "\n".join(self.names) if __name__ == "__main__": print "Patch.py testing" try: p = Patch(file(sys.argv[1])) print "patch contents:" print p except IndexError: print "usage: %s "