view mercurial/osutil.py @ 7305:c21d236ca897

hgweb: descend empty directories in web view When a manifest has a series of directories with nothing in them but a single directory, displaying the entire chain of empty directories allows for navigation down to the first non-empty directory with a single click. Because Java links package hierarchy to directory hierarchy, and because Java conventions include at least three empty directories at the top of this hierarchy, descending down empty directories is very common in Java web tools.
author Ry4an Brase <ry4an-hg@ry4an.org>
date Mon, 03 Nov 2008 10:20:28 +0100
parents 00d76fa3ffba
children
line wrap: on
line source

import os
import stat as _stat

def _mode_to_kind(mode):
    if _stat.S_ISREG(mode): return _stat.S_IFREG
    if _stat.S_ISDIR(mode): return _stat.S_IFDIR
    if _stat.S_ISLNK(mode): return _stat.S_IFLNK
    if _stat.S_ISBLK(mode): return _stat.S_IFBLK
    if _stat.S_ISCHR(mode): return _stat.S_IFCHR
    if _stat.S_ISFIFO(mode): return _stat.S_IFIFO
    if _stat.S_ISSOCK(mode): return _stat.S_IFSOCK
    return mode

def listdir(path, stat=False, skip=None):
    '''listdir(path, stat=False) -> list_of_tuples

    Return a sorted list containing information about the entries
    in the directory.

    If stat is True, each element is a 3-tuple:

      (name, type, stat object)

    Otherwise, each element is a 2-tuple:

      (name, type)
    '''
    result = []
    prefix = path
    if not prefix.endswith(os.sep):
        prefix += os.sep
    names = os.listdir(path)
    names.sort()
    for fn in names:
        st = os.lstat(prefix + fn)
        if fn == skip and _stat.S_ISDIR(st.st_mode):
            return []
        if stat:
            result.append((fn, _mode_to_kind(st.st_mode), st))
        else:
            result.append((fn, _mode_to_kind(st.st_mode)))
    return result