[3.8] bpo-38688, shutil.copytree: consume iterator and create list of entries to prevent infinite recursion (GH-17397)
(cherry picked from commit 9bbcbc9f6dfe1368fe7330b117707f828e6a2c18)
Co-authored-by: Bruno P. Kinoshita <kinow@users.noreply.github.com>
diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py
index b98e7dc..286e333 100644
--- a/Lib/test/test_shutil.py
+++ b/Lib/test/test_shutil.py
@@ -1605,6 +1605,18 @@
rv = shutil.copytree(src_dir, dst_dir)
self.assertEqual(['foo'], os.listdir(rv))
+ def test_copytree_subdirectory(self):
+ # copytree where dst is a subdirectory of src, see Issue 38688
+ base_dir = self.mkdtemp()
+ self.addCleanup(shutil.rmtree, base_dir, ignore_errors=True)
+ src_dir = os.path.join(base_dir, "t", "pg")
+ dst_dir = os.path.join(src_dir, "somevendor", "1.0")
+ os.makedirs(src_dir)
+ src = os.path.join(src_dir, 'pol')
+ write_file(src, 'pol')
+ rv = shutil.copytree(src_dir, dst_dir)
+ self.assertEqual(['pol'], os.listdir(rv))
+
class TestWhich(unittest.TestCase):