blob: b5147c233dc545952790a88e3f014d6427565c01 [file] [log] [blame]
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +00001"""Maintain a cache of stat() information on files.
2
Guido van Rossume7b146f2000-02-04 15:28:42 +00003There are functions to reset the cache or to selectively remove items.
4"""
Guido van Rossumc6360141990-10-13 19:23:40 +00005
Guido van Rossum25d7caf1992-03-31 19:04:48 +00006import os
Guido van Rossum40d93041990-10-21 16:17:34 +00007from stat import *
Guido van Rossumc6360141990-10-13 19:23:40 +00008
9# The cache.
Guido van Rossum25d7caf1992-03-31 19:04:48 +000010# Keys are pathnames, values are `os.stat' outcomes.
Guido van Rossumc6360141990-10-13 19:23:40 +000011#
12cache = {}
13
14
Guido van Rossumc6360141990-10-13 19:23:40 +000015def stat(path):
Guido van Rossume7b146f2000-02-04 15:28:42 +000016 """Stat a file, possibly out of the cache."""
Guido van Rossum40d93041990-10-21 16:17:34 +000017 if cache.has_key(path):
Guido van Rossumc6360141990-10-13 19:23:40 +000018 return cache[path]
Guido van Rossum25d7caf1992-03-31 19:04:48 +000019 cache[path] = ret = os.stat(path)
Guido van Rossumc6360141990-10-13 19:23:40 +000020 return ret
21
22
Guido van Rossumc6360141990-10-13 19:23:40 +000023def reset():
Guido van Rossume7b146f2000-02-04 15:28:42 +000024 """Reset the cache completely."""
Sjoerd Mullendere5fe4af1995-12-07 10:16:45 +000025 global cache
26 cache = {}
Guido van Rossumc6360141990-10-13 19:23:40 +000027
28
Guido van Rossumc6360141990-10-13 19:23:40 +000029def forget(path):
Guido van Rossume7b146f2000-02-04 15:28:42 +000030 """Remove a given item from the cache, if it exists."""
Guido van Rossum40d93041990-10-21 16:17:34 +000031 if cache.has_key(path):
Guido van Rossumc6360141990-10-13 19:23:40 +000032 del cache[path]
Guido van Rossumc6360141990-10-13 19:23:40 +000033
34
Guido van Rossumc6360141990-10-13 19:23:40 +000035def forget_prefix(prefix):
Guido van Rossume7b146f2000-02-04 15:28:42 +000036 """Remove all pathnames with a given prefix."""
Guido van Rossumc6360141990-10-13 19:23:40 +000037 n = len(prefix)
38 for path in cache.keys():
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000039 if path[:n] == prefix:
Guido van Rossumc6360141990-10-13 19:23:40 +000040 del cache[path]
41
42
Guido van Rossumc6360141990-10-13 19:23:40 +000043def forget_dir(prefix):
Guido van Rossume7b146f2000-02-04 15:28:42 +000044 """Forget about a directory and all entries in it, but not about
45 entries in subdirectories."""
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000046 if prefix[-1:] == '/' and prefix <> '/':
Guido van Rossumc6360141990-10-13 19:23:40 +000047 prefix = prefix[:-1]
48 forget(prefix)
49 if prefix[-1:] <> '/':
50 prefix = prefix + '/'
51 n = len(prefix)
52 for path in cache.keys():
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000053 if path[:n] == prefix:
Guido van Rossumc6360141990-10-13 19:23:40 +000054 rest = path[n:]
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000055 if rest[-1:] == '/': rest = rest[:-1]
Guido van Rossumc6360141990-10-13 19:23:40 +000056 if '/' not in rest:
57 del cache[path]
58
59
Guido van Rossumc6360141990-10-13 19:23:40 +000060def forget_except_prefix(prefix):
Guido van Rossume7b146f2000-02-04 15:28:42 +000061 """Remove all pathnames except with a given prefix.
62 Normally used with prefix = '/' after a chdir()."""
Guido van Rossumc6360141990-10-13 19:23:40 +000063 n = len(prefix)
64 for path in cache.keys():
65 if path[:n] <> prefix:
66 del cache[path]
67
68
Guido van Rossumc6360141990-10-13 19:23:40 +000069def isdir(path):
Guido van Rossume7b146f2000-02-04 15:28:42 +000070 """Check for directory."""
Guido van Rossumc6360141990-10-13 19:23:40 +000071 try:
Guido van Rossum40d93041990-10-21 16:17:34 +000072 st = stat(path)
Guido van Rossum25d7caf1992-03-31 19:04:48 +000073 except os.error:
Guido van Rossumc6360141990-10-13 19:23:40 +000074 return 0
Guido van Rossum40d93041990-10-21 16:17:34 +000075 return S_ISDIR(st[ST_MODE])