aboutsummaryrefslogtreecommitdiffstats
path: root/fsmonitor.c
diff options
context:
space:
mode:
authorJeff Hostetler <jeffhostetler@github.com>2024-02-26 21:39:20 +0000
committerJunio C Hamano <gitster@pobox.com>2024-02-26 15:34:03 -0800
commita52482036cde8d2cd779039a70162fda9bd1c29a (patch)
treea03af7ff1a7e82720b034286b0eb365ffa443596 /fsmonitor.c
parent7c97174dcd6d0f5327cc9b9ddf171ba1d9bba91c (diff)
downloadgit-a52482036cde8d2cd779039a70162fda9bd1c29a.tar.gz
fsmonitor: return invalidated cache-entry count on directory event
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>
Diffstat (limited to 'fsmonitor.c')
-rw-r--r--fsmonitor.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/fsmonitor.c b/fsmonitor.c
index 2f58ee2fe5..9424bd1723 100644
--- a/fsmonitor.c
+++ b/fsmonitor.c
@@ -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)