183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""Read and cache directory listings.
283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehThe listdir() routine returns a sorted list of the files in a directory,
483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehusing a cache to avoid reading the directory more often than necessary.
583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehThe annotate() routine appends slashes to directories."""
683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom warnings import warnpy3k
783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehwarnpy3k("the dircache module has been removed in Python 3.0", stacklevel=2)
883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdel warnpy3k
983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport os
1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh__all__ = ["listdir", "opendir", "annotate", "reset"]
1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehcache = {}
1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef reset():
1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Reset the cache completely."""
1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    global cache
1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    cache = {}
2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef listdir(path):
2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """List directory contents, using cache."""
2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    try:
2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        cached_mtime, list = cache[path]
2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del cache[path]
2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    except KeyError:
2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        cached_mtime, list = -1, []
2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    mtime = os.stat(path).st_mtime
2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if mtime != cached_mtime:
3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        list = os.listdir(path)
3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        list.sort()
3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    cache[path] = mtime, list
3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    return list
3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehopendir = listdir # XXX backward compatibility
3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef annotate(head, list):
3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Add '/' suffixes to directories."""
3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    for i in range(len(list)):
4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if os.path.isdir(os.path.join(head, list[i])):
4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            list[i] = list[i] + '/'
42