diff options
author | Barney Gale <barney.gale@gmail.com> | 2022-08-05 22:37:44 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-05 22:37:44 (GMT) |
commit | 29650fea9605bf1f48320487c6d5d6d70d97ad95 (patch) | |
tree | 70e7facd520abeb8b55c124f457f96cfc6b5c4c6 | |
parent | a302a274892f2dad4e1fa492c4886d55e4df0a80 (diff) | |
download | cpython-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.rst | 7 | ||||
-rw-r--r-- | Lib/pathlib.py | 21 | ||||
-rw-r--r-- | Lib/test/test_pathlib.py | 9 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2022-02-21-01-37-00.bpo-42777.nWK3E6.rst | 1 |
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. |