Skip to content

Commit

Permalink
gh-86943: implement pathlib.WindowsPath.is_mount() (GH-31458)
Browse files Browse the repository at this point in the history
Have `pathlib.WindowsPath.is_mount()` call `ntpath.ismount()`. Previously it raised `NotImplementedError` unconditionally.


https://bugs.python.org/issue42777
  • Loading branch information
barneygale authored Aug 5, 2022
1 parent a302a27 commit 29650fe
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 24 deletions.
7 changes: 6 additions & 1 deletion Doc/library/pathlib.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
21 changes: 2 additions & 19 deletions Lib/pathlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -1211,23 +1211,9 @@ def is_file(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
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):
"""
Expand Down Expand Up @@ -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")
9 changes: 5 additions & 4 deletions Lib/test/test_pathlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -2294,19 +2294,20 @@ def test_is_file(self):
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())
self.assertFalse((P / 'fileA' / 'bah').is_mount())
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)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Implement :meth:`pathlib.Path.is_mount` for Windows paths.

0 comments on commit 29650fe

Please sign in to comment.