bpo-35652: shutil.copytree(copy_function=...) erroneously pass DirEntry instead of path str (GH-11997)

This commit is contained in:
Giampaolo Rodola 2019-02-26 12:04:41 +01:00 committed by GitHub
parent d5a551c269
commit c606a9cbd4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 1 deletions

View File

@ -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:

View File

@ -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):

View File

@ -0,0 +1,2 @@
shutil.copytree(copy_function=...) erroneously pass DirEntry instead of a
path string.