gh-86943: implement `pathlib.WindowsPath.is_mount()` (GH-31458)

Have `pathlib.WindowsPath.is_mount()` call `ntpath.ismount()`. Previously it raised `NotImplementedError` unconditionally.


https://bugs.python.org/issue42777
This commit is contained in:
Barney Gale 2022-08-05 23:37:44 +01:00 committed by GitHub
parent a302a27489
commit 29650fea96
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 14 additions and 24 deletions

View File

@ -876,10 +876,15 @@ call fails (for example because the path doesn't exist).
function checks whether *path*'s parent, :file:`path/..`, is on a different
device than *path*, or whether :file:`path/..` and *path* point to the same
i-node on the same device --- this should detect mount points for all Unix
and POSIX variants. Not implemented on Windows.
and POSIX variants. On Windows, a mount point is considered to be a drive
letter root (e.g. ``c:\``), a UNC share (e.g. ``\\server\share``), or a
mounted filesystem directory.
.. versionadded:: 3.7
.. versionchanged:: 3.12
Windows support was added.
.. method:: Path.is_symlink()

View File

@ -1211,23 +1211,9 @@ class Path(PurePath):
def is_mount(self):
"""
Check if this path is a POSIX mount point
Check if this path is a mount point
"""
# Need to exist and be a dir
if not self.exists() or not self.is_dir():
return False
try:
parent_dev = self.parent.stat().st_dev
except OSError:
return False
dev = self.stat().st_dev
if dev != parent_dev:
return True
ino = self.stat().st_ino
parent_ino = self.parent.stat().st_ino
return ino == parent_ino
return self._flavour.pathmod.ismount(self)
def is_symlink(self):
"""
@ -1378,6 +1364,3 @@ class WindowsPath(Path, PureWindowsPath):
On a Windows system, instantiating a Path should return this object.
"""
__slots__ = ()
def is_mount(self):
raise NotImplementedError("Path.is_mount() is unsupported on this system")

View File

@ -2294,10 +2294,12 @@ class _BasePathTest(object):
self.assertIs((P / 'fileA\udfff').is_file(), False)
self.assertIs((P / 'fileA\x00').is_file(), False)
@only_posix
def test_is_mount(self):
P = self.cls(BASE)
R = self.cls('/') # TODO: Work out Windows.
if os.name == 'nt':
R = self.cls('c:\\')
else:
R = self.cls('/')
self.assertFalse((P / 'fileA').is_mount())
self.assertFalse((P / 'dirA').is_mount())
self.assertFalse((P / 'non-existing').is_mount())
@ -2305,8 +2307,7 @@ class _BasePathTest(object):
self.assertTrue(R.is_mount())
if os_helper.can_symlink():
self.assertFalse((P / 'linkA').is_mount())
self.assertIs(self.cls('/\udfff').is_mount(), False)
self.assertIs(self.cls('/\x00').is_mount(), False)
self.assertIs((R / '\udfff').is_mount(), False)
def test_is_symlink(self):
P = self.cls(BASE)

View File

@ -0,0 +1 @@
Implement :meth:`pathlib.Path.is_mount` for Windows paths.