File size: 1,412 Bytes
72268ee |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
"""
Exception-compatible adapter from conda_package_streaming.
"""
from __future__ import annotations
from tarfile import TarError
from zipfile import BadZipFile
from conda_package_streaming.extract import exceptions as cps_exceptions
from conda_package_streaming.extract import extract_stream, package_streaming
from . import exceptions
def _extract(filename: str, dest_dir: str, components: list[str]):
"""
Extract .conda or .tar.bz2 package to dest_dir.
If it's a conda package, components may be ["pkg", "info"]
If it's a .tar.bz2 package, components must equal ["pkg"]
Internal. Skip directly to conda-package-streaming if you don't need
exception compatibility.
"""
if str(filename).endswith(".tar.bz2"):
assert components == ["pkg"]
try:
with open(filename, "rb") as fileobj:
for component in components:
# will parse zipfile twice
stream = package_streaming.stream_conda_component(
filename, fileobj, component=component
)
extract_stream(stream, dest_dir)
except cps_exceptions.CaseInsensitiveFileSystemError as e:
raise exceptions.CaseInsensitiveFileSystemError(filename, dest_dir) from e
except (OSError, TarError, BadZipFile) as e:
raise exceptions.InvalidArchiveError(filename, f"failed with error: {str(e)}") from e
|