This speeds up the case when you run git-status, having an untracked subdirectory containing huge amounts of files. It also clarifies the handling of hide_empty_directories; the old version worked, but was hard to understand. Signed-off-by: Johannes Schindelin <Johannes.Schindelin@xxxxxx> --- dir.c | 24 +++++++++++++++--------- 1 files changed, 15 insertions(+), 9 deletions(-) diff --git a/dir.c b/dir.c index e2f472b..e69663c 100644 --- a/dir.c +++ b/dir.c @@ -274,6 +274,15 @@ static int dir_exists(const char *dirnam return !strncmp(active_cache[pos]->name, dirname, len); } +static int dir_is_empty(const char *dirname) +{ + DIR *fdir = opendir(dirname); + int result = (readdir(fdir) == NULL); + + closedir(fdir); + return result; +} + /* * Read a directory tree. We currently ignore anything but * directories, regular files and symlinks. That's because git @@ -314,7 +323,6 @@ static int read_directory_recursive(stru switch (DTYPE(de)) { struct stat st; - int subdir, rewind_base; default: continue; case DT_UNKNOWN: @@ -328,18 +336,16 @@ static int read_directory_recursive(stru case DT_DIR: memcpy(fullname + baselen + len, "/", 2); len++; - rewind_base = dir->nr; - subdir = read_directory_recursive(dir, fullname, fullname, - baselen + len); if (dir->show_other_directories && - (subdir || !dir->hide_empty_directories) && !dir_exists(fullname, baselen + len)) { - /* Rewind the read subdirectory */ - while (dir->nr > rewind_base) - free(dir->entries[--dir->nr]); + if (dir->hide_empty_directories && + dir_is_empty(fullname)) + continue; break; } - contents += subdir; + + contents += read_directory_recursive(dir, + fullname, fullname, baselen + len); continue; case DT_REG: case DT_LNK: -- 1.4.2.1.g78cd-dirty - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html