From 2f6fae6e510dba653391cb510a2aca8322eec03b Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Sun, 3 Feb 2019 23:08:18 -0800 Subject: bpo-35692: pathlib no longer raises when checking file and directory existence on drives that are not ready (GH-11746) --- Lib/pathlib.py | 27 ++++++++++++++-------- .../2019-02-02-16-23-57.bpo-35692.cIiiE9.rst | 2 ++ 2 files changed, 20 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2019-02-02-16-23-57.bpo-35692.cIiiE9.rst diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 89dffa5..da32f90 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -37,6 +37,15 @@ __all__ = [ # EBADF - guard agains macOS `stat` throwing EBADF _IGNORED_ERROS = (ENOENT, ENOTDIR, EBADF) +_IGNORED_WINERRORS = ( + 21, # ERROR_NOT_READY - drive exists but is not accessible +) + +def _ignore_error(exception): + return (getattr(exception, 'errno', None) in _IGNORED_ERROS or + getattr(exception, 'winerror', None) in _IGNORED_WINERRORS) + + def _is_wildcard_pattern(pat): # Whether this pattern needs actual matching using fnmatch, or can # be looked up directly as a file. @@ -535,7 +544,7 @@ class _RecursiveWildcardSelector(_Selector): try: entry_is_dir = entry.is_dir() except OSError as e: - if e.errno not in _IGNORED_ERROS: + if not _ignore_error(e): raise if entry_is_dir and not entry.is_symlink(): path = parent_path._make_child_relpath(entry.name) @@ -1328,7 +1337,7 @@ class Path(PurePath): try: self.stat() except OSError as e: - if e.errno not in _IGNORED_ERROS: + if not _ignore_error(e): raise return False except ValueError: @@ -1343,7 +1352,7 @@ class Path(PurePath): try: return S_ISDIR(self.stat().st_mode) except OSError as e: - if e.errno not in _IGNORED_ERROS: + if not _ignore_error(e): raise # Path doesn't exist or is a broken symlink # (see https://bitbucket.org/pitrou/pathlib/issue/12/) @@ -1360,7 +1369,7 @@ class Path(PurePath): try: return S_ISREG(self.stat().st_mode) except OSError as e: - if e.errno not in _IGNORED_ERROS: + if not _ignore_error(e): raise # Path doesn't exist or is a broken symlink # (see https://bitbucket.org/pitrou/pathlib/issue/12/) @@ -1397,7 +1406,7 @@ class Path(PurePath): try: return S_ISLNK(self.lstat().st_mode) except OSError as e: - if e.errno not in _IGNORED_ERROS: + if not _ignore_error(e): raise # Path doesn't exist return False @@ -1412,7 +1421,7 @@ class Path(PurePath): try: return S_ISBLK(self.stat().st_mode) except OSError as e: - if e.errno not in _IGNORED_ERROS: + if not _ignore_error(e): raise # Path doesn't exist or is a broken symlink # (see https://bitbucket.org/pitrou/pathlib/issue/12/) @@ -1428,7 +1437,7 @@ class Path(PurePath): try: return S_ISCHR(self.stat().st_mode) except OSError as e: - if e.errno not in _IGNORED_ERROS: + if not _ignore_error(e): raise # Path doesn't exist or is a broken symlink # (see https://bitbucket.org/pitrou/pathlib/issue/12/) @@ -1444,7 +1453,7 @@ class Path(PurePath): try: return S_ISFIFO(self.stat().st_mode) except OSError as e: - if e.errno not in _IGNORED_ERROS: + if not _ignore_error(e): raise # Path doesn't exist or is a broken symlink # (see https://bitbucket.org/pitrou/pathlib/issue/12/) @@ -1460,7 +1469,7 @@ class Path(PurePath): try: return S_ISSOCK(self.stat().st_mode) except OSError as e: - if e.errno not in _IGNORED_ERROS: + if not _ignore_error(e): raise # Path doesn't exist or is a broken symlink # (see https://bitbucket.org/pitrou/pathlib/issue/12/) diff --git a/Misc/NEWS.d/next/Windows/2019-02-02-16-23-57.bpo-35692.cIiiE9.rst b/Misc/NEWS.d/next/Windows/2019-02-02-16-23-57.bpo-35692.cIiiE9.rst new file mode 100644 index 0000000..f371573 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-02-02-16-23-57.bpo-35692.cIiiE9.rst @@ -0,0 +1,2 @@ +``pathlib`` no longer raises when checking file and directory existence on +drives that are not ready -- cgit v0.12