Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | """Read and cache directory listings. |
2 | ||
3 | The listdir() routine returns a sorted list of the files in a directory, | |
4 | using a cache to avoid reading the directory more often than necessary. | |
5 | The annotate() routine appends slashes to directories.""" | |
6 | ||
7 | import os | |
8 | ||
9 | __all__ = ["listdir", "opendir", "annotate", "reset"] | |
10 | ||
11 | cache = {} | |
12 | ||
13 | def reset(): | |
14 | """Reset the cache completely.""" | |
15 | global cache | |
16 | cache = {} | |
17 | ||
18 | def listdir(path): | |
19 | """List directory contents, using cache.""" | |
20 | try: | |
21 | cached_mtime, list = cache[path] | |
22 | del cache[path] | |
23 | except KeyError: | |
24 | cached_mtime, list = -1, [] | |
25 | mtime = os.stat(path).st_mtime | |
26 | if mtime != cached_mtime: | |
27 | list = os.listdir(path) | |
28 | list.sort() | |
29 | cache[path] = mtime, list | |
30 | return list | |
31 | ||
32 | opendir = listdir # XXX backward compatibility | |
33 | ||
34 | def annotate(head, list): | |
35 | """Add '/' suffixes to directories.""" | |
36 | for i in range(len(list)): | |
37 | if os.path.isdir(os.path.join(head, list[i])): | |
38 | list[i] = list[i] + '/' |