(original) (raw)
changeset: 100714:eb91d0387d59 user: Victor Stinner victor.stinner@gmail.com date: Thu Mar 24 12:23:18 2016 +0100 files: Lib/os.py description: Enhance os._DummyDirEntry Issue #25911: * Try to fix test_os.BytesWalkTests on Windows * Try to mimick better the reference os.DirEntry on Windows * _DummyDirEntry now caches os.stat() result * _DummyDirEntry constructor now tries to get os.stat() diff -r 73f477dddcff -r eb91d0387d59 Lib/os.py --- a/Lib/os.py Thu Mar 24 12:04:15 2016 +0100 +++ b/Lib/os.py Thu Mar 24 12:23:18 2016 +0100 @@ -439,15 +439,36 @@ yield top, dirs, nondirs class _DummyDirEntry: + """Dummy implementation of DirEntry + + Only used internally by os.walk(bytes). Since os.walk() doesn't need the + follow_symlinks parameter: don't implement it, always follow symbolic + links. + """ + def __init__(self, dir, name): self.name = name self.path = path.join(dir, name) + # Mimick FindFirstFile/FindNextFile: we should get file attributes + # while iterating on a directory + self._stat = None + try: + self.stat() + except OSError: + pass + + def stat(self): + if self._stat is None: + self._stat = stat(self.path) + return self._stat def is_dir(self): - return path.isdir(self.path) + stat = self.stat() + return st.S_ISDIR(stat.st_mode) def is_symlink(self): - return path.islink(self.path) + stat = self.stat() + return st.S_ISLNK(stat.st_mode) class _dummy_scandir: # listdir-based implementation for bytes patches on Windows /victor.stinner@gmail.com