diff options
Diffstat (limited to 'patchtracker/Patch.py')
-rw-r--r-- | patchtracker/Patch.py | 79 |
1 files changed, 69 insertions, 10 deletions
diff --git a/patchtracker/Patch.py b/patchtracker/Patch.py index 8a1dbd0..64cf9c9 100644 --- a/patchtracker/Patch.py +++ b/patchtracker/Patch.py @@ -4,10 +4,9 @@ import errno from glob import glob class Patch: - p = [] - - def __init__(self, fh): + def __init__(self, fh, level=1): self.p = fh.readlines() + self.lvl = level def __str__(self): return "".join(self.p) @@ -15,34 +14,94 @@ class Patch: def lines(self): return len(self.p) + def diffstat(self): + i,o = os.popen2("diffstat") + i.write(str(self)) + i.close() + return o.read() + + +# XXX this entire __init__ stuff is way to ugly class PatchSeries (list): - style = "simple" - names = [] - patches = {} 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: - raise e + 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: - raise e + print "ERROR: series file is a directory..." + self.blank() + return if fd: - self.names = [n.rstrip() for n in fd.readlines()] + # 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: - self.patches[p] = Patch(file(os.sep.join([dir, p]))) + yield (p, self.patches[p]) def __getitem__(self, y): return self.patches[self.names[y]] |