Re: [PATCH v2 06/16] fsmonitor: refactor refresh callback for non-directory events
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Feb 23, 2024, 08:18 UTC
- Message-ID
- <xmqq5xyf1tmu.fsf@gitster.g>
- In-Reply-To
- <7ee6ca1aefd34a37d749300e317df10d80ef2b29.1708658300.git.gitgitgadget@gmail.com>
"Jeff Hostetler via GitGitGadget" <gitgitgadget@gmail.com> writes:
> From: Jeff Hostetler <jeffhostetler@github.com> > > Move the code handle unqualified FSEvents (without a trailing slash) > into a helper function.
-ECANNOTPARSE. "code handle" -> "code that handles"?
In the patch text itself, there is nothing unexpected. Looking good.
Thanks.
Show 98 quoted lines
> Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
> ---
> fsmonitor.c | 67 +++++++++++++++++++++++++++++++----------------------
> 1 file changed, 39 insertions(+), 28 deletions(-)
>
> diff --git a/fsmonitor.c b/fsmonitor.c
> index 29cce32d81c..364198d258f 100644
> --- a/fsmonitor.c
> +++ b/fsmonitor.c
> @@ -183,6 +183,43 @@ static int query_fsmonitor_hook(struct repository *r,
> return result;
> }
>
> +static void handle_path_without_trailing_slash(
> + struct index_state *istate, const char *name, int pos)
> +{
> + int i;
> +
> + if (pos >= 0) {
> + /*
> + * We have an exact match for this path and can just
> + * invalidate it.
> + */
> + istate->cache[pos]->ce_flags &= ~CE_FSMONITOR_VALID;
> + } else {
> + /*
> + * The path is not a tracked file -or- it is a
> + * directory event on a platform that cannot
> + * distinguish between file and directory events in
> + * the event handler, such as Windows.
> + *
> + * Scan as if it is a directory and invalidate the
> + * cone under it. (But remember to ignore items
> + * between "name" and "name/", such as "name-" and
> + * "name.".
> + */
> + int len = strlen(name);
> + pos = -pos - 1;
> +
> + for (i = pos; i < istate->cache_nr; i++) {
> + if (!starts_with(istate->cache[i]->name, name))
> + break;
> + if ((unsigned char)istate->cache[i]->name[len] > '/')
> + break;
> + if (istate->cache[i]->name[len] == '/')
> + istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
> + }
> + }
> +}
> +
> /*
> * The daemon can decorate directory events, such as a move or rename,
> * by adding a trailing slash to the observed name. Use this to
> @@ -225,7 +262,7 @@ static void handle_path_with_trailing_slash(
>
> static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
> {
> - int i, len = strlen(name);
> + int len = strlen(name);
> int pos = index_name_pos(istate, name, len);
>
> trace_printf_key(&trace_fsmonitor,
> @@ -240,34 +277,8 @@ static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
> * for the untracked cache.
> */
> name[len - 1] = '\0';
> - } else if (pos >= 0) {
> - /*
> - * We have an exact match for this path and can just
> - * invalidate it.
> - */
> - istate->cache[pos]->ce_flags &= ~CE_FSMONITOR_VALID;
> } else {
> - /*
> - * The path is not a tracked file -or- it is a
> - * directory event on a platform that cannot
> - * distinguish between file and directory events in
> - * the event handler, such as Windows.
> - *
> - * Scan as if it is a directory and invalidate the
> - * cone under it. (But remember to ignore items
> - * between "name" and "name/", such as "name-" and
> - * "name.".
> - */
> - pos = -pos - 1;
> -
> - for (i = pos; i < istate->cache_nr; i++) {
> - if (!starts_with(istate->cache[i]->name, name))
> - break;
> - if ((unsigned char)istate->cache[i]->name[len] > '/')
> - break;
> - if (istate->cache[i]->name[len] == '/')
> - istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
> - }
> + handle_path_without_trailing_slash(istate, name, pos);
> }
>
> /*