1990-10-13 16:23:40 -03:00
|
|
|
# Module 'statcache'
|
|
|
|
#
|
|
|
|
# Maintain a cache of file stats.
|
|
|
|
# There are functions to reset the cache or to selectively remove items.
|
|
|
|
|
|
|
|
import posix
|
1990-10-21 13:17:34 -03:00
|
|
|
from stat import *
|
1990-10-13 16:23:40 -03:00
|
|
|
|
|
|
|
# The cache.
|
|
|
|
# Keys are pathnames, values are `posix.stat' outcomes.
|
|
|
|
#
|
|
|
|
cache = {}
|
|
|
|
|
|
|
|
|
|
|
|
# Stat a file, possibly out of the cache.
|
|
|
|
#
|
|
|
|
def stat(path):
|
1990-10-21 13:17:34 -03:00
|
|
|
if cache.has_key(path):
|
1990-10-13 16:23:40 -03:00
|
|
|
return cache[path]
|
|
|
|
cache[path] = ret = posix.stat(path)
|
|
|
|
return ret
|
|
|
|
|
|
|
|
|
|
|
|
# Reset the cache completely.
|
|
|
|
# Hack: to reset a global variable, we import this module.
|
|
|
|
#
|
|
|
|
def reset():
|
|
|
|
import statcache
|
|
|
|
# Check that we really imported the same module
|
|
|
|
if cache is not statcache.cache:
|
|
|
|
raise 'sorry, statcache identity crisis'
|
|
|
|
statcache.cache = {}
|
|
|
|
|
|
|
|
|
|
|
|
# Remove a given item from the cache, if it exists.
|
|
|
|
#
|
|
|
|
def forget(path):
|
1990-10-21 13:17:34 -03:00
|
|
|
if cache.has_key(path):
|
1990-10-13 16:23:40 -03:00
|
|
|
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:
|
1990-10-21 13:17:34 -03:00
|
|
|
st = stat(path)
|
|
|
|
except posix.error:
|
1990-10-13 16:23:40 -03:00
|
|
|
return 0
|
1990-10-21 13:17:34 -03:00
|
|
|
return S_ISDIR(st[ST_MODE])
|