gh-117114: Make os.path.isdevdrive available on all platforms (GH-117115)

This commit is contained in:
Nice Zombies 2024-03-25 23:55:11 +01:00 committed by GitHub
parent c2276176d5
commit 0821923aa9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 39 additions and 57 deletions

View File

@ -4,7 +4,7 @@
.. module:: os.path .. module:: os.path
:synopsis: Operations on pathnames. :synopsis: Operations on pathnames.
**Source code:** :source:`Lib/posixpath.py` (for POSIX) and **Source code:** :source:`Lib/genericpath.py`, :source:`Lib/posixpath.py` (for POSIX) and
:source:`Lib/ntpath.py` (for Windows). :source:`Lib/ntpath.py` (for Windows).
.. index:: single: path; operations .. index:: single: path; operations
@ -85,8 +85,6 @@ the :mod:`glob` module.)
if *paths* is empty. Unlike :func:`commonprefix`, this returns a if *paths* is empty. Unlike :func:`commonprefix`, this returns a
valid path. valid path.
.. availability:: Unix, Windows.
.. versionadded:: 3.5 .. versionadded:: 3.5
.. versionchanged:: 3.6 .. versionchanged:: 3.6
@ -324,10 +322,11 @@ the :mod:`glob` module.)
Dev Drives. See `the Windows documentation <https://learn.microsoft.com/windows/dev-drive/>`_ Dev Drives. See `the Windows documentation <https://learn.microsoft.com/windows/dev-drive/>`_
for information on enabling and creating Dev Drives. for information on enabling and creating Dev Drives.
.. availability:: Windows.
.. versionadded:: 3.12 .. versionadded:: 3.12
.. versionchanged:: 3.13
The function is now available on all platforms, and will always return ``False`` on those that have no support for Dev Drives
.. function:: isreserved(path) .. function:: isreserved(path)
@ -442,8 +441,6 @@ the :mod:`glob` module.)
*start* defaults to :data:`os.curdir`. *start* defaults to :data:`os.curdir`.
.. availability:: Unix, Windows.
.. versionchanged:: 3.6 .. versionchanged:: 3.6
Accepts a :term:`path-like object`. Accepts a :term:`path-like object`.
@ -454,8 +451,6 @@ the :mod:`glob` module.)
This is determined by the device number and i-node number and raises an This is determined by the device number and i-node number and raises an
exception if an :func:`os.stat` call on either pathname fails. exception if an :func:`os.stat` call on either pathname fails.
.. availability:: Unix, Windows.
.. versionchanged:: 3.2 .. versionchanged:: 3.2
Added Windows support. Added Windows support.
@ -470,8 +465,6 @@ the :mod:`glob` module.)
Return ``True`` if the file descriptors *fp1* and *fp2* refer to the same file. Return ``True`` if the file descriptors *fp1* and *fp2* refer to the same file.
.. availability:: Unix, Windows.
.. versionchanged:: 3.2 .. versionchanged:: 3.2
Added Windows support. Added Windows support.
@ -486,8 +479,6 @@ the :mod:`glob` module.)
:func:`os.lstat`, or :func:`os.stat`. This function implements the :func:`os.lstat`, or :func:`os.stat`. This function implements the
underlying comparison used by :func:`samefile` and :func:`sameopenfile`. underlying comparison used by :func:`samefile` and :func:`sameopenfile`.
.. availability:: Unix, Windows.
.. versionchanged:: 3.4 .. versionchanged:: 3.4
Added Windows support. Added Windows support.

View File

@ -7,8 +7,8 @@ import os
import stat import stat
__all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime', __all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime',
'getsize', 'isdir', 'isfile', 'islink', 'samefile', 'sameopenfile', 'getsize', 'isdevdrive', 'isdir', 'isfile', 'isjunction', 'islink',
'samestat'] 'lexists', 'samefile', 'sameopenfile', 'samestat']
# Does a path exist? # Does a path exist?
@ -22,6 +22,15 @@ def exists(path):
return True return True
# Being true for dangling symbolic links is also useful.
def lexists(path):
"""Test whether a path exists. Returns True for broken symbolic links"""
try:
os.lstat(path)
except (OSError, ValueError):
return False
return True
# This follows symbolic links, so both islink() and isdir() can be true # This follows symbolic links, so both islink() and isdir() can be true
# for the same path on systems that support symlinks # for the same path on systems that support symlinks
def isfile(path): def isfile(path):
@ -57,6 +66,21 @@ def islink(path):
return stat.S_ISLNK(st.st_mode) return stat.S_ISLNK(st.st_mode)
# Is a path a junction?
def isjunction(path):
"""Test whether a path is a junction
Junctions are not supported on the current platform"""
os.fspath(path)
return False
def isdevdrive(path):
"""Determines whether the specified path is on a Windows Dev Drive.
Dev Drives are not supported on the current platform"""
os.fspath(path)
return False
def getsize(filename): def getsize(filename):
"""Return the size of a file, reported by os.stat().""" """Return the size of a file, reported by os.stat()."""
return os.stat(filename).st_size return os.stat(filename).st_size

View File

@ -29,7 +29,8 @@ __all__ = ["normcase","isabs","join","splitdrive","splitroot","split","splitext"
"ismount","isreserved","expanduser","expandvars","normpath", "ismount","isreserved","expanduser","expandvars","normpath",
"abspath","curdir","pardir","sep","pathsep","defpath","altsep", "abspath","curdir","pardir","sep","pathsep","defpath","altsep",
"extsep","devnull","realpath","supports_unicode_filenames","relpath", "extsep","devnull","realpath","supports_unicode_filenames","relpath",
"samefile", "sameopenfile", "samestat", "commonpath", "isjunction"] "samefile", "sameopenfile", "samestat", "commonpath", "isjunction",
"isdevdrive"]
def _get_bothseps(path): def _get_bothseps(path):
if isinstance(path, bytes): if isinstance(path, bytes):
@ -280,22 +281,10 @@ if hasattr(os.stat_result, 'st_reparse_tag'):
return False return False
return bool(st.st_reparse_tag == stat.IO_REPARSE_TAG_MOUNT_POINT) return bool(st.st_reparse_tag == stat.IO_REPARSE_TAG_MOUNT_POINT)
else: else:
def isjunction(path): # Use genericpath.isjunction as imported above
"""Test whether a path is a junction""" pass
os.fspath(path)
return False
# Being true for dangling symbolic links is also useful.
def lexists(path):
"""Test whether a path exists. Returns True for broken symbolic links"""
try:
st = os.lstat(path)
except (OSError, ValueError):
return False
return True
# Is a path a mount point? # Is a path a mount point?
# Any drive letter root (eg c:\) # Any drive letter root (eg c:\)
# Any share UNC (eg \\server\share) # Any share UNC (eg \\server\share)
@ -916,15 +905,12 @@ except ImportError:
try: try:
from nt import _path_isdevdrive from nt import _path_isdevdrive
except ImportError:
def isdevdrive(path):
"""Determines whether the specified path is on a Windows Dev Drive."""
# Never a Dev Drive
return False
else:
def isdevdrive(path): def isdevdrive(path):
"""Determines whether the specified path is on a Windows Dev Drive.""" """Determines whether the specified path is on a Windows Dev Drive."""
try: try:
return _path_isdevdrive(abspath(path)) return _path_isdevdrive(abspath(path))
except OSError: except OSError:
return False return False
except ImportError:
# Use genericpath.isdevdrive as imported above
pass

View File

@ -35,7 +35,7 @@ __all__ = ["normcase","isabs","join","splitdrive","splitroot","split","splitext"
"samefile","sameopenfile","samestat", "samefile","sameopenfile","samestat",
"curdir","pardir","sep","pathsep","defpath","altsep","extsep", "curdir","pardir","sep","pathsep","defpath","altsep","extsep",
"devnull","realpath","supports_unicode_filenames","relpath", "devnull","realpath","supports_unicode_filenames","relpath",
"commonpath", "isjunction"] "commonpath", "isjunction","isdevdrive"]
def _get_sep(path): def _get_sep(path):
@ -187,26 +187,6 @@ def dirname(p):
return head return head
# Is a path a junction?
def isjunction(path):
"""Test whether a path is a junction
Junctions are not a part of posix semantics"""
os.fspath(path)
return False
# Being true for dangling symbolic links is also useful.
def lexists(path):
"""Test whether a path exists. Returns True for broken symbolic links"""
try:
os.lstat(path)
except (OSError, ValueError):
return False
return True
# Is a path a mount point? # Is a path a mount point?
# (Does this work for all UNIXes? Is it even guaranteed to work by Posix?) # (Does this work for all UNIXes? Is it even guaranteed to work by Posix?)

View File

@ -0,0 +1 @@
Make :func:`os.path.isdevdrive` available on all platforms. For those that do not offer Dev Drives, it will always return ``False``.