mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
GH-73991: Add pathlib.Path.copytree()
(#120718)
Add `pathlib.Path.copytree()` method, which recursively copies one directory to another. This differs from `shutil.copytree()` in the following respects: 1. Our method has a *follow_symlinks* argument, whereas shutil's has a *symlinks* argument with an inverted meaning. 2. Our method lacks something like a *copy_function* argument. It always uses `Path.copy()` to copy files. 3. Our method lacks something like a *ignore_dangling_symlinks* argument. Instead, users can filter out danging symlinks with *ignore*, or ignore exceptions with *on_error* 4. Our *ignore* argument is a callable that accepts a single path object, whereas shutil's accepts a path and a list of child filenames. 5. We add an *on_error* argument, which is a callable that accepts an `OSError` instance. (`Path.walk()` also accepts such a callable). Co-authored-by: Nice Zombies <nineteendo19d0@gmail.com>
This commit is contained in:
parent
bc37ac7b44
commit
35e998f560
6 changed files with 231 additions and 0 deletions
|
@ -653,6 +653,19 @@ class PathTest(test_pathlib_abc.DummyPathTest, PurePathTest):
|
|||
self.assertIsInstance(f, io.RawIOBase)
|
||||
self.assertEqual(f.read().strip(), b"this is file A")
|
||||
|
||||
@unittest.skipIf(sys.platform == "win32" or sys.platform == "wasi", "directories are always readable on Windows and WASI")
|
||||
def test_copytree_no_read_permission(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'dirE'
|
||||
target = base / 'copyE'
|
||||
self.assertRaises(PermissionError, source.copytree, target)
|
||||
self.assertFalse(target.exists())
|
||||
errors = []
|
||||
source.copytree(target, on_error=errors.append)
|
||||
self.assertEqual(len(errors), 1)
|
||||
self.assertIsInstance(errors[0], PermissionError)
|
||||
self.assertFalse(target.exists())
|
||||
|
||||
def test_resolve_nonexist_relative_issue38671(self):
|
||||
p = self.cls('non', 'exist')
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue