statcache.py 1.5 KB
Newer Older
1 2
"""Maintain a cache of stat() information on files.

3 4
There are functions to reset the cache or to selectively remove items.
"""
Guido van Rossum's avatar
Guido van Rossum committed
5

Guido van Rossum's avatar
Guido van Rossum committed
6
import os
7
from stat import *
Guido van Rossum's avatar
Guido van Rossum committed
8 9

# The cache.
Guido van Rossum's avatar
Guido van Rossum committed
10
# Keys are pathnames, values are `os.stat' outcomes.
Guido van Rossum's avatar
Guido van Rossum committed
11 12 13 14 15
#
cache = {}


def stat(path):
16
	"""Stat a file, possibly out of the cache."""
17
	if cache.has_key(path):
Guido van Rossum's avatar
Guido van Rossum committed
18
		return cache[path]
Guido van Rossum's avatar
Guido van Rossum committed
19
	cache[path] = ret = os.stat(path)
Guido van Rossum's avatar
Guido van Rossum committed
20 21 22 23
	return ret


def reset():
24
	"""Reset the cache completely."""
25 26
	global cache
	cache = {}
Guido van Rossum's avatar
Guido van Rossum committed
27 28 29


def forget(path):
30
	"""Remove a given item from the cache, if it exists."""
31
	if cache.has_key(path):
Guido van Rossum's avatar
Guido van Rossum committed
32 33 34 35
		del cache[path]


def forget_prefix(prefix):
36
	"""Remove all pathnames with a given prefix."""
Guido van Rossum's avatar
Guido van Rossum committed
37 38
	n = len(prefix)
	for path in cache.keys():
Guido van Rossum's avatar
Guido van Rossum committed
39
		if path[:n] == prefix:
Guido van Rossum's avatar
Guido van Rossum committed
40 41 42 43
			del cache[path]


def forget_dir(prefix):
44 45
	"""Forget about a directory and all entries in it, but not about
	entries in subdirectories."""
Guido van Rossum's avatar
Guido van Rossum committed
46
	if prefix[-1:] == '/' and prefix <> '/':
Guido van Rossum's avatar
Guido van Rossum committed
47 48 49 50 51 52
		prefix = prefix[:-1]
	forget(prefix)
	if prefix[-1:] <> '/':
		prefix = prefix + '/'
	n = len(prefix)
	for path in cache.keys():
Guido van Rossum's avatar
Guido van Rossum committed
53
		if path[:n] == prefix:
Guido van Rossum's avatar
Guido van Rossum committed
54
			rest = path[n:]
Guido van Rossum's avatar
Guido van Rossum committed
55
			if rest[-1:] == '/': rest = rest[:-1]
Guido van Rossum's avatar
Guido van Rossum committed
56 57 58 59 60
			if '/' not in rest:
				del cache[path]


def forget_except_prefix(prefix):
61 62
	"""Remove all pathnames except with a given prefix.
	Normally used with prefix = '/' after a chdir()."""
Guido van Rossum's avatar
Guido van Rossum committed
63 64 65 66 67 68 69
	n = len(prefix)
	for path in cache.keys():
		if path[:n] <> prefix:
			del cache[path]


def isdir(path):
70
	"""Check for directory."""
Guido van Rossum's avatar
Guido van Rossum committed
71
	try:
72
		st = stat(path)
Guido van Rossum's avatar
Guido van Rossum committed
73
	except os.error:
Guido van Rossum's avatar
Guido van Rossum committed
74
		return 0
75
	return S_ISDIR(st[ST_MODE])