14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""Read and cache directory listings.
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThe listdir() routine returns a sorted list of the files in a directory,
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaousing a cache to avoid reading the directory more often than necessary.
54adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThe annotate() routine appends slashes to directories."""
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom warnings import warnpy3k
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaowarnpy3k("the dircache module has been removed in Python 3.0", stacklevel=2)
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodel warnpy3k
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__ = ["listdir", "opendir", "annotate", "reset"]
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocache = {}
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef reset():
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Reset the cache completely."""
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    global cache
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    cache = {}
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef listdir(path):
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """List directory contents, using cache."""
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cached_mtime, list = cache[path]
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del cache[path]
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except KeyError:
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cached_mtime, list = -1, []
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    mtime = os.stat(path).st_mtime
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if mtime != cached_mtime:
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        list = os.listdir(path)
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        list.sort()
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    cache[path] = mtime, list
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return list
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoopendir = listdir # XXX backward compatibility
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef annotate(head, list):
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Add '/' suffixes to directories."""
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for i in range(len(list)):
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if os.path.isdir(os.path.join(head, list[i])):
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            list[i] = list[i] + '/'
42