]> granicus.if.org Git - python/commitdiff
Issue #1666318: Add a test that shutil.copytree() retains directory permissions.
authorAntoine Pitrou <solipsis@pitrou.net>
Fri, 16 Aug 2013 17:35:02 +0000 (19:35 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Fri, 16 Aug 2013 17:35:02 +0000 (19:35 +0200)
Patch by Catherine Devlin.

Lib/test/test_shutil.py
Misc/NEWS

index acaffdd38c01caa923604a17830a4ad7f076e0a4..9af7da71cbd82e8426c5197589d86c51c1878621 100644 (file)
@@ -726,6 +726,32 @@ class TestShutil(unittest.TestCase):
             shutil.rmtree(src_dir)
             shutil.rmtree(os.path.dirname(dst_dir))
 
+    def test_copytree_retains_permissions(self):
+        tmp_dir = tempfile.mkdtemp()
+        src_dir = os.path.join(tmp_dir, 'source')
+        os.mkdir(src_dir)
+        dst_dir = os.path.join(tmp_dir, 'destination')
+        self.addCleanup(shutil.rmtree, tmp_dir)
+
+        os.chmod(src_dir, 0o777)
+        write_file((src_dir, 'permissive.txt'), '123')
+        os.chmod(os.path.join(src_dir, 'permissive.txt'), 0o777)
+        write_file((src_dir, 'restrictive.txt'), '456')
+        os.chmod(os.path.join(src_dir, 'restrictive.txt'), 0o600)
+        restrictive_subdir = tempfile.mkdtemp(dir=src_dir)
+        os.chmod(restrictive_subdir, 0o600)
+
+        shutil.copytree(src_dir, dst_dir)
+        self.assertEquals(os.stat(src_dir).st_mode, os.stat(dst_dir).st_mode)
+        self.assertEquals(os.stat(os.path.join(src_dir, 'permissive.txt')).st_mode,
+                          os.stat(os.path.join(dst_dir, 'permissive.txt')).st_mode)
+        self.assertEquals(os.stat(os.path.join(src_dir, 'restrictive.txt')).st_mode,
+                          os.stat(os.path.join(dst_dir, 'restrictive.txt')).st_mode)
+        restrictive_subdir_dst = os.path.join(dst_dir,
+                                              os.path.split(restrictive_subdir)[1])
+        self.assertEquals(os.stat(restrictive_subdir).st_mode,
+                          os.stat(restrictive_subdir_dst).st_mode)
+
     @unittest.skipUnless(hasattr(os, 'link'), 'requires os.link')
     def test_dont_copy_file_onto_link_to_itself(self):
         # Temporarily disable test on Windows.
index 0dd2d1099ba4bbe198fe5cd8546921ba32d53c75..f7c5e37004fea619cd60db262f219efa72fb91ff 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -258,6 +258,9 @@ IDLE
 Tests
 -----
 
+- Issue #1666318: Add a test that shutil.copytree() retains directory
+  permissions.  Patch by Catherine Devlin.
+
 - Issue #18357: add tests for dictview set difference.
   Patch by Fraser Tweedale.