summaryrefslogtreecommitdiff
path: root/patchtracker/Patch.py
diff options
context:
space:
mode:
Diffstat (limited to 'patchtracker/Patch.py')
-rw-r--r--patchtracker/Patch.py64
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: