Re: [PATCH 04/12] fsmonitor: refactor refresh callback on directory events
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Feb 15, 2024, 09:32 UTC
- Message-ID
- <Zc3aGSbEIFVClRd_@tanuki>
- In-Reply-To
- <3fb8e0d0a7c0455cc7a5ba28c12736fd4bbbd44e.1707857541.git.gitgitgadget@gmail.com>
On Tue, Feb 13, 2024 at 08:52:13PM +0000, Jeff Hostetler via GitGitGadget wrote:
Show 17 quoted lines
> From: Jeff Hostetler <jeffhostetler@github.com> > > Signed-off-by: Jeff Hostetler <jeffhostetler@github.com> > --- > fsmonitor.c | 52 ++++++++++++++++++++++++++++++---------------------- > 1 file changed, 30 insertions(+), 22 deletions(-) > > diff --git a/fsmonitor.c b/fsmonitor.c > index f670c509378..b1ef01bf3cd 100644 > --- a/fsmonitor.c > +++ b/fsmonitor.c > @@ -183,6 +183,35 @@ static int query_fsmonitor_hook(struct repository *r, > return result; > } > > +static void fsmonitor_refresh_callback_slash( > + struct index_state *istate, const char *name, int len, int pos)
`len` should be `size_t` as it tracks the length of the name. This is a preexisting issue already because `fsmonitor_refresh_callback()` assigns `int len = strlen(name)`, which is wrong.
> +{
> + int i;`i` is used to iterate through `istate->cache_nr`, which is an `unsigned int` and not an `int`. I really wish we would compile the Git code base with `-Wconversion`, but that's a rather big undertaking.
Anyway, none of these issues are new as you merely move the code into a new function.
Patrick
Show 61 quoted lines
> + /*
> + * The daemon can decorate directory events, such as
> + * moves or renames, with a trailing slash if the OS
> + * FS Event contains sufficient information, such as
> + * MacOS.
> + *
> + * Use this to invalidate the entire cone under that
> + * directory.
> + *
> + * We do not expect an exact match because the index
> + * does not normally contain directory entries, so we
> + * start at the insertion point and scan.
> + */
> + if (pos < 0)
> + pos = -pos - 1;
> +
> + /* Mark all entries for the folder invalid */
> + for (i = pos; i < istate->cache_nr; i++) {
> + if (!starts_with(istate->cache[i]->name, name))
> + break;
> + istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
> + }
> +}
> +
> static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
> {
> int i, len = strlen(name);
> @@ -193,28 +222,7 @@ static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
> name, pos);
>
> if (name[len - 1] == '/') {
> - /*
> - * The daemon can decorate directory events, such as
> - * moves or renames, with a trailing slash if the OS
> - * FS Event contains sufficient information, such as
> - * MacOS.
> - *
> - * Use this to invalidate the entire cone under that
> - * directory.
> - *
> - * We do not expect an exact match because the index
> - * does not normally contain directory entries, so we
> - * start at the insertion point and scan.
> - */
> - if (pos < 0)
> - pos = -pos - 1;
> -
> - /* Mark all entries for the folder invalid */
> - for (i = pos; i < istate->cache_nr; i++) {
> - if (!starts_with(istate->cache[i]->name, name))
> - break;
> - istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
> - }
> + fsmonitor_refresh_callback_slash(istate, name, len, pos);
>
> /*
> * We need to remove the traling "/" from the path
> --
> gitgitgadget
>
>