def export_tar(tree, storage, output, compression=None):
""" Export a tree in tar format.
"""
mode = 'w'
if compression in ('gz', 'bz2', 'xz'):
mode += ':' + compression
with tarfile.open(output, mode) as tar:
for fullname, item in walk_tree(storage, tree):
payload = None
info = tarfile.TarInfo()
info.name = fullname.decode('utf-8', 'ignore')
if item.type == 'blob':
payload = storage.get_blob(item.ref).blob
info.type = tarfile.REGTYPE
info.size = item['size']
printer.verbose('Adding to {out}: <b>{fn}</b> ({size})',
out=output,
fn=fullname.decode('utf-8', errors='ignore'),
size=humanize.naturalsize(item['size'], binary=True))
elif item.type == 'tree':
info.type = tarfile.DIRTYPE
printer.verbose('Adding to {out}: <b>{fn}</b> (directory)',
out=output,
fn=fullname.decode('utf-8', errors='ignore'))
else:
if item['filetype'] == 'link':
info.type = tarfile.SYMTYPE
info.linkname = item['link']
printer.verbose('Adding to {out}: <b>{fn}</b> (link to {link})',
out=output,
fn=fullname.decode('utf-8', errors='ignore'),
link=item['link'].decode('utf-8', errors='replace'))
elif item['filetype'] == 'fifo':
info.type = tarfile.FIFOTYPE
printer.verbose('Adding to {out}: <b>{fn}</b> (fifo)',
out=output,
fn=fullname.decode('utf-8', errors='ignore'))
else:
continue # Ignore unknown file types
# Set optional attributes:
info.mode = item.get('mode')
info.uid = item.get('uid')
info.gid = item.get('gid')
info.mtime = item.get('mtime')
# Add the item into the tar file:
tar.addfile(info, payload)
评论列表
文章目录