mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
GH-73991: Support preserving metadata in pathlib.Path.copytree()
(#121438)
Add *preserve_metadata* keyword-only argument to `pathlib.Path.copytree()`, defaulting to false. When set to true, we copy timestamps, permissions, extended attributes and flags where available, like `shutil.copystat()`.
This commit is contained in:
parent
094375b9b7
commit
c4c7097e64
3 changed files with 45 additions and 3 deletions
|
@ -835,7 +835,8 @@ class PathBase(PurePathBase):
|
|||
if preserve_metadata:
|
||||
self._copy_metadata(target)
|
||||
|
||||
def copytree(self, target, *, follow_symlinks=True, dirs_exist_ok=False,
|
||||
def copytree(self, target, *, follow_symlinks=True,
|
||||
preserve_metadata=False, dirs_exist_ok=False,
|
||||
ignore=None, on_error=None):
|
||||
"""
|
||||
Recursively copy this directory tree to the given destination.
|
||||
|
@ -851,6 +852,8 @@ class PathBase(PurePathBase):
|
|||
try:
|
||||
sources = source_dir.iterdir()
|
||||
target_dir.mkdir(exist_ok=dirs_exist_ok)
|
||||
if preserve_metadata:
|
||||
source_dir._copy_metadata(target_dir)
|
||||
for source in sources:
|
||||
if ignore and ignore(source):
|
||||
continue
|
||||
|
@ -859,7 +862,8 @@ class PathBase(PurePathBase):
|
|||
stack.append((source, target_dir.joinpath(source.name)))
|
||||
else:
|
||||
source.copy(target_dir.joinpath(source.name),
|
||||
follow_symlinks=follow_symlinks)
|
||||
follow_symlinks=follow_symlinks,
|
||||
preserve_metadata=preserve_metadata)
|
||||
except OSError as err:
|
||||
on_error(err)
|
||||
except OSError as err:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue