diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2016-03-24 11:23:18 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2016-03-24 11:23:18 (GMT) |
commit | ba8b0a7db447fad7a7064e53424725b02ab5ccec (patch) | |
tree | 0dcc238644acdfcfe34cf7c42b6d345e62c5903d /Lib/os.py | |
parent | 56db16cd445603f688084d9ace4c271b13e4ec01 (diff) | |
download | cpython-ba8b0a7db447fad7a7064e53424725b02ab5ccec.zip cpython-ba8b0a7db447fad7a7064e53424725b02ab5ccec.tar.gz cpython-ba8b0a7db447fad7a7064e53424725b02ab5ccec.tar.bz2 |
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()
Diffstat (limited to 'Lib/os.py')
-rw-r--r-- | Lib/os.py | 25 |
1 files changed, 23 insertions, 2 deletions
@@ -439,15 +439,36 @@ def walk(top, topdown=True, onerror=None, followlinks=False): 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 |