Guido van Rossum | e7b146f | 2000-02-04 15:28:42 +0000 | [diff] [blame^] | 1 | """Maintain a cache of file stats. |
| 2 | There are functions to reset the cache or to selectively remove items. |
| 3 | """ |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 4 | |
Guido van Rossum | 25d7caf | 1992-03-31 19:04:48 +0000 | [diff] [blame] | 5 | import os |
Guido van Rossum | 40d9304 | 1990-10-21 16:17:34 +0000 | [diff] [blame] | 6 | from stat import * |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 7 | |
| 8 | # The cache. |
Guido van Rossum | 25d7caf | 1992-03-31 19:04:48 +0000 | [diff] [blame] | 9 | # Keys are pathnames, values are `os.stat' outcomes. |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 10 | # |
| 11 | cache = {} |
| 12 | |
| 13 | |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 14 | def stat(path): |
Guido van Rossum | e7b146f | 2000-02-04 15:28:42 +0000 | [diff] [blame^] | 15 | """Stat a file, possibly out of the cache.""" |
Guido van Rossum | 40d9304 | 1990-10-21 16:17:34 +0000 | [diff] [blame] | 16 | if cache.has_key(path): |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 17 | return cache[path] |
Guido van Rossum | 25d7caf | 1992-03-31 19:04:48 +0000 | [diff] [blame] | 18 | cache[path] = ret = os.stat(path) |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 19 | return ret |
| 20 | |
| 21 | |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 22 | def reset(): |
Guido van Rossum | e7b146f | 2000-02-04 15:28:42 +0000 | [diff] [blame^] | 23 | """Reset the cache completely.""" |
Sjoerd Mullender | e5fe4af | 1995-12-07 10:16:45 +0000 | [diff] [blame] | 24 | global cache |
| 25 | cache = {} |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 26 | |
| 27 | |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 28 | def forget(path): |
Guido van Rossum | e7b146f | 2000-02-04 15:28:42 +0000 | [diff] [blame^] | 29 | """Remove a given item from the cache, if it exists.""" |
Guido van Rossum | 40d9304 | 1990-10-21 16:17:34 +0000 | [diff] [blame] | 30 | if cache.has_key(path): |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 31 | del cache[path] |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 32 | |
| 33 | |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 34 | def forget_prefix(prefix): |
Guido van Rossum | e7b146f | 2000-02-04 15:28:42 +0000 | [diff] [blame^] | 35 | """Remove all pathnames with a given prefix.""" |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 36 | n = len(prefix) |
| 37 | for path in cache.keys(): |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 38 | if path[:n] == prefix: |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 39 | del cache[path] |
| 40 | |
| 41 | |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 42 | def forget_dir(prefix): |
Guido van Rossum | e7b146f | 2000-02-04 15:28:42 +0000 | [diff] [blame^] | 43 | """Forget about a directory and all entries in it, but not about |
| 44 | entries in subdirectories.""" |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 45 | if prefix[-1:] == '/' and prefix <> '/': |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 46 | 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 Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 52 | if path[:n] == prefix: |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 53 | rest = path[n:] |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 54 | if rest[-1:] == '/': rest = rest[:-1] |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 55 | if '/' not in rest: |
| 56 | del cache[path] |
| 57 | |
| 58 | |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 59 | def forget_except_prefix(prefix): |
Guido van Rossum | e7b146f | 2000-02-04 15:28:42 +0000 | [diff] [blame^] | 60 | """Remove all pathnames except with a given prefix. |
| 61 | Normally used with prefix = '/' after a chdir().""" |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 62 | n = len(prefix) |
| 63 | for path in cache.keys(): |
| 64 | if path[:n] <> prefix: |
| 65 | del cache[path] |
| 66 | |
| 67 | |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 68 | def isdir(path): |
Guido van Rossum | e7b146f | 2000-02-04 15:28:42 +0000 | [diff] [blame^] | 69 | """Check for directory.""" |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 70 | try: |
Guido van Rossum | 40d9304 | 1990-10-21 16:17:34 +0000 | [diff] [blame] | 71 | st = stat(path) |
Guido van Rossum | 25d7caf | 1992-03-31 19:04:48 +0000 | [diff] [blame] | 72 | except os.error: |
Guido van Rossum | c636014 | 1990-10-13 19:23:40 +0000 | [diff] [blame] | 73 | return 0 |
Guido van Rossum | 40d9304 | 1990-10-21 16:17:34 +0000 | [diff] [blame] | 74 | return S_ISDIR(st[ST_MODE]) |