in pkg/private/archive.py [0:0]
def __init__(self,
name,
compression='',
compressor='',
root_directory='.',
default_mtime=None,
preserve_tar_mtimes=True):
"""TarFileWriter wraps tarfile.open().
Args:
name: the tar file name.
compression: compression type: bzip2, bz2, gz, tgz, xz, lzma.
compressor: custom command to do the compression.
root_directory: virtual root to prepend to elements in the archive.
default_mtime: default mtime to use for elements in the archive.
May be an integer or the value 'portable' to use the date
2000-01-01, which is compatible with non *nix OSes'.
preserve_tar_mtimes: if true, keep file mtimes from input tar file.
"""
self.preserve_mtime = preserve_tar_mtimes
if default_mtime is None:
self.default_mtime = 0
elif default_mtime == 'portable':
self.default_mtime = PORTABLE_MTIME
else:
self.default_mtime = int(default_mtime)
self.fileobj = None
self.compressor_cmd = (compressor or '').strip()
if self.compressor_cmd:
# Some custom command has been specified: no need for further
# configuration, we're just going to use it.
pass
# Support xz compression through xz... until we can use Py3
elif compression in ['xz', 'lzma']:
if HAS_LZMA:
mode = 'w:xz'
else:
self.compressor_cmd = 'xz -F {} -'.format(compression)
elif compression in ['bzip2', 'bz2']:
mode = 'w:bz2'
else:
mode = 'w:'
if compression in ['tgz', 'gz']:
# The Tarfile class doesn't allow us to specify gzip's mtime attribute.
# Instead, we manually reimplement gzopen from tarfile.py and set mtime.
self.fileobj = gzip.GzipFile(
filename=name, mode='w', compresslevel=9, mtime=self.default_mtime)
self.compressor_proc = None
if self.compressor_cmd:
mode = 'w|'
self.compressor_proc = subprocess.Popen(self.compressor_cmd.split(),
stdin=subprocess.PIPE,
stdout=open(name, 'wb'))
self.fileobj = self.compressor_proc.stdin
self.name = name
self.root_directory = root_directory.rstrip('/').rstrip('\\')
self.root_directory = self.root_directory.replace('\\', '/')
self.tar = tarfile.open(name=name, mode=mode, fileobj=self.fileobj)
self.members = set([])
self.directories = set([])