[Python-checkins] cpython: Enhance os._DummyDirEntry

victor.stinner python-checkins at python.org
Thu Mar 24 07:36:16 EDT 2016


https://hg.python.org/cpython/rev/eb91d0387d59
changeset:   100714:eb91d0387d59
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Thu Mar 24 12:23:18 2016 +0100
summary:
  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()

files:
  Lib/os.py |  25 +++++++++++++++++++++++--
  1 files changed, 23 insertions(+), 2 deletions(-)


diff --git a/Lib/os.py b/Lib/os.py
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -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

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list