On Thu, 9 Jul 2009, Junio C Hamano wrote: > > I was wondering if we could also say that D exists as a directory when we > know there is D/F in the index and is up to date. Yeah, that would probably be a good thing, but is slightly slower to look up (we have the name hashing for the case-ignoring code anyway, but that only works for exact names, so you can't look up directories that way). You'd have to use the regular binary search for that (or we'd have to change it to hash directories too - which we might want to do for other reasons, but don't do now). Something like this? Linus --- dir.c | 39 ++++++++++++++++++++++++++++++++++----- 1 files changed, 34 insertions(+), 5 deletions(-) diff --git a/dir.c b/dir.c index 8a9e7d8..fb7432e 100644 --- a/dir.c +++ b/dir.c @@ -566,18 +566,47 @@ static int in_pathspec(const char *path, int len, const struct path_simplify *si return 0; } +static int get_index_mode(const char *path, int len) +{ + int pos; + struct cache_entry *ce; + + ce = cache_name_exists(path, len, 0); + if (ce) { + if (ce_uptodate(ce)) + return ce->ce_mode; + return 0; + } + + /* Try to look it up as a directory */ + pos = cache_name_pos(path, len); + if (pos >= 0) + return 0; + pos = -pos-1; + while (pos < active_nr) { + ce = active_cache[pos++]; + if (strncmp(ce->name, path, len)) + break; + if (ce->name[len] > '/') + break; + if (ce->name[len] < '/') + continue; + if (!ce_uptodate(ce)) + break; /* continue? */ + return S_IFDIR; + } + return 0; +} + static int get_dtype(struct dirent *de, const char *path, int len) { int dtype = de ? DTYPE(de) : DT_UNKNOWN; - struct cache_entry *ce; struct stat st; if (dtype != DT_UNKNOWN) return dtype; - ce = cache_name_exists(path, len, 0); - if (ce && ce_uptodate(ce)) - st.st_mode = ce->ce_mode; - else if (lstat(path, &st)) + st.st_mode = get_index_mode(path, len); + if (!st.st_mode && lstat(path, &st)) return dtype; if (S_ISREG(st.st_mode)) return DT_REG; -- 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