On Tue, Feb 13, 2024 at 08:52:13PM +0000, Jeff Hostetler via GitGitGadget wrote: > From: Jeff Hostetler <jeffhostetler@xxxxxxxxxx> > > Signed-off-by: Jeff Hostetler <jeffhostetler@xxxxxxxxxx> > --- > 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 > + /* > + * 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 > >
Attachment:
signature.asc
Description: PGP signature