cpython/Lib/statcache.py

76 lines
1.7 KiB
Python
Raw Normal View History

"""Maintain a cache of stat() information on files.
There are functions to reset the cache or to selectively remove items.
"""
1990-10-13 16:23:40 -03:00
1992-03-31 15:04:48 -04:00
import os
from stat import *
1990-10-13 16:23:40 -03:00
# The cache.
1992-03-31 15:04:48 -04:00
# Keys are pathnames, values are `os.stat' outcomes.
1990-10-13 16:23:40 -03:00
#
cache = {}
def stat(path):
2001-01-14 21:36:40 -04:00
"""Stat a file, possibly out of the cache."""
if cache.has_key(path):
return cache[path]
cache[path] = ret = os.stat(path)
return ret
1990-10-13 16:23:40 -03:00
def reset():
2001-01-14 21:36:40 -04:00
"""Reset the cache completely."""
global cache
cache = {}
1990-10-13 16:23:40 -03:00
def forget(path):
2001-01-14 21:36:40 -04:00
"""Remove a given item from the cache, if it exists."""
if cache.has_key(path):
del cache[path]
1990-10-13 16:23:40 -03:00
def forget_prefix(prefix):
2001-01-14 21:36:40 -04:00
"""Remove all pathnames with a given prefix."""
n = len(prefix)
for path in cache.keys():
if path[:n] == prefix:
del cache[path]
1990-10-13 16:23:40 -03:00
def forget_dir(prefix):
2001-01-14 21:36:40 -04:00
"""Forget about a directory and all entries in it, but not about
entries in subdirectories."""
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]
1990-10-13 16:23:40 -03:00
def forget_except_prefix(prefix):
2001-01-14 21:36:40 -04:00
"""Remove all pathnames except with a given prefix.
Normally used with prefix = '/' after a chdir()."""
n = len(prefix)
for path in cache.keys():
if path[:n] != prefix:
del cache[path]
1990-10-13 16:23:40 -03:00
def isdir(path):
2001-01-14 21:36:40 -04:00
"""Check for directory."""
try:
st = stat(path)
except os.error:
return 0
return S_ISDIR(st[ST_MODE])