Source code for soma.archive

# -*- coding: utf-8 -*-
from __future__ import absolute_import
import tarfile
import zipfile
import os

[docs]def is_archive(filename): """ Returns true if filename is an archive and false otherwise. """ if zipfile.is_zipfile(filename): return True else: try: tarfile.open(filename) return True except Exception: pass if os.path.splitext(filename)[1] in get_archive_extensions(): return True return False
def get_archive_extensions(): return ['.zip', '.gz', '.tar', '.bz2', '.tgz']
[docs]def unpack(input_filename, extract_dir): """ Unpacks the input_filename archive to the extract_dir directory. """ if zipfile.is_zipfile(input_filename): unzip(input_filename, extract_dir) else: untar(input_filename, extract_dir)
[docs]def pack(output_filename, sources): """ Packs the source_dir directory in the output_filename archive. """ ext = os.path.splitext(output_filename)[1][1:] if ext == 'zip': pack_zip(output_filename, sources) elif ext == 'gz' or ext == 'tgz' or ext == 'bz2' or ext == 'tar': pack_tar(output_filename, sources, ext)
[docs]def untar(input_filename, extract_dir): """ Extracts the input_filename archive to the extract_dir directory. """ try: tar_ds = tarfile.open(input_filename) except (tarfile.TarError, EOFError): raise OSError("%s is not a tar file" % (input_filename)) tar_ds.extractall(path=extract_dir) tar_ds.close()
[docs]def unzip(input_filename, extract_dir): """ Extracts the input_filename archive to the extract_dir directory. """ if not zipfile.is_zipfile(input_filename): raise OSError("%s is not a zip file" % (input_filename)) zip_ds = zipfile.ZipFile(input_filename) zip_ds.extractall(path=extract_dir) zip_ds.close()
[docs]def pack_tar(output_filename, sources, type='gz'): """ Creates a tar archive in output_filename from the source_dir directory. """ if type == 'tgz': type = 'gz' elif type == 'tar': type = '' tar_ds = tarfile.open(output_filename, 'w:' + type) if not isinstance(sources, (list, tuple)) and \ isinstance(sources, str): sources = [sources] for source in sources: tar_ds.add(source, arcname=os.path.basename(source)) tar_ds.close()
[docs]def pack_zip(output_filename, sources): """ Creates a zip archive in output_filename from the source_dir directory. """ previous_dir = os.getcwd() if not isinstance(sources, (list, tuple)) and \ isinstance(sources, str): sources = [sources] zip_ds = zipfile.ZipFile(output_filename, 'w', zipfile.ZIP_DEFLATED) for source in sources: os.chdir(os.path.dirname(source)) if os.path.isdir(source): for root, dirs, files in os.walk(os.path.basename(source)): for file in files: zip_ds.write(os.path.join(root, file)) else: zip_ds.write(os.path.basename(source)) zip_ds.close() os.chdir(previous_dir)