mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			82 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
# 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.
 | 
						|
#
 | 
						|
def reset():
 | 
						|
	global cache
 | 
						|
	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])
 |