Issue #25860: os.fwalk() no longer skips remaining directories when error occurs.

Original patch by Samson Lee.
This commit is contained in:
Serhiy Storchaka 2015-12-23 00:09:01 +02:00
commit 345e78e566
3 changed files with 24 additions and 12 deletions

View file

@ -514,7 +514,7 @@ if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
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)

View file

@ -790,12 +790,8 @@ class WalkTests(unittest.TestCase):
# 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 @@ class WalkTests(unittest.TestCase):
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)

View file

@ -115,6 +115,9 @@ Core and Builtins
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.