changeset 274:224725fd9f2f

WalkDirEntry: add support for special files (character and block special, FIFO, socket, door, whiteout, event port, ...)
author Franz Glasner <fzglas.hg@dom66.de>
date Wed, 19 Feb 2025 16:42:44 +0100
parents c02a57df2a29
children c72f5b2dbc6f
files cutils/util/walk.py tests/test_walk.py
diffstat 2 files changed, 65 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/cutils/util/walk.py	Wed Feb 19 09:12:30 2025 +0100
+++ b/cutils/util/walk.py	Wed Feb 19 16:42:44 2025 +0100
@@ -236,6 +236,58 @@
         return self._is_dir
 
     @property
+    def is_chr(self):
+        return (stat.S_ISCHR(self._stat_result.st_mode)
+                if self._stat_result is not None
+                else False)
+
+    @property
+    def is_blk(self):
+        return (stat.S_ISBLK(self._stat_result.st_mode)
+                if self._stat_result is not None
+                else False)
+
+    @property
+    def is_fifo(self):
+        return (stat.S_ISFIFO(self._stat_result.st_mode)
+                if self._stat_result is not None
+                else False)
+
+    @property
+    def is_socket(self):
+        return (stat.S_ISSOCK(self._stat_result.st_mode)
+                if self._stat_result is not None
+                else False)
+
+    @property
+    def is_door(self):
+        test = getattr(stat, "S_ISDOOR", None)
+        return (test(self._stat_result.st_mode)
+                if test and (self._stat_result is not None)
+                else False)
+
+    @property
+    def is_eventport(self):
+        test = getattr(stat, "S_ISPORT", None)
+        return (test(self._stat_result.st_mode)
+                if test and (self._stat_result is not None)
+                else False)
+
+    @property
+    def is_whiteout(self):
+        test = getattr(stat, "S_ISWHT", None)
+        return (test(self._stat_result.st_mode)
+                if test and (self._stat_result is not None)
+                else False)
+
+    @property
+    def is_special(self):
+        """Anything besides a regular file and a directory"""
+        if self._stat_result is None:
+            return False
+        return not (self.is_reg or self.is_dir)
+
+    @property
     def stat(self):
         return self._stat_result
 
--- a/tests/test_walk.py	Wed Feb 19 09:12:30 2025 +0100
+++ b/tests/test_walk.py	Wed Feb 19 16:42:44 2025 +0100
@@ -210,6 +210,7 @@
         self.assertFalse(entry.is_reg)
         self.assertTrue(entry.is_dir)
         self.assertIsNotNone(entry.stat)
+        self.assertFalse(entry.is_special)
 
     def test_broken_symlink_to_directory(self):
         entry = walk.WalkDirEntry.from_path_name(
@@ -218,6 +219,7 @@
         self.assertFalse(entry.is_reg)
         self.assertFalse(entry.is_dir)
         self.assertIsNone(entry.stat)
+        self.assertFalse(entry.is_special)
 
     def test_real_directory(self):
         entry = walk.WalkDirEntry.from_path_name(
@@ -226,6 +228,7 @@
         self.assertFalse(entry.is_reg)
         self.assertTrue(entry.is_dir)
         self.assertIsNotNone(entry.stat)
+        self.assertFalse(entry.is_special)
 
     def test_symlink_to_file(self):
         entry = walk.WalkDirEntry.from_path_name(
@@ -234,6 +237,7 @@
         self.assertTrue(entry.is_reg)
         self.assertFalse(entry.is_dir)
         self.assertIsNotNone(entry.stat)
+        self.assertFalse(entry.is_special)
 
     def test_broken_symlink_to_file(self):
         entry = walk.WalkDirEntry.from_path_name(
@@ -242,6 +246,7 @@
         self.assertFalse(entry.is_reg)
         self.assertFalse(entry.is_dir)
         self.assertIsNone(entry.stat)
+        self.assertFalse(entry.is_special)
 
     def test_real_file(self):
         entry = walk.WalkDirEntry.from_path_name(
@@ -250,6 +255,7 @@
         self.assertTrue(entry.is_reg)
         self.assertFalse(entry.is_dir)
         self.assertIsNotNone(entry.stat)
+        self.assertFalse(entry.is_special)
 
     def test_real_file_via_dir_symlink(self):
         entry = walk.WalkDirEntry.from_path_name(
@@ -258,6 +264,7 @@
         self.assertTrue(entry.is_reg)
         self.assertFalse(entry.is_dir)
         self.assertIsNotNone(entry.stat)
+        self.assertFalse(entry.is_special)
 
 
 @unittest.skipIf(not hasattr(os, "mkfifo"), "Needs os.mkfifo()")
@@ -279,6 +286,8 @@
         self.assertFalse(entry.is_reg)
         self.assertFalse(entry.is_dir)
         self.assertIsNotNone(entry.stat)
+        self.assertTrue(entry.is_fifo)
+        self.assertTrue(entry.is_special)
 
     def test_symlink_to_mkfifo(self):
         fifopath = os.path.join(TMPDIR, "test.fifo")
@@ -290,6 +299,8 @@
         self.assertFalse(entry.is_reg)
         self.assertFalse(entry.is_dir)
         self.assertIsNotNone(entry.stat)
+        self.assertTrue(entry.is_fifo)
+        self.assertTrue(entry.is_special)
 
     def test_broken_symlink_to_mkfifo(self):
         fifopath = os.path.join(TMPDIR, "test.fifo")
@@ -302,6 +313,8 @@
         self.assertFalse(entry.is_reg)
         self.assertFalse(entry.is_dir)
         self.assertIsNone(entry.stat)
+        self.assertFalse(entry.is_fifo)
+        self.assertFalse(entry.is_special)
 
 
 if __name__ == "__main__":