Skip to content
  • def uncompress(tarpath: str, dest: str):
        """Uncompress tarpath to dest folder if tarball is supported.
    
           Note that this fixes permissions after successfully
           uncompressing the archive.
    
        Args:
            tarpath: path to tarball to uncompress
            dest: the destination folder where to uncompress the tarball,
                it will be created if it does not exist
    
        Raises:
            ValueError when a problem occurs during unpacking
    
        """
        try:
            os.makedirs(dest, exist_ok=True)
            format = None
            # try to get archive format from extension
            for format_, exts, _ in shutil.get_unpack_formats():
                if any([tarpath.lower().endswith(ext.lower()) for ext in exts]):
                    format = format_
                    break
            # try to get archive format from file mimetype
            if format is None:
                m = magic.Magic(mime=True)
                mime = m.from_file(tarpath)
                format = MIMETYPE_TO_ARCHIVE_FORMAT.get(mime)
            shutil.unpack_archive(tarpath, extract_dir=dest, format=format)
        except shutil.ReadError as e:
            raise ValueError(f"Problem during unpacking {tarpath}. Reason: {e}")
        except NotImplementedError:
            if tarpath.lower().endswith(".zip") or format == "zip":
                _unpack_zip(tarpath, dest)
            else:
                raise
        except NotADirectoryError:
            if format and "tar" in format:
                # some old tarballs might fail to be unpacked by shutil.unpack_archive,
                # fallback using the tar command as last resort
                _unpack_tar(tarpath, dest)
            else:
                raise
    
        normalize_permissions(dest)
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment