|
""" |
|
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: |
|
|
|
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 |
|
|