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>
This commit is contained in:
committed by
Junio C Hamano
parent
8ed0a740dd
commit
98fa473887
28
read-cache.c
28
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user