diff options
author | Petr Viktorin <encukou@gmail.com> | 2023-04-24 08:58:06 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-24 08:58:06 (GMT) |
commit | af530469954e8ad49f1e071ef31c844b9bfda414 (patch) | |
tree | b25ee06655322d64286f8eb9736295f12d8635e7 /Lib/shutil.py | |
parent | 36860134a9eda8df5af5a38d6c7533437c594c2f (diff) | |
download | cpython-af530469954e8ad49f1e071ef31c844b9bfda414.zip cpython-af530469954e8ad49f1e071ef31c844b9bfda414.tar.gz cpython-af530469954e8ad49f1e071ef31c844b9bfda414.tar.bz2 |
gh-102950: Implement PEP 706 – Filter for tarfile.extractall (#102953)
Diffstat (limited to 'Lib/shutil.py')
-rw-r--r-- | Lib/shutil.py | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/Lib/shutil.py b/Lib/shutil.py index 95b6c52..c75ea4d 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -1245,7 +1245,7 @@ def _unpack_zipfile(filename, extract_dir): finally: zip.close() -def _unpack_tarfile(filename, extract_dir): +def _unpack_tarfile(filename, extract_dir, *, filter=None): """Unpack tar/tar.gz/tar.bz2/tar.xz `filename` to `extract_dir` """ import tarfile # late import for breaking circular dependency @@ -1255,7 +1255,7 @@ def _unpack_tarfile(filename, extract_dir): raise ReadError( "%s is not a compressed or uncompressed tar file" % filename) try: - tarobj.extractall(extract_dir) + tarobj.extractall(extract_dir, filter=filter) finally: tarobj.close() @@ -1288,7 +1288,7 @@ def _find_unpack_format(filename): return name return None -def unpack_archive(filename, extract_dir=None, format=None): +def unpack_archive(filename, extract_dir=None, format=None, *, filter=None): """Unpack an archive. `filename` is the name of the archive. @@ -1302,6 +1302,9 @@ def unpack_archive(filename, extract_dir=None, format=None): was registered for that extension. In case none is found, a ValueError is raised. + + If `filter` is given, it is passed to the underlying + extraction function. """ sys.audit("shutil.unpack_archive", filename, extract_dir, format) @@ -1311,6 +1314,10 @@ def unpack_archive(filename, extract_dir=None, format=None): extract_dir = os.fspath(extract_dir) filename = os.fspath(filename) + if filter is None: + filter_kwargs = {} + else: + filter_kwargs = {'filter': filter} if format is not None: try: format_info = _UNPACK_FORMATS[format] @@ -1318,7 +1325,7 @@ def unpack_archive(filename, extract_dir=None, format=None): raise ValueError("Unknown unpack format '{0}'".format(format)) from None func = format_info[1] - func(filename, extract_dir, **dict(format_info[2])) + func(filename, extract_dir, **dict(format_info[2]), **filter_kwargs) else: # we need to look at the registered unpackers supported extensions format = _find_unpack_format(filename) @@ -1326,7 +1333,7 @@ def unpack_archive(filename, extract_dir=None, format=None): raise ReadError("Unknown archive format '{0}'".format(filename)) func = _UNPACK_FORMATS[format][1] - kwargs = dict(_UNPACK_FORMATS[format][2]) + kwargs = dict(_UNPACK_FORMATS[format][2]) | filter_kwargs func(filename, extract_dir, **kwargs) |