1
0
mirror of https://github.com/git/git synced 2024-07-02 15:48:44 +00:00

fsmonitor: allow all entries for a folder to be invalidated

Allow fsmonitor to report directory changes by reporting paths with a
trailing slash.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Kevin Willford <Kevin.Willford@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Reviewed-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Kevin Willford 2021-02-03 15:34:49 +00:00 committed by Junio C Hamano
parent 29fbbf43a0
commit ff03836b9d

View File

@ -190,13 +190,34 @@ int fsmonitor_is_trivial_response(const struct strbuf *query_result)
return is_trivial;
}
static void fsmonitor_refresh_callback(struct index_state *istate, const char *name)
static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
{
int pos = index_name_pos(istate, name, strlen(name));
int i, len = strlen(name);
if (name[len - 1] == '/') {
if (pos >= 0) {
struct cache_entry *ce = istate->cache[pos];
ce->ce_flags &= ~CE_FSMONITOR_VALID;
/*
* TODO We should binary search to find the first path with
* TODO this directory prefix. Then linearly update entries
* TODO while the prefix matches. Taking care to search without
* TODO the trailing slash -- because '/' sorts after a few
* TODO interesting special chars, like '.' and ' '.
*/
/* Mark all entries for the folder invalid */
for (i = 0; i < istate->cache_nr; i++) {
if (istate->cache[i]->ce_flags & CE_FSMONITOR_VALID &&
starts_with(istate->cache[i]->name, name))
istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
}
/* Need to remove the / from the path for the untracked cache */
name[len - 1] = '\0';
} else {
int pos = index_name_pos(istate, name, strlen(name));
if (pos >= 0) {
struct cache_entry *ce = istate->cache[pos];
ce->ce_flags &= ~CE_FSMONITOR_VALID;
}
}
/*