summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2019-02-26 11:04:41 (GMT)
committerGitHub <noreply@github.com>2019-02-26 11:04:41 (GMT)
commitc606a9cbd48f69d3f4a09204c781dda9864218b7 (patch)
treea2847d175dac2288dff7541eeba3ff4b3737a169
parentd5a551c2694e32835bcdafc01d611f3227ca36b3 (diff)
downloadcpython-c606a9cbd48f69d3f4a09204c781dda9864218b7.zip
cpython-c606a9cbd48f69d3f4a09204c781dda9864218b7.tar.gz
cpython-c606a9cbd48f69d3f4a09204c781dda9864218b7.tar.bz2
bpo-35652: shutil.copytree(copy_function=...) erroneously pass DirEntry instead of path str (GH-11997)
-rw-r--r--Lib/shutil.py2
-rw-r--r--Lib/test/test_shutil.py18
-rw-r--r--Misc/NEWS.d/next/Library/2019-02-26-11-34-44.bpo-35652.6KRJu_.rst2
3 files changed, 21 insertions, 1 deletions
diff --git a/Lib/shutil.py b/Lib/shutil.py
index 1f98a34..9b50c2a 100644
--- a/Lib/shutil.py
+++ b/Lib/shutil.py
@@ -472,7 +472,7 @@ def _copytree(entries, src, dst, symlinks, ignore, copy_function,
dirs_exist_ok=dirs_exist_ok)
else:
# 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
# continue with other files
except Error as err:
diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py
index ceafaed..678a190 100644
--- a/Lib/test/test_shutil.py
+++ b/Lib/test/test_shutil.py
@@ -859,6 +859,24 @@ class TestShutil(unittest.TestCase):
with self.assertRaises(shutil.Error):
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.skipUnless(hasattr(os, 'link'), 'requires os.link')
def test_dont_copy_file_onto_link_to_itself(self):
diff --git a/Misc/NEWS.d/next/Library/2019-02-26-11-34-44.bpo-35652.6KRJu_.rst b/Misc/NEWS.d/next/Library/2019-02-26-11-34-44.bpo-35652.6KRJu_.rst
new file mode 100644
index 0000000..c247e17
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-02-26-11-34-44.bpo-35652.6KRJu_.rst
@@ -0,0 +1,2 @@
+shutil.copytree(copy_function=...) erroneously pass DirEntry instead of a
+path string.