archive: Add support for xz compressed tar archives
This commit is contained in:
+16
-10
@@ -97,11 +97,17 @@ class _LZMAProxy(object):
|
|||||||
class TarFile(tarfile.TarFile):
|
class TarFile(tarfile.TarFile):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def lzmaopen(cls, name=None, mode="r", fileobj=None,
|
def lzmaopen(cls,
|
||||||
compresslevel=9, **kwargs):
|
name=None,
|
||||||
"""Open lzma compressed tar archive name for reading or writing.
|
mode="r",
|
||||||
|
fileobj=None,
|
||||||
|
compressformat="xz",
|
||||||
|
compresslevel=9,
|
||||||
|
**kwargs):
|
||||||
|
"""Open lzma/xz compressed tar archive name for reading or writing.
|
||||||
Appending is not allowed.
|
Appending is not allowed.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if len(mode) > 1 or mode not in "rw":
|
if len(mode) > 1 or mode not in "rw":
|
||||||
raise ValueError("mode must be 'r' or 'w'.")
|
raise ValueError("mode must be 'r' or 'w'.")
|
||||||
|
|
||||||
@@ -113,11 +119,8 @@ class TarFile(tarfile.TarFile):
|
|||||||
if fileobj is not None:
|
if fileobj is not None:
|
||||||
fileobj = _LZMAProxy(fileobj, mode)
|
fileobj = _LZMAProxy(fileobj, mode)
|
||||||
else:
|
else:
|
||||||
options = {
|
options = {"format": compressformat,
|
||||||
"format": "alone",
|
"level": compresslevel}
|
||||||
"level": compresslevel,
|
|
||||||
#"extreme": compresslevel == 9
|
|
||||||
}
|
|
||||||
fileobj = lzma.LZMAFile(name, mode, options=options)
|
fileobj = lzma.LZMAFile(name, mode, options=options)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -242,7 +245,7 @@ class ArchiveTar(ArchiveBase):
|
|||||||
rmode = 'r:gz'
|
rmode = 'r:gz'
|
||||||
elif self.type == 'tarbz2':
|
elif self.type == 'tarbz2':
|
||||||
rmode = 'r:bz2'
|
rmode = 'r:bz2'
|
||||||
elif self.type == 'tarlzma':
|
elif self.type in ('tarlzma', 'tarxz'):
|
||||||
self.tar = TarFile.lzmaopen(self.file_path, fileobj=self.fileobj)
|
self.tar = TarFile.lzmaopen(self.file_path, fileobj=self.fileobj)
|
||||||
else:
|
else:
|
||||||
raise UnknownArchiveType
|
raise UnknownArchiveType
|
||||||
@@ -303,10 +306,12 @@ class ArchiveTar(ArchiveBase):
|
|||||||
wmode = 'w:gz'
|
wmode = 'w:gz'
|
||||||
elif self.type == 'tarbz2':
|
elif self.type == 'tarbz2':
|
||||||
wmode = 'w:bz2'
|
wmode = 'w:bz2'
|
||||||
elif self.type == 'tarlzma':
|
elif self.type in ('tarlzma', 'tarxz'):
|
||||||
|
format = "xz" if self.type == "tarxz" else "alone"
|
||||||
level = int(ctx.config.values.build.compressionlevel)
|
level = int(ctx.config.values.build.compressionlevel)
|
||||||
self.tar = TarFile.lzmaopen(self.file_path, "w",
|
self.tar = TarFile.lzmaopen(self.file_path, "w",
|
||||||
fileobj=self.fileobj,
|
fileobj=self.fileobj,
|
||||||
|
compressformat=format,
|
||||||
compresslevel=level)
|
compresslevel=level)
|
||||||
else:
|
else:
|
||||||
raise UnknownArchiveType
|
raise UnknownArchiveType
|
||||||
@@ -550,6 +555,7 @@ class Archive:
|
|||||||
handlers = {'targz': ArchiveTar,
|
handlers = {'targz': ArchiveTar,
|
||||||
'tarbz2': ArchiveTar,
|
'tarbz2': ArchiveTar,
|
||||||
'tarlzma': ArchiveTar,
|
'tarlzma': ArchiveTar,
|
||||||
|
'tarxz': ArchiveTar,
|
||||||
'tarZ': ArchiveTarZ,
|
'tarZ': ArchiveTarZ,
|
||||||
'tar': ArchiveTar,
|
'tar': ArchiveTar,
|
||||||
'zip': ArchiveZip,
|
'zip': ArchiveZip,
|
||||||
|
|||||||
Reference in New Issue
Block a user