"""Maintain a cache of stat() information on files.

There are functions to reset the cache or to selectively remove items.
"""

import os
from stat import *

# The cache.
# Keys are pathnames, values are `os.stat' outcomes.
#
cache = {}


def stat(path):
    """Stat a file, possibly out of the cache."""
    if cache.has_key(path):
        return cache[path]
    cache[path] = ret = os.stat(path)
    return ret


def reset():
    """Reset the cache completely."""
    global cache
    cache = {}


def forget(path):
    """Remove a given item from the cache, if it exists."""
    if cache.has_key(path):
        del cache[path]


def forget_prefix(prefix):
    """Remove all pathnames with a given prefix."""
    n = len(prefix)
    for path in cache.keys():
        if path[:n] == prefix:
            del cache[path]


def forget_dir(prefix):
    """Forget about a directory and all entries in it, but not about
    entries in subdirectories."""
    if prefix[-1:] == '/' and prefix != '/':
        prefix = prefix[:-1]
    forget(prefix)
    if prefix[-1:] != '/':
        prefix = prefix + '/'
    n = len(prefix)
    for path in cache.keys():
        if path[:n] == prefix:
            rest = path[n:]
            if rest[-1:] == '/': rest = rest[:-1]
            if '/' not in rest:
                del cache[path]


def forget_except_prefix(prefix):
    """Remove all pathnames except with a given prefix.
    Normally used with prefix = '/' after a chdir()."""
    n = len(prefix)
    for path in cache.keys():
        if path[:n] != prefix:
            del cache[path]


def isdir(path):
    """Check for directory."""
    try:
        st = stat(path)
    except os.error:
        return 0
    return S_ISDIR(st[ST_MODE])
