summaryrefslogtreecommitdiffstats
path: root/Lib/statcache.py
blob: 26f909426b812243673e1b13e5ab25e4d5ecfa52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"""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])