summaryrefslogtreecommitdiffstats
path: root/Lib/statcache.py
blob: eeb0ca419775712b2a1abda66886dff08dc8b77c (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# Module 'statcache'
#
# Maintain a cache of file stats.
# There are functions to reset the cache or to selectively remove items.

import posix


# The cache.
# Keys are pathnames, values are `posix.stat' outcomes.
#
cache = {}


# Stat a file, possibly out of the cache.
#
def stat(path):
	try:
		return cache[path]
	except RuntimeError:
		pass
	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):
	try:
		del cache[path]
	except RuntimeError:
		pass


# 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:
		# mode is st[0]; type is mode/4096; S_IFDIR is 4
		return stat(path)[0] / 4096 = 4
	except RuntimeError:
		return 0