summaryrefslogtreecommitdiffstats
path: root/Lib/lib-old
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2004-12-05 04:55:14 (GMT)
committerRaymond Hettinger <python@rcn.com>2004-12-05 04:55:14 (GMT)
commit4ebe364277b62785821003a8161a2081618b23a5 (patch)
tree0bf78ac97b947bdb06dd2aaee3e67cebb52fa0a2 /Lib/lib-old
parent1bc82f891c2ed0c4b062158d2c8339fb90406395 (diff)
downloadcpython-4ebe364277b62785821003a8161a2081618b23a5.zip
cpython-4ebe364277b62785821003a8161a2081618b23a5.tar.gz
cpython-4ebe364277b62785821003a8161a2081618b23a5.tar.bz2
Remove the deprecated statcache module.
Diffstat (limited to 'Lib/lib-old')
-rw-r--r--Lib/lib-old/statcache.py82
1 files changed, 82 insertions, 0 deletions
diff --git a/Lib/lib-old/statcache.py b/Lib/lib-old/statcache.py
new file mode 100644
index 0000000..d478393
--- /dev/null
+++ b/Lib/lib-old/statcache.py
@@ -0,0 +1,82 @@
+"""Maintain a cache of stat() information on files.
+
+There are functions to reset the cache or to selectively remove items.
+"""
+
+import warnings
+warnings.warn("The statcache module is obsolete. Use os.stat() instead.",
+ DeprecationWarning)
+del warnings
+
+import os as _os
+from stat import *
+
+__all__ = ["stat","reset","forget","forget_prefix","forget_dir",
+ "forget_except_prefix","isdir"]
+
+# The cache. Keys are pathnames, values are os.stat outcomes.
+# Remember that multiple threads may be calling this! So, e.g., that
+# path in cache returns 1 doesn't mean the cache will still contain
+# path on the next line. Code defensively.
+
+cache = {}
+
+def stat(path):
+ """Stat a file, possibly out of the cache."""
+ ret = cache.get(path, None)
+ if ret is None:
+ cache[path] = ret = _os.stat(path)
+ return ret
+
+def reset():
+ """Clear the cache."""
+ cache.clear()
+
+# For thread saftey, always use forget() internally too.
+def forget(path):
+ """Remove a given item from the cache, if it exists."""
+ try:
+ del cache[path]
+ except KeyError:
+ pass
+
+def forget_prefix(prefix):
+ """Remove all pathnames with a given prefix."""
+ for path in cache.keys():
+ if path.startswith(prefix):
+ forget(path)
+
+def forget_dir(prefix):
+ """Forget a directory and all entries except for entries in subdirs."""
+
+ # Remove trailing separator, if any. This is tricky to do in a
+ # x-platform way. For example, Windows accepts both / and \ as
+ # separators, and if there's nothing *but* a separator we want to
+ # preserve that this is the root. Only os.path has the platform
+ # knowledge we need.
+ from os.path import split, join
+ prefix = split(join(prefix, "xxx"))[0]
+ forget(prefix)
+ for path in cache.keys():
+ # First check that the path at least starts with the prefix, so
+ # that when it doesn't we can avoid paying for split().
+ if path.startswith(prefix) and split(path)[0] == prefix:
+ forget(path)
+
+def forget_except_prefix(prefix):
+ """Remove all pathnames except with a given prefix.
+
+ Normally used with prefix = '/' after a chdir().
+ """
+
+ for path in cache.keys():
+ if not path.startswith(prefix):
+ forget(path)
+
+def isdir(path):
+ """Return True if directory, else False."""
+ try:
+ st = stat(path)
+ except _os.error:
+ return False
+ return S_ISDIR(st.st_mode)