Re: [PATCH v4 4/4] fsmonitor: normalize FSEvents event paths to the real path
- From
- Jeff Hostetler <git@jeffhostetler.com>
- Date
- Sep 1, 2022, 20:05 UTC
- Message-ID
- <bdf26d53-7068-87a6-484b-aeef99be35bd@jeffhostetler.com>
- In-Reply-To
- <56cabf3be3b9e228bc948da372db4c9d11fd3926.1661962145.git.gitgitgadget@gmail.com>
On 8/31/22 12:09 PM, Eric DeCosta via GitGitGadget wrote:
Show 14 quoted lines
> From: Eric DeCosta <edecosta@mathworks.com> > > Consider the following network working directory that is mounted under > /System/Volumes/Data: > > /network/working/directory > > The git working directory path is: > > /System/Volumes/Data/network/working/directory > > The paths reported by FSEvents always start with /network. fsmonitor > expects paths to be under the working directory; therefore it > fails to match /network/... and ignores the change.
I'm not sure I understand what's going on here. Are you saying that FSEvents reports network mounted directories with a path relative to the mount-point rather than an absolute path?
In your example, is "/network/working/directory" a valid path on your system (that also happens to be the same directory as "/System/Volumes/...")
That is, do you have some aliasing going on where both paths are valid -- like a pair of hard-linked directories? Or, is there something special about a network mount point?
Did you have to "cd /System/Volumes/..." to get Git to have the absolute path be this? Or were you doing a "cd /network/..."? (Sorry to ask so many questions but I don't have a pair of systems to test any of this on right now.)
Show 40 quoted lines
>
> Change things such that if fsmonitor.allowRemote is true that the
> paths reported via FSEevents are normalized to the real path.
>
> Signed-off-by: Eric DeCosta <edecosta@mathworks.com>
> ---
> compat/fsmonitor/fsm-listen-darwin.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/compat/fsmonitor/fsm-listen-darwin.c b/compat/fsmonitor/fsm-listen-darwin.c
> index 8e208e8289e..2ed828649ff 100644
> --- a/compat/fsmonitor/fsm-listen-darwin.c
> +++ b/compat/fsmonitor/fsm-listen-darwin.c
> @@ -26,6 +26,7 @@
> #include "fsmonitor.h"
> #include "fsm-listen.h"
> #include "fsmonitor--daemon.h"
> +#include "fsmonitor-settings.h"
>
> struct fsm_listen_data
> {
> @@ -183,7 +184,6 @@ static void my_add_path(struct fsmonitor_batch *batch, const char *path)
> free(composed);
> }
>
> -
> static void fsevent_callback(ConstFSEventStreamRef streamRef,
> void *ctx,
> size_t num_of_events,
> @@ -209,7 +209,12 @@ static void fsevent_callback(ConstFSEventStreamRef streamRef,
> /*
> * On Mac, we receive an array of absolute paths.
> */
> - path_k = paths[k];
> + if (fsm_settings__get_allow_remote(the_repository) > 0) {
> + strbuf_reset(&tmp);
> + strbuf_realpath_forgiving(&tmp, paths[k], 0);
> + path_k = tmp.buf;
> + } else
> + path_k = paths[k];This feels wrong.
It is not that fsmonitor.allowRemote is true, but whether or not this particular file system *IS* remote, right?
Show 20 quoted lines
> > /* > * If you want to debug FSEvents, log them to GIT_TRACE_FSMONITOR. > @@ -237,6 +242,7 @@ static void fsevent_callback(ConstFSEventStreamRef streamRef, > > fsmonitor_force_resync(state); > fsmonitor_batch__free_list(batch); > + batch = NULL; > string_list_clear(&cookie_list, 0); > > /* > @@ -313,7 +319,6 @@ static void fsevent_callback(ConstFSEventStreamRef streamRef, > > case IS_WORKDIR_PATH: > /* try to queue normal pathnames */ > - > if (trace_pass_fl(&trace_fsmonitor)) > log_flags_set(path_k, event_flags[k]); > >