blob: 0d88a9a584830f7f2c5e2386dc4e110bd696dae8 [file] [log] [blame]
Guido van Rossume7b146f2000-02-04 15:28:42 +00001"""Maintain a cache of file stats.
2There are functions to reset the cache or to selectively remove items.
3"""
Guido van Rossumc6360141990-10-13 19:23:40 +00004
Guido van Rossum25d7caf1992-03-31 19:04:48 +00005import os
Guido van Rossum40d93041990-10-21 16:17:34 +00006from stat import *
Guido van Rossumc6360141990-10-13 19:23:40 +00007
8# The cache.
Guido van Rossum25d7caf1992-03-31 19:04:48 +00009# Keys are pathnames, values are `os.stat' outcomes.
Guido van Rossumc6360141990-10-13 19:23:40 +000010#
11cache = {}
12
13
Guido van Rossumc6360141990-10-13 19:23:40 +000014def stat(path):
Guido van Rossume7b146f2000-02-04 15:28:42 +000015 """Stat a file, possibly out of the cache."""
Guido van Rossum40d93041990-10-21 16:17:34 +000016 if cache.has_key(path):
Guido van Rossumc6360141990-10-13 19:23:40 +000017 return cache[path]
Guido van Rossum25d7caf1992-03-31 19:04:48 +000018 cache[path] = ret = os.stat(path)
Guido van Rossumc6360141990-10-13 19:23:40 +000019 return ret
20
21
Guido van Rossumc6360141990-10-13 19:23:40 +000022def reset():
Guido van Rossume7b146f2000-02-04 15:28:42 +000023 """Reset the cache completely."""
Sjoerd Mullendere5fe4af1995-12-07 10:16:45 +000024 global cache
25 cache = {}
Guido van Rossumc6360141990-10-13 19:23:40 +000026
27
Guido van Rossumc6360141990-10-13 19:23:40 +000028def forget(path):
Guido van Rossume7b146f2000-02-04 15:28:42 +000029 """Remove a given item from the cache, if it exists."""
Guido van Rossum40d93041990-10-21 16:17:34 +000030 if cache.has_key(path):
Guido van Rossumc6360141990-10-13 19:23:40 +000031 del cache[path]
Guido van Rossumc6360141990-10-13 19:23:40 +000032
33
Guido van Rossumc6360141990-10-13 19:23:40 +000034def forget_prefix(prefix):
Guido van Rossume7b146f2000-02-04 15:28:42 +000035 """Remove all pathnames with a given prefix."""
Guido van Rossumc6360141990-10-13 19:23:40 +000036 n = len(prefix)
37 for path in cache.keys():
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000038 if path[:n] == prefix:
Guido van Rossumc6360141990-10-13 19:23:40 +000039 del cache[path]
40
41
Guido van Rossumc6360141990-10-13 19:23:40 +000042def forget_dir(prefix):
Guido van Rossume7b146f2000-02-04 15:28:42 +000043 """Forget about a directory and all entries in it, but not about
44 entries in subdirectories."""
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000045 if prefix[-1:] == '/' and prefix <> '/':
Guido van Rossumc6360141990-10-13 19:23:40 +000046 prefix = prefix[:-1]
47 forget(prefix)
48 if prefix[-1:] <> '/':
49 prefix = prefix + '/'
50 n = len(prefix)
51 for path in cache.keys():
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000052 if path[:n] == prefix:
Guido van Rossumc6360141990-10-13 19:23:40 +000053 rest = path[n:]
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000054 if rest[-1:] == '/': rest = rest[:-1]
Guido van Rossumc6360141990-10-13 19:23:40 +000055 if '/' not in rest:
56 del cache[path]
57
58
Guido van Rossumc6360141990-10-13 19:23:40 +000059def forget_except_prefix(prefix):
Guido van Rossume7b146f2000-02-04 15:28:42 +000060 """Remove all pathnames except with a given prefix.
61 Normally used with prefix = '/' after a chdir()."""
Guido van Rossumc6360141990-10-13 19:23:40 +000062 n = len(prefix)
63 for path in cache.keys():
64 if path[:n] <> prefix:
65 del cache[path]
66
67
Guido van Rossumc6360141990-10-13 19:23:40 +000068def isdir(path):
Guido van Rossume7b146f2000-02-04 15:28:42 +000069 """Check for directory."""
Guido van Rossumc6360141990-10-13 19:23:40 +000070 try:
Guido van Rossum40d93041990-10-21 16:17:34 +000071 st = stat(path)
Guido van Rossum25d7caf1992-03-31 19:04:48 +000072 except os.error:
Guido van Rossumc6360141990-10-13 19:23:40 +000073 return 0
Guido van Rossum40d93041990-10-21 16:17:34 +000074 return S_ISDIR(st[ST_MODE])