This commit is contained in:
lz_db
2026-10-16 22:48:30 +08:00
parent 190de72571
commit 0b36fd3383
3161 changed files with 12787 additions and 77274 deletions
@@ -1,24 +1,18 @@
"""Utilities for extracting common archive formats"""
import contextlib
import os
import posixpath
import shutil
import tarfile
import zipfile
import tarfile
import os
import shutil
import posixpath
import contextlib
from distutils.errors import DistutilsError
from ._path import ensure_directory
from distutils.errors import DistutilsError
__all__ = [
"unpack_archive",
"unpack_zipfile",
"unpack_tarfile",
"default_filter",
"UnrecognizedFormat",
"extraction_drivers",
"unpack_directory",
"unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter",
"UnrecognizedFormat", "extraction_drivers", "unpack_directory",
]
@@ -32,8 +26,8 @@ def default_filter(src, dst):
def unpack_archive(
filename, extract_dir, progress_filter=default_filter, drivers=None
) -> None:
filename, extract_dir, progress_filter=default_filter,
drivers=None):
"""Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat``
`progress_filter` is a function taking two arguments: a source path
@@ -62,16 +56,18 @@ def unpack_archive(
else:
return
else:
raise UnrecognizedFormat(f"Not a recognized archive type: {filename}")
raise UnrecognizedFormat(
"Not a recognized archive type: %s" % filename
)
def unpack_directory(filename, extract_dir, progress_filter=default_filter) -> None:
""" "Unpack" a directory, using the same interface as for archives
def unpack_directory(filename, extract_dir, progress_filter=default_filter):
""""Unpack" a directory, using the same interface as for archives
Raises ``UnrecognizedFormat`` if `filename` is not a directory
"""
if not os.path.isdir(filename):
raise UnrecognizedFormat(f"{filename} is not a directory")
raise UnrecognizedFormat("%s is not a directory" % filename)
paths = {
filename: ('', extract_dir),
@@ -92,7 +88,7 @@ def unpack_directory(filename, extract_dir, progress_filter=default_filter) -> N
shutil.copystat(f, target)
def unpack_zipfile(filename, extract_dir, progress_filter=default_filter) -> None:
def unpack_zipfile(filename, extract_dir, progress_filter=default_filter):
"""Unpack zip `filename` to `extract_dir`
Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined
@@ -101,7 +97,7 @@ def unpack_zipfile(filename, extract_dir, progress_filter=default_filter) -> Non
"""
if not zipfile.is_zipfile(filename):
raise UnrecognizedFormat(f"{filename} is not a zip file")
raise UnrecognizedFormat("%s is not a zip file" % (filename,))
with zipfile.ZipFile(filename) as z:
_unpack_zipfile_obj(z, extract_dir, progress_filter)
@@ -140,8 +136,7 @@ def _unpack_zipfile_obj(zipfile_obj, extract_dir, progress_filter=default_filter
def _resolve_tar_file_or_dir(tar_obj, tar_member_obj):
"""Resolve any links and extract link targets as normal files."""
while tar_member_obj is not None and (
tar_member_obj.islnk() or tar_member_obj.issym()
):
tar_member_obj.islnk() or tar_member_obj.issym()):
linkpath = tar_member_obj.linkname
if tar_member_obj.issym():
base = posixpath.dirname(tar_member_obj.name)
@@ -149,8 +144,9 @@ def _resolve_tar_file_or_dir(tar_obj, tar_member_obj):
linkpath = posixpath.normpath(linkpath)
tar_member_obj = tar_obj._getmember(linkpath)
is_file_or_dir = tar_member_obj is not None and (
tar_member_obj.isfile() or tar_member_obj.isdir()
is_file_or_dir = (
tar_member_obj is not None and
(tar_member_obj.isfile() or tar_member_obj.isdir())
)
if is_file_or_dir:
return tar_member_obj
@@ -187,7 +183,7 @@ def _iter_open_tar(tar_obj, extract_dir, progress_filter):
yield member, final_dst
def unpack_tarfile(filename, extract_dir, progress_filter=default_filter) -> bool:
def unpack_tarfile(filename, extract_dir, progress_filter=default_filter):
"""Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`
Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined
@@ -198,13 +194,11 @@ def unpack_tarfile(filename, extract_dir, progress_filter=default_filter) -> boo
tarobj = tarfile.open(filename)
except tarfile.TarError as e:
raise UnrecognizedFormat(
f"{filename} is not a compressed or uncompressed tar file"
"%s is not a compressed or uncompressed tar file" % (filename,)
) from e
for member, final_dst in _iter_open_tar(
tarobj,
extract_dir,
progress_filter,
tarobj, extract_dir, progress_filter,
):
try:
# XXX Ugh