Source code for swh.loader.mercurial.archive_extract

# Copyright (C) 2017-2018  The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information

import os
import shutil
import tempfile

import patoolib


[docs] def tmp_extract(archive, dir=None, prefix=None, suffix=None, log=None, source=None): """Extract an archive to a temporary location with optional logs. Args: archive (string): Absolute path of the archive to be extracted prefix (string): Optional modifier to the temporary storage directory name. (I guess in case something goes wrong and you want to go look?) log (python logging instance): Optional for recording extractions. source (string): Optional source URL of the archive for adding to log messages. Returns: A context manager for a temporary directory that automatically removes itself. See: help(tempfile.TemporaryDirectory) """ logstr = "From %s - " % source if log and source else "" if dir and not os.path.exists(dir): os.makedirs(dir, exist_ok=True) archive_base = os.path.basename(archive) if archive_base[0] == ".": package = "." + archive_base.split(".")[1] else: package = archive_base.split(".")[0] tmpdir = tempfile.mkdtemp(dir=dir, prefix=prefix, suffix=suffix) repo_path = os.path.join(tmpdir, package) try: patoolib.extract_archive(archive, interactive=False, outdir=tmpdir) except Exception as e: if os.path.exists(tmpdir): shutil.rmtree(tmpdir) msg = "%sFailed to uncompress archive %s at %s - %s" % ( logstr, archive_base, repo_path, e, ) raise ValueError(msg) if log: log.info("%sUncompressing archive %s at %s" % (logstr, archive_base, repo_path)) return tmpdir