bpo-35652: shutil.copytree(copy_function=...) erroneously pass DirEntry instead of path str (GH-11997)
This commit is contained in:
parent
d5a551c269
commit
c606a9cbd4
|
@ -472,7 +472,7 @@ def _copytree(entries, src, dst, symlinks, ignore, copy_function,
|
||||||
dirs_exist_ok=dirs_exist_ok)
|
dirs_exist_ok=dirs_exist_ok)
|
||||||
else:
|
else:
|
||||||
# Will raise a SpecialFileError for unsupported file types
|
# Will raise a SpecialFileError for unsupported file types
|
||||||
copy_function(srcentry, dstname)
|
copy_function(srcobj, dstname)
|
||||||
# catch the Error from the recursive copytree so that we can
|
# catch the Error from the recursive copytree so that we can
|
||||||
# continue with other files
|
# continue with other files
|
||||||
except Error as err:
|
except Error as err:
|
||||||
|
|
|
@ -859,6 +859,24 @@ class TestShutil(unittest.TestCase):
|
||||||
with self.assertRaises(shutil.Error):
|
with self.assertRaises(shutil.Error):
|
||||||
shutil.copytree(src_dir, dst_dir)
|
shutil.copytree(src_dir, dst_dir)
|
||||||
|
|
||||||
|
def test_copytree_custom_copy_function(self):
|
||||||
|
# See: https://bugs.python.org/issue35648
|
||||||
|
def custom_cpfun(a, b):
|
||||||
|
flag.append(None)
|
||||||
|
self.assertIsInstance(a, str)
|
||||||
|
self.assertIsInstance(b, str)
|
||||||
|
self.assertEqual(a, os.path.join(src, 'foo'))
|
||||||
|
self.assertEqual(b, os.path.join(dst, 'foo'))
|
||||||
|
|
||||||
|
flag = []
|
||||||
|
src = tempfile.mkdtemp()
|
||||||
|
dst = tempfile.mktemp()
|
||||||
|
self.addCleanup(shutil.rmtree, src)
|
||||||
|
with open(os.path.join(src, 'foo'), 'w') as f:
|
||||||
|
f.close()
|
||||||
|
shutil.copytree(src, dst, copy_function=custom_cpfun)
|
||||||
|
self.assertEqual(len(flag), 1)
|
||||||
|
|
||||||
@unittest.skipIf(os.name == 'nt', 'temporarily disabled on Windows')
|
@unittest.skipIf(os.name == 'nt', 'temporarily disabled on Windows')
|
||||||
@unittest.skipUnless(hasattr(os, 'link'), 'requires os.link')
|
@unittest.skipUnless(hasattr(os, 'link'), 'requires os.link')
|
||||||
def test_dont_copy_file_onto_link_to_itself(self):
|
def test_dont_copy_file_onto_link_to_itself(self):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
shutil.copytree(copy_function=...) erroneously pass DirEntry instead of a
|
||||||
|
path string.
|
Loading…
Reference in New Issue