| # Module 'statcache' | 
 | # | 
 | # Maintain a cache of file stats. | 
 | # 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 = {} | 
 |  | 
 |  | 
 | # Stat a file, possibly out of the cache. | 
 | # | 
 | def stat(path): | 
 | 	if cache.has_key(path): | 
 | 		return cache[path] | 
 | 	cache[path] = ret = os.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): | 
 | 	if cache.has_key(path): | 
 | 		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: | 
 | 		st = stat(path) | 
 | 	except os.error: | 
 | 		return 0 | 
 | 	return S_ISDIR(st[ST_MODE]) |