summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBarney Gale <barney.gale@gmail.com>2022-08-05 22:37:44 (GMT)
committerGitHub <noreply@github.com>2022-08-05 22:37:44 (GMT)
commit29650fea9605bf1f48320487c6d5d6d70d97ad95 (patch)
tree70e7facd520abeb8b55c124f457f96cfc6b5c4c6
parenta302a274892f2dad4e1fa492c4886d55e4df0a80 (diff)
downloadcpython-29650fea9605bf1f48320487c6d5d6d70d97ad95.zip
cpython-29650fea9605bf1f48320487c6d5d6d70d97ad95.tar.gz
cpython-29650fea9605bf1f48320487c6d5d6d70d97ad95.tar.bz2
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
-rw-r--r--Doc/library/pathlib.rst7
-rw-r--r--Lib/pathlib.py21
-rw-r--r--Lib/test/test_pathlib.py9
-rw-r--r--Misc/NEWS.d/next/Library/2022-02-21-01-37-00.bpo-42777.nWK3E6.rst1
4 files changed, 14 insertions, 24 deletions
diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst
index 19944bd..f7d7745 100644
--- a/Doc/library/pathlib.rst
+++ b/Doc/library/pathlib.rst
@@ -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()
diff --git a/Lib/pathlib.py b/Lib/pathlib.py
index 2aee717..54da1c8 100644
--- a/Lib/pathlib.py
+++ b/Lib/pathlib.py
@@ -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")
diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py
index e14b0fc..668af80 100644
--- a/Lib/test/test_pathlib.py
+++ b/Lib/test/test_pathlib.py
@@ -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)
diff --git a/Misc/NEWS.d/next/Library/2022-02-21-01-37-00.bpo-42777.nWK3E6.rst b/Misc/NEWS.d/next/Library/2022-02-21-01-37-00.bpo-42777.nWK3E6.rst
new file mode 100644
index 0000000..2491238
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-02-21-01-37-00.bpo-42777.nWK3E6.rst
@@ -0,0 +1 @@
+Implement :meth:`pathlib.Path.is_mount` for Windows paths.