diff options
author | Jeff King <peff@peff.net> | 2008-10-16 11:07:26 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-10-17 12:46:59 -0700 |
commit | 98fa473887d0bebd38d568bb07232a336a642dcf (patch) | |
tree | bce65b20193d1fc4f51ca64d6bdad4718609ff29 /read-cache.c | |
parent | 8ed0a740dd42bd0724aebed6e3b07c4ea2a2d5e8 (diff) | |
download | git-98fa473887d0bebd38d568bb07232a336a642dcf.tar.gz git-98fa473887d0bebd38d568bb07232a336a642dcf.tar.xz |
refactor handling of "other" files in ls-files and status
When the "git status" display code was originally converted
to C, we copied the code from ls-files to discover whether a
pathname returned by read_directory was an "other", or
untracked, file.
Much later, 5698454e updated the code in ls-files to handle
some new cases caused by gitlinks. This left the code in
wt-status.c broken: it would display submodule directories
as untracked directories. Nobody noticed until now, however,
because unless status.showUntrackedFiles was set to "all",
submodule directories were not actually reported by
read_directory. So the bug was only triggered in the
presence of a submodule _and_ this config option.
This patch pulls the ls-files code into a new function,
cache_name_is_other, and uses it in both places. This should
leave the ls-files functionality the same and fix the bug
in status.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'read-cache.c')
-rw-r--r-- | read-cache.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/read-cache.c b/read-cache.c index 8f96fd172..4e067e489 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1480,3 +1480,31 @@ int read_index_unmerged(struct index_state *istate) istate->cache_nr = dst - istate->cache; return !!last; } + +/* + * Returns 1 if the path is an "other" path with respect to + * the index; that is, the path is not mentioned in the index at all, + * either as a file, a directory with some files in the index, + * or as an unmerged entry. + * + * We helpfully remove a trailing "/" from directories so that + * the output of read_directory can be used as-is. + */ +int index_name_is_other(const struct index_state *istate, const char *name, + int namelen) +{ + int pos; + if (namelen && name[namelen - 1] == '/') + namelen--; + pos = index_name_pos(istate, name, namelen); + if (0 <= pos) + return 0; /* exact match */ + pos = -pos - 1; + if (pos < istate->cache_nr) { + struct cache_entry *ce = istate->cache[pos]; + if (ce_namelen(ce) == namelen && + !memcmp(ce->name, name, namelen)) + return 0; /* Yup, this one exists unmerged */ + } + return 1; +} |