mirror of https://github.com/python/cpython
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:
parent
a302a27489
commit
29650fea96
|
@ -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()
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Implement :meth:`pathlib.Path.is_mount` for Windows paths.
|
Loading…
Reference in New Issue