]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fsmonitor: return invalidated cache-entry count on directory event
authorJeff Hostetler <jeffhostetler@github.com>
Mon, 26 Feb 2024 21:39:20 +0000 (21:39 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 26 Feb 2024 23:34:03 +0000 (15:34 -0800)
Teach the refresh callback helper function for directory FSEvents to
return the number of cache-entries that were invalidated in response
to a directory event.

This will be used in a later commit to help determine if the observed
pathname in the FSEvent was a (possibly) case-incorrect directory
prefix (on a case-insensitive filesystem) of one or more actual
cache-entries.

If there exists at least one case-insensitive prefix match, then we
can assume that the directory is a (case-incorrect) prefix of at least
one tracked item rather than a completely unknown/untracked file or
directory.

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
fsmonitor.c

index 2f58ee2fe5af8e5b48c8eb6c50d87b4914f942d2..9424bd172307d5ad0424f50367b4d5c6c1f6db2d 100644 (file)
@@ -253,11 +253,20 @@ static void handle_path_without_trailing_slash(
  * same way and just invalidate the cache-entry and the untracked
  * cache (and in this case, the forward cache-entry scan won't find
  * anything and it doesn't hurt to let it run).
+ *
+ * Return the number of cache-entries that we invalidated.  We will
+ * use this later to determine if we need to attempt a second
+ * case-insensitive search on case-insensitive file systems.  That is,
+ * if the search using the observed-case in the FSEvent yields any
+ * results, we assume the prefix is case-correct.  If there are no
+ * matches, we still don't know if the observed path is simply
+ * untracked or case-incorrect.
  */
-static void handle_path_with_trailing_slash(
+static size_t handle_path_with_trailing_slash(
        struct index_state *istate, const char *name, int pos)
 {
        int i;
+       size_t nr_in_cone = 0;
 
        /*
         * Mark the untracked cache dirty for this directory path
@@ -276,7 +285,10 @@ static void handle_path_with_trailing_slash(
                if (!starts_with(istate->cache[i]->name, name))
                        break;
                istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
+               nr_in_cone++;
        }
+
+       return nr_in_cone;
 }
 
 static void fsmonitor_refresh_callback(struct index_state *istate, char *name)