mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
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
4 changed files with 14 additions and 24 deletions
|
@ -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
|
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
|
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
|
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
|
.. versionadded:: 3.7
|
||||||
|
|
||||||
|
.. versionchanged:: 3.12
|
||||||
|
Windows support was added.
|
||||||
|
|
||||||
|
|
||||||
.. method:: Path.is_symlink()
|
.. method:: Path.is_symlink()
|
||||||
|
|
||||||
|
|
|
@ -1211,23 +1211,9 @@ class Path(PurePath):
|
||||||
|
|
||||||
def is_mount(self):
|
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
|
return self._flavour.pathmod.ismount(self)
|
||||||
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
|
|
||||||
|
|
||||||
def is_symlink(self):
|
def is_symlink(self):
|
||||||
"""
|
"""
|
||||||
|
@ -1378,6 +1364,3 @@ class WindowsPath(Path, PureWindowsPath):
|
||||||
On a Windows system, instantiating a Path should return this object.
|
On a Windows system, instantiating a Path should return this object.
|
||||||
"""
|
"""
|
||||||
__slots__ = ()
|
__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\udfff').is_file(), False)
|
||||||
self.assertIs((P / 'fileA\x00').is_file(), False)
|
self.assertIs((P / 'fileA\x00').is_file(), False)
|
||||||
|
|
||||||
@only_posix
|
|
||||||
def test_is_mount(self):
|
def test_is_mount(self):
|
||||||
P = self.cls(BASE)
|
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 / 'fileA').is_mount())
|
||||||
self.assertFalse((P / 'dirA').is_mount())
|
self.assertFalse((P / 'dirA').is_mount())
|
||||||
self.assertFalse((P / 'non-existing').is_mount())
|
self.assertFalse((P / 'non-existing').is_mount())
|
||||||
|
@ -2305,8 +2307,7 @@ class _BasePathTest(object):
|
||||||
self.assertTrue(R.is_mount())
|
self.assertTrue(R.is_mount())
|
||||||
if os_helper.can_symlink():
|
if os_helper.can_symlink():
|
||||||
self.assertFalse((P / 'linkA').is_mount())
|
self.assertFalse((P / 'linkA').is_mount())
|
||||||
self.assertIs(self.cls('/\udfff').is_mount(), False)
|
self.assertIs((R / '\udfff').is_mount(), False)
|
||||||
self.assertIs(self.cls('/\x00').is_mount(), False)
|
|
||||||
|
|
||||||
def test_is_symlink(self):
|
def test_is_symlink(self):
|
||||||
P = self.cls(BASE)
|
P = self.cls(BASE)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Implement :meth:`pathlib.Path.is_mount` for Windows paths.
|
Loading…
Add table
Add a link
Reference in a new issue