Updated patch
Previous version breaks openning gzipped files :-) due to uncaught exception
--- /usr/lib/python2.7/tarfile.py.orig 2014-04-22 09:04:41.000000000 +0100
+++ /usr/lib/python2.7/tarfile.py 2014-04-22 09:55:48.000000000 +0100
@@ -440,6 +440,18 @@
else:
self.cmp = bz2.BZ2Compressor()
+ if comptype == "xz":
+ try:
+ import lzma
+ except ImportError:
+ raise CompressionError("lzma module is not available")
+ if mode == "r":
+ self.dbuf = b""
+ self.cmp = lzma.LZMADecompressor()
+ else:
+ self.cmp = lzma.LZMACompressor()
+
+
def __del__(self):
if hasattr(self, "closed") and not self.closed:
self.close()
@@ -630,6 +642,8 @@
return "gz"
if self.buf[0:3] == "BZh" and self.buf[4:10] == "1AY&SY":
return "bz2"
+ if self.buf.startswith((b"\x5d\x00\x00\x80", b"\xfd7zXZ")):
+ return "xz"
return "tar"
def close(self):
@@ -1653,6 +1667,7 @@
if mode in ("r", "r:*"):
# Find out which *open() is appropriate for opening the file.
for comptype in cls.OPEN_METH:
+ print comptype
func = getattr(cls, cls.OPEN_METH[comptype])
if fileobj is not None:
saved_pos = fileobj.tell()
@@ -1759,11 +1774,37 @@
t._extfileobj = False
return t
+ @classmethod
+ def xzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
+ """Open lzma compressed tar archive name for reading or writing.
+ Appending is not allowed.
+ """
+ if mode not in ("r", "w"):
+ raise ValueError("mode must be 'r' or 'w'")
+
+ try:
+ import lzma
+ except ImportError:
+ raise CompressionError("lzma module is not available")
+
+ fileobj = lzma.LZMAFile(fileobj or name, mode)
+
+ try:
+ t = cls.taropen(name, mode, fileobj, **kwargs)
+ except:
+ fileobj.close()
+ raise ReadError("not an lzma file")
+ t._extfileobj = False
+ return t
+
+
# All *open() methods are registered here.
OPEN_METH = {
"tar": "taropen", # uncompressed tar
"gz": "gzopen", # gzip compressed tar
- "bz2": "bz2open" # bzip2 compressed tar
+ "bz2": "bz2open", # bzip2 compressed tar
+ "xz": "xzopen" # lzma compressed tar
+
}
#--------------------------------------------------------------------------