| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | # Module 'statcache' | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Maintain a cache of file stats. | 
					
						
							|  |  |  | # There are functions to reset the cache or to selectively remove items. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-03-31 19:04:48 +00:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											1990-10-21 16:17:34 +00:00
										 |  |  | from stat import * | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # The cache. | 
					
						
							| 
									
										
										
										
											1992-03-31 19:04:48 +00:00
										 |  |  | # Keys are pathnames, values are `os.stat' outcomes. | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | # | 
					
						
							|  |  |  | cache = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Stat a file, possibly out of the cache. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def stat(path): | 
					
						
							| 
									
										
										
										
											1990-10-21 16:17:34 +00:00
										 |  |  | 	if cache.has_key(path): | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 		return cache[path] | 
					
						
							| 
									
										
										
										
											1992-03-31 19:04:48 +00:00
										 |  |  | 	cache[path] = ret = os.stat(path) | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 	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): | 
					
						
							| 
									
										
										
										
											1990-10-21 16:17:34 +00:00
										 |  |  | 	if cache.has_key(path): | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 		del cache[path] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Remove all pathnames with a given prefix. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def forget_prefix(prefix): | 
					
						
							|  |  |  | 	n = len(prefix) | 
					
						
							|  |  |  | 	for path in cache.keys(): | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 		if path[:n] == prefix: | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 			del cache[path] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Forget about a directory and all entries in it, but not about | 
					
						
							|  |  |  | # entries in subdirectories. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def forget_dir(prefix): | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 	if prefix[-1:] == '/' and prefix <> '/': | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 		prefix = prefix[:-1] | 
					
						
							|  |  |  | 	forget(prefix) | 
					
						
							|  |  |  | 	if prefix[-1:] <> '/': | 
					
						
							|  |  |  | 		prefix = prefix + '/' | 
					
						
							|  |  |  | 	n = len(prefix) | 
					
						
							|  |  |  | 	for path in cache.keys(): | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 		if path[:n] == prefix: | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 			rest = path[n:] | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 			if rest[-1:] == '/': rest = rest[:-1] | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 			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: | 
					
						
							| 
									
										
										
										
											1990-10-21 16:17:34 +00:00
										 |  |  | 		st = stat(path) | 
					
						
							| 
									
										
										
										
											1992-03-31 19:04:48 +00:00
										 |  |  | 	except os.error: | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 		return 0 | 
					
						
							| 
									
										
										
										
											1990-10-21 16:17:34 +00:00
										 |  |  | 	return S_ISDIR(st[ST_MODE]) |