From: Martin v. Löwis Date: Sun, 30 Jul 2006 13:00:31 +0000 (+0000) Subject: Don't copy directory stat times in shutil.copytree on Windows X-Git-Tag: v2.5b3~49 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e67838d6c16d3ab14b01ffdb1318aa16ed9bccf;p=python Don't copy directory stat times in shutil.copytree on Windows Fixes #1525866. --- diff --git a/Lib/shutil.py b/Lib/shutil.py index c50184c733..c3ff687bff 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -127,7 +127,13 @@ def copytree(src, dst, symlinks=False): # continue with other files except Error, err: errors.extend(err.args[0]) - copystat(src, dst) + try: + copystat(src, dst) + except WindowsError: + # can't copy file access times on Windows + pass + except OSError, why: + errors.extend((src, dst, str(why))) if errors: raise Error, errors diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 6ab5a35ef9..79da53814d 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -74,6 +74,33 @@ class TestShutil(unittest.TestCase): except: pass + + def test_copytree_simple(self): + src_dir = tempfile.mkdtemp() + dst_dir = os.path.join(tempfile.mkdtemp(), 'destination') + open(os.path.join(src_dir, 'test.txt'), 'w').write('123') + os.mkdir(os.path.join(src_dir, 'test_dir')) + open(os.path.join(src_dir, 'test_dir', 'test.txt'), 'w').write('456') + # + try: + shutil.copytree(src_dir, dst_dir) + self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test.txt'))) + self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'test_dir'))) + self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test_dir', 'test.txt'))) + self.assertEqual(open(os.path.join(dst_dir, 'test.txt')).read(), '123') + self.assertEqual(open(os.path.join(dst_dir, 'test_dir', 'test.txt')).read(), '456') + finally: + try: + os.remove(os.path.join(src_dir, 'test.txt')) + os.remove(os.path.join(dst_dir, 'test.txt')) + os.remove(os.path.join(src_dir, 'test_dir', 'test.txt')) + os.remove(os.path.join(dst_dir, 'test_dir', 'test.txt')) + os.removedirs(src_dir) + os.removedirs(dst_dir) + except: + pass + + if hasattr(os, "symlink"): def test_dont_copy_file_onto_link_to_itself(self): # bug 851123. diff --git a/Misc/NEWS b/Misc/NEWS index ca5f5c8d9f..dec5a2c0d5 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -61,6 +61,9 @@ Core and builtins Library ------- +- Bug #1525866: Don't copy directory stat times in + shutil.copytree on Windows + - Bug #1002398: The documentation for os.path.sameopenfile now correctly refers to file descriptors, not file objects.