summaryrefslogtreecommitdiffstats
path: root/Lib/dos-8x3/statcach.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/dos-8x3/statcach.py')
-rwxr-xr-xLib/dos-8x3/statcach.py82
1 files changed, 82 insertions, 0 deletions
diff --git a/Lib/dos-8x3/statcach.py b/Lib/dos-8x3/statcach.py
new file mode 100755
index 0000000..770aef0
--- /dev/null
+++ b/Lib/dos-8x3/statcach.py
@@ -0,0 +1,82 @@
+# Module 'statcache'
+#
+# Maintain a cache of file stats.
+# There are functions to reset the cache or to selectively remove items.
+
+import os
+from stat import *
+
+# The cache.
+# Keys are pathnames, values are `os.stat' outcomes.
+#
+cache = {}
+
+
+# Stat a file, possibly out of the cache.
+#
+def stat(path):
+ if cache.has_key(path):
+ return cache[path]
+ cache[path] = ret = os.stat(path)
+ return ret
+
+
+# Reset the cache completely.
+#
+def reset():
+ global cache
+ cache = {}
+
+
+# Remove a given item from the cache, if it exists.
+#
+def forget(path):
+ if cache.has_key(path):
+ del cache[path]
+
+
+# Remove all pathnames with a given prefix.
+#
+def forget_prefix(prefix):
+ n = len(prefix)
+ for path in cache.keys():
+ if path[:n] == prefix:
+ del cache[path]
+
+
+# Forget about a directory and all entries in it, but not about
+# entries in subdirectories.
+#
+def forget_dir(prefix):
+ if prefix[-1:] == '/' and prefix <> '/':
+ prefix = prefix[:-1]
+ forget(prefix)
+ if prefix[-1:] <> '/':
+ prefix = prefix + '/'
+ n = len(prefix)
+ for path in cache.keys():
+ if path[:n] == prefix:
+ rest = path[n:]
+ if rest[-1:] == '/': rest = rest[:-1]
+ if '/' not in rest:
+ del cache[path]
+
+
+# Remove all pathnames except with a given prefix.
+# Normally used with prefix = '/' after a chdir().
+#
+def forget_except_prefix(prefix):
+ n = len(prefix)
+ for path in cache.keys():
+ if path[:n] <> prefix:
+ del cache[path]
+
+
+# Check for directory.
+#
+def isdir(path):
+ try:
+ st = stat(path)
+ except os.error:
+ return 0
+ return S_ISDIR(st[ST_MODE])