changeset: 99663:a85675dabb8f parent: 99661:624316fbb39d parent: 99662:767262c149ca user: Serhiy Storchaka date: Wed Dec 23 00:09:01 2015 +0200 files: Lib/test/test_os.py Misc/NEWS description: Issue #25860: os.fwalk() no longer skips remaining directories when error occurs. Original patch by Samson Lee. diff -r 624316fbb39d -r a85675dabb8f Lib/os.py --- a/Lib/os.py Tue Dec 22 08:22:05 2015 +0200 +++ b/Lib/os.py Wed Dec 23 00:09:01 2015 +0200 @@ -514,7 +514,7 @@ except OSError as err: if onerror is not None: onerror(err) - return + continue try: if follow_symlinks or path.samestat(orig_st, stat(dirfd)): dirpath = path.join(toppath, name) diff -r 624316fbb39d -r a85675dabb8f Lib/test/test_os.py --- a/Lib/test/test_os.py Tue Dec 22 08:22:05 2015 +0200 +++ b/Lib/test/test_os.py Wed Dec 23 00:09:01 2015 +0200 @@ -790,12 +790,8 @@ # Wrapper to hide minor differences between os.walk and os.fwalk # to tests both functions with the same code base - def walk(self, directory, topdown=True, follow_symlinks=False): - walk_it = os.walk(directory, - topdown=topdown, - followlinks=follow_symlinks) - for root, dirs, files in walk_it: - yield (root, dirs, files) + def walk(self, directory, **kwargs): + return os.walk(directory, **kwargs) def setUp(self): join = os.path.join @@ -925,16 +921,29 @@ os.remove(dirname) os.rmdir(support.TESTFN) + def test_walk_bad_dir(self): + # Walk top-down. + errors = [] + walk_it = self.walk(self.walk_path, onerror=errors.append) + root, dirs, files = next(walk_it) + self.assertFalse(errors) + dir1 = dirs[0] + dir1new = dir1 + '.new' + os.rename(os.path.join(root, dir1), os.path.join(root, dir1new)) + roots = [r for r, d, f in walk_it] + self.assertTrue(errors) + self.assertNotIn(os.path.join(root, dir1), roots) + self.assertNotIn(os.path.join(root, dir1new), roots) + for dir2 in dirs[1:]: + self.assertIn(os.path.join(root, dir2), roots) + @unittest.skipUnless(hasattr(os, 'fwalk'), "Test needs os.fwalk()") class FwalkTests(WalkTests): """Tests for os.fwalk().""" - def walk(self, directory, topdown=True, follow_symlinks=False): - walk_it = os.fwalk(directory, - topdown=topdown, - follow_symlinks=follow_symlinks) - for root, dirs, files, root_fd in walk_it: + def walk(self, directory, **kwargs): + for root, dirs, files, root_fd in os.fwalk(directory, **kwargs): yield (root, dirs, files) diff -r 624316fbb39d -r a85675dabb8f Misc/NEWS --- a/Misc/NEWS Tue Dec 22 08:22:05 2015 +0200 +++ b/Misc/NEWS Wed Dec 23 00:09:01 2015 +0200 @@ -115,6 +115,9 @@ Library ------- +- Issue #25860: os.fwalk() no longer skips remaining directories when error + occurs. Original patch by Samson Lee. + - Issue #25914: Fixed and simplified OrderedDict.__sizeof__. - Issue #25869: Optimized deepcopying ElementTree; it is now 20 times faster.