decouple a function decompress out of decompress_tar
[~helmut/debian-dedup.git] / dedup / compression.py
index 52917e3..5df6613 100644 (file)
@@ -1,7 +1,10 @@
+import bz2
 import struct
 import sys
 import zlib
 
+import lzma
+
 crc32_type = "L" if sys.version_info.major >= 3 else "l"
 
 class GzipDecompressor(object):
@@ -151,3 +154,32 @@ class DecompressedStream(object):
             self.decompressor = None
             self.buff = b""
             self.closed = True
+
+decompressors = {
+    '.gz':   GzipDecompressor,
+    '.bz2':  bz2.BZ2Decompressor,
+    '.lzma': lzma.LZMADecompressor,
+    '.xz':   lzma.LZMADecompressor,
+}
+
+def decompress(filelike, extension):
+    """Decompress a stream according to its extension.
+    @param filelike: is a read-only byte-stream. It must support read(size) and
+                     close().
+    @param extension: permitted values are "", ".gz", ".bz2", ".lzma", and
+                      ".xz"
+    @type extension: str
+    @returns: a read-only byte-stream with the decompressed contents of the
+              original filelike. It supports read(size) and close(). If the
+              original supports seek(pos) and tell(), then it also supports
+              those.
+    @raises ValueError: on unkown extensions
+    """
+    if not extension:
+        return filelike
+    try:
+        decompressor = decompressors[extension]
+    except KeyError:
+        raise ValueError("unknown compression format with extension %r" %
+                         extension)
+    return DecompressedStream(filelike, decompressor())