Skip to content

Commit

Permalink
Issue python#27998: Removed workarounds for supporting bytes paths on…
Browse files Browse the repository at this point in the history
… Windows in

os.walk() function and glob module since os.scandir() now directly supports
them.
  • Loading branch information
serhiy-storchaka committed Oct 5, 2016
1 parent fae2829 commit 3ae4155
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 83 deletions.
23 changes: 7 additions & 16 deletions Lib/glob.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,22 +118,13 @@ def _iterdir(dirname, dironly):
else:
dirname = os.curdir
try:
if os.name == 'nt' and isinstance(dirname, bytes):
names = os.listdir(dirname)
if dironly:
for name in names:
if os.path.isdir(os.path.join(dirname, name)):
yield name
else:
yield from names
else:
with os.scandir(dirname) as it:
for entry in it:
try:
if not dironly or entry.is_dir():
yield entry.name
except OSError:
pass
with os.scandir(dirname) as it:
for entry in it:
try:
if not dironly or entry.is_dir():
yield entry.name
except OSError:
pass
except OSError:
return

Expand Down
70 changes: 3 additions & 67 deletions Lib/os.py
Original file line number Diff line number Diff line change
Expand Up @@ -343,12 +343,9 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
# minor reason when (say) a thousand readable directories are still
# left to visit. That logic is copied here.
try:
if name == 'nt' and isinstance(top, bytes):
scandir_it = _dummy_scandir(top)
else:
# Note that scandir is global in this module due
# to earlier import-*.
scandir_it = scandir(top)
# Note that scandir is global in this module due
# to earlier import-*.
scandir_it = scandir(top)
except OSError as error:
if onerror is not None:
onerror(error)
Expand Down Expand Up @@ -417,67 +414,6 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
# Yield after recursion if going bottom up
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
self._lstat = None
try:
self.stat(follow_symlinks=False)
except OSError:
pass

def stat(self, *, follow_symlinks=True):
if follow_symlinks:
if self._stat is None:
self._stat = stat(self.path)
return self._stat
else:
if self._lstat is None:
self._lstat = stat(self.path, follow_symlinks=False)
return self._lstat

def is_dir(self):
if self._lstat is not None and not self.is_symlink():
# use the cache lstat
stat = self.stat(follow_symlinks=False)
return st.S_ISDIR(stat.st_mode)

stat = self.stat()
return st.S_ISDIR(stat.st_mode)

def is_symlink(self):
stat = self.stat(follow_symlinks=False)
return st.S_ISLNK(stat.st_mode)

class _dummy_scandir:
# listdir-based implementation for bytes patches on Windows
def __init__(self, dir):
self.dir = dir
self.it = iter(listdir(dir))

def __iter__(self):
return self

def __next__(self):
return _DummyDirEntry(self.dir, next(self.it))

def __enter__(self):
return self

def __exit__(self, *args):
self.it = iter(())

__all__.append("walk")

if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
Expand Down

0 comments on commit 3ae4155

Please sign in to comment.