76 lines
1.5 KiB
Python
76 lines
1.5 KiB
Python
"""Maintain a cache of stat() information on files.
|
|
|
|
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 = {}
|
|
|
|
|
|
def stat(path):
|
|
"""Stat a file, possibly out of the cache."""
|
|
if cache.has_key(path):
|
|
return cache[path]
|
|
cache[path] = ret = os.stat(path)
|
|
return ret
|
|
|
|
|
|
def reset():
|
|
"""Reset the cache completely."""
|
|
global cache
|
|
cache = {}
|
|
|
|
|
|
def forget(path):
|
|
"""Remove a given item from the cache, if it exists."""
|
|
if cache.has_key(path):
|
|
del cache[path]
|
|
|
|
|
|
def forget_prefix(prefix):
|
|
"""Remove all pathnames with a given prefix."""
|
|
n = len(prefix)
|
|
for path in cache.keys():
|
|
if path[:n] == prefix:
|
|
del cache[path]
|
|
|
|
|
|
def forget_dir(prefix):
|
|
"""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]
|
|
|
|
|
|
def forget_except_prefix(prefix):
|
|
"""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]
|
|
|
|
|
|
def isdir(path):
|
|
"""Check for directory."""
|
|
try:
|
|
st = stat(path)
|
|
except os.error:
|
|
return 0
|
|
return S_ISDIR(st[ST_MODE])
|