]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fsmonitor: allow all entries for a folder to be invalidated
authorKevin Willford <Kevin.Willford@microsoft.com>
Wed, 3 Feb 2021 15:34:49 +0000 (15:34 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 17 Feb 2021 01:14:35 +0000 (17:14 -0800)
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>
fsmonitor.c

index 3105dc370ab6c2e597bfef8e738642d13bab787e..64deeda597ead87ef0daa94cebb3b6e91b5a744b 100644 (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] == '/') {
+
+               /*
+                * 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;
+               if (pos >= 0) {
+                       struct cache_entry *ce = istate->cache[pos];
+                       ce->ce_flags &= ~CE_FSMONITOR_VALID;
+               }
        }
 
        /*