]> granicus.if.org Git - python/commitdiff
bpo-30897: Add is_mount() to pathlib.Path (#2669)
authorCooper Lees <me@cooperlees.com>
Tue, 1 Aug 2017 22:35:45 +0000 (15:35 -0700)
committerŁukasz Langa <lukasz@langa.pl>
Tue, 1 Aug 2017 22:35:45 +0000 (15:35 -0700)
* Add in is_mount() call to pathlib.Path similiar to os.path.ismount(path)
* Add tests for is_mount()

Lib/pathlib.py
Lib/test/test_pathlib.py

index 0e65c61f654209ce860878eb9a4817d13ebefbbc..c14ddd033564ab9e41c89d2e9f73e38bda08fb21 100644 (file)
@@ -1329,6 +1329,27 @@ class Path(PurePath):
             # (see https://bitbucket.org/pitrou/pathlib/issue/12/)
             return False
 
+    def is_mount(self):
+        """
+        Check if this path is a POSIX mount point
+        """
+        # Need to exist and be a dir
+        if not self.exists() or not self.is_dir():
+            return False
+
+        parent = Path(self.parent)
+        try:
+            parent_dev = 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 = parent.stat().st_ino
+        return ino == parent_ino
+
     def is_symlink(self):
         """
         Whether this path is a symbolic link.
@@ -1416,3 +1437,6 @@ class WindowsPath(Path, PureWindowsPath):
 
     def group(self):
         raise NotImplementedError("Path.group() is unsupported on this system")
+
+    def is_mount(self):
+        raise NotImplementedError("Path.is_mount() is unsupported on this system")
index 16bfee0a47dd78b3f7714e459c42afb2428e8dff..962adde38da541d914af7f95472095872257d6df 100644 (file)
@@ -1880,6 +1880,18 @@ class _BasePathTest(object):
             self.assertFalse((P / 'linkB').is_file())
             self.assertFalse((P/ 'brokenLink').is_file())
 
+    @only_posix
+    def test_is_mount(self):
+        P = self.cls(BASE)
+        R = self.cls('/')  # TODO: Work out windows
+        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 support.can_symlink():
+            self.assertFalse((P / 'linkA').is_mount())
+
     def test_is_symlink(self):
         P = self.cls(BASE)
         self.assertFalse((P / 'fileA').is_symlink())