git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: "Eric DeCosta via GitGitGadget" <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, "Jeff Hostetler" <git@jeffhostetler.com>,
	"Eric Sunshine" <sunshine@sunshineco.com>,
	"Torsten Bögershausen" <tboegi@web.de>,
	"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
	"Ramsay Jones" <ramsay@ramsayjones.plus.com>,
	"Johannes Schindelin" <Johannes.Schindelin@gmx.de>,
	"Eric DeCosta" <edecosta@mathworks.com>
Subject: Re: [PATCH v5 0/4] fsmonitor: option to allow fsmonitor to run against network-mounted repos
Date: Mon, 12 Sep 2022 08:27:04 -0700	[thread overview]
Message-ID: <xmqqedwghauv.fsf@gitster.g> (raw)
In-Reply-To: <pull.1326.v5.git.1662840031.gitgitgadget@gmail.com> (Eric DeCosta via GitGitGadget's message of "Sat, 10 Sep 2022 20:00:27 +0000")

"Eric DeCosta via GitGitGadget" <gitgitgadget@gmail.com> writes:

> Follow-on to the work done to allow Windows to work against network-mounted
> repos for macOS.
>
> Have macOS take advantage of the same configuration option,
> 'fsmonitor.allowRemote' that was introduced for Windows. Setting this option
> to true will override the default behavior (erroring-out) when a
> network-mounted repo is detected by fsmonitor.
>
> The added wrinkle being that the Unix domain socket (UDS) file used for IPC
> cannot be created in a network location; instead $HOME is used if the
> default location is on the network. The user may, optionally, set the
> 'fsmonitor.socketDir' configuration option to a valid, local directory if
> $HOME itself is on the network or is simply not the desired location for the
> UDS file.
>
> An additional issue is that for mount points in the root directory, FSEvents
> does not report a path that matches the worktree directory due to the
> introduction of 'synthetic firmlinks'. fsmonitor must map the FSEvents paths
> to the worktree directory by interrogating the root filesystem for synthetic
> firmlinks and using that information to translate the path.
>
> Eric DeCosta (4):
>   fsmonitor: refactor filesystem checks to common interface
>   fsmonitor: relocate socket file if .git directory is remote
>   fsmonitor: avoid socket location check if using hook
>   fsmonitor: deal with synthetic firmlinks on macOS

It looks like this one is organized quite differently from the last
iteration <pull.1326.v4.git.1661962145.gitgitgadget@gmail.com>

Unless the changes since the last iteration is so obvious [*] that
range-diff will explain all of it, it would help the topic to make
it easier for reviewers what has changed relative to the previous
one in your own words here in the cover letter.

[*} Here, "obvious" does not mean "diff is small and can be read in
10 minutes".  It is "diff shows the reason why these changes are
made, so there is no need for additional explanation", e.g. typofixes,
renaming of variables, making a helper function that was added as
extern in the previous iteration to static, etc.

Thanks.

>  Makefile                                 |   2 +
>  builtin/fsmonitor--daemon.c              |   8 ++
>  compat/fsmonitor/fsm-ipc-darwin.c        |  46 ++++++++
>  compat/fsmonitor/fsm-ipc-win32.c         |   4 +
>  compat/fsmonitor/fsm-listen-darwin.c     |   6 +-
>  compat/fsmonitor/fsm-path-utils-darwin.c | 131 +++++++++++++++++++++++
>  compat/fsmonitor/fsm-path-utils-win32.c  | 106 ++++++++++++++++++
>  compat/fsmonitor/fsm-settings-darwin.c   |  70 ++++--------
>  compat/fsmonitor/fsm-settings-win32.c    | 106 +-----------------
>  contrib/buildsystems/CMakeLists.txt      |   4 +
>  fsmonitor--daemon.h                      |   6 ++
>  fsmonitor-ipc.c                          |   2 -
>  fsmonitor-path-utils.h                   |  49 +++++++++
>  fsmonitor-settings.c                     |  58 +++++++++-
>  fsmonitor-settings.h                     |   2 +-
>  15 files changed, 441 insertions(+), 159 deletions(-)
>  create mode 100644 compat/fsmonitor/fsm-ipc-darwin.c
>  create mode 100644 compat/fsmonitor/fsm-ipc-win32.c
>  create mode 100644 compat/fsmonitor/fsm-path-utils-darwin.c
>  create mode 100644 compat/fsmonitor/fsm-path-utils-win32.c
>  create mode 100644 fsmonitor-path-utils.h
>
>
> base-commit: be1a02a17ede4082a86dfbfee0f54f345e8b43ac
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1326%2Fedecosta-mw%2Ffsmonitor_macos-v5
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1326/edecosta-mw/fsmonitor_macos-v5
> Pull-Request: https://github.com/gitgitgadget/git/pull/1326
>
> Range-diff vs v4:
>
>  -:  ----------- > 1:  2f647b53e4d fsmonitor: refactor filesystem checks to common interface
>  2:  2cb026a6317 ! 2:  28d08bcf808 fsmonitor: generate unique Unix socket file name in the desired location
>      @@ Metadata
>       Author: Eric DeCosta <edecosta@mathworks.com>
>       
>        ## Commit message ##
>      -    fsmonitor: generate unique Unix socket file name in the desired location
>      +    fsmonitor: relocate socket file if .git directory is remote
>       
>      -    Based on the values of fsmonitor.allowRemote and fsmonitor.socketDir
>      -    locate the Unix domain socket file in the desired location (either
>      -    the .git directory, $HOME, or fsmonitor.socketDir). If the location
>      -    is other than the .git directory, generate a unique file name based
>      -    on the SHA1 has of the path to the .git directory.
>      +    If the .git directory is on a remote file system, create the socket
>      +    file in 'fsmonitor.socketDir' if it is defined, else create it in $HOME.
>       
>           Signed-off-by: Eric DeCosta <edecosta@mathworks.com>
>       
>      - ## fsmonitor-ipc.c ##
>      -@@
>      - #include "cache.h"
>      --#include "fsmonitor.h"
>      --#include "simple-ipc.h"
>      - #include "fsmonitor-ipc.h"
>      -+#include "fsmonitor-settings.h"
>      - #include "run-command.h"
>      - #include "strbuf.h"
>      - #include "trace2.h"
>      -@@ fsmonitor-ipc.c: int fsmonitor_ipc__is_supported(void)
>      - 	return 1;
>      - }
>      + ## Makefile ##
>      +@@ Makefile: ifdef FSMONITOR_DAEMON_BACKEND
>      + 	COMPAT_CFLAGS += -DHAVE_FSMONITOR_DAEMON_BACKEND
>      + 	COMPAT_OBJS += compat/fsmonitor/fsm-listen-$(FSMONITOR_DAEMON_BACKEND).o
>      + 	COMPAT_OBJS += compat/fsmonitor/fsm-health-$(FSMONITOR_DAEMON_BACKEND).o
>      ++	COMPAT_OBJS += compat/fsmonitor/fsm-ipc-$(FSMONITOR_DAEMON_BACKEND).o
>      + endif
>        
>      --GIT_PATH_FUNC(fsmonitor_ipc__get_path, "fsmonitor--daemon.ipc")
>      -+GIT_PATH_FUNC(fsmonitor_ipc__get_default_path, "fsmonitor--daemon.ipc")
>      + ifdef FSMONITOR_OS_SETTINGS
>      +
>      + ## compat/fsmonitor/fsm-ipc-darwin.c (new) ##
>      +@@
>      ++#include "cache.h"
>      ++#include "config.h"
>      ++#include "strbuf.h"
>      ++#include "fsmonitor.h"
>      ++#include "fsmonitor-ipc.h"
>      ++#include "fsmonitor-path-utils.h"
>      ++
>      ++static GIT_PATH_FUNC(fsmonitor_ipc__get_default_path, "fsmonitor--daemon.ipc")
>       +
>       +const char *fsmonitor_ipc__get_path(void)
>       +{
>      -+#ifdef WIN32
>      -+	return fsmonitor_ipc__get_default_path();
>      -+#else
>      -+	char *retval;
>      ++	static const char *ipc_path;
>       +	SHA_CTX sha1ctx;
>      -+	const char *git_dir;
>      -+	const char *sock_dir;
>      ++	char *sock_dir;
>       +	struct strbuf ipc_file = STRBUF_INIT;
>       +	unsigned char hash[SHA_DIGEST_LENGTH];
>       +
>      -+	if (fsm_settings__get_allow_remote(the_repository) < 1)
>      -+		return fsmonitor_ipc__get_default_path();
>      ++	if (ipc_path)
>      ++		return ipc_path;
>       +
>      -+	git_dir = get_git_dir();
>      -+	sock_dir = fsm_settings__get_socket_dir(the_repository);
>      ++	ipc_path = fsmonitor_ipc__get_default_path();
>      ++
>      ++	/* By default the socket file is created in the .git directory */
>      ++	if (fsmonitor__is_fs_remote(ipc_path) < 1)
>      ++		return ipc_path;
>       +
>       +	SHA1_Init(&sha1ctx);
>      -+	SHA1_Update(&sha1ctx, git_dir, strlen(git_dir));
>      ++	SHA1_Update(&sha1ctx, the_repository->worktree, strlen(the_repository->worktree));
>       +	SHA1_Final(hash, &sha1ctx);
>       +
>      ++	repo_config_get_string(the_repository, "fsmonitor.socketdir", &sock_dir);
>      ++
>      ++	/* Create the socket file in either socketDir or $HOME */
>       +	if (sock_dir && *sock_dir)
>       +		strbuf_addf(&ipc_file, "%s/.git-fsmonitor-%s",
>       +					sock_dir, hash_to_hex(hash));
>       +	else
>       +		strbuf_addf(&ipc_file, "~/.git-fsmonitor-%s", hash_to_hex(hash));
>      -+	retval = interpolate_path(ipc_file.buf, 1);
>      -+	if (!retval)
>      ++
>      ++	ipc_path = interpolate_path(ipc_file.buf, 1);
>      ++	if (!ipc_path)
>       +		die(_("Invalid path: %s"), ipc_file.buf);
>      ++
>       +	strbuf_release(&ipc_file);
>      -+	return retval;
>      -+#endif
>      ++	return ipc_path;
>       +}
>      +
>      + ## compat/fsmonitor/fsm-ipc-win32.c (new) ##
>      +@@
>      ++#include "cache.h"
>      ++#include "fsmonitor-ipc.h"
>      ++
>      ++GIT_PATH_FUNC(fsmonitor_ipc__get_path, "fsmonitor--daemon.ipc")
>      +
>      + ## contrib/buildsystems/CMakeLists.txt ##
>      +@@ contrib/buildsystems/CMakeLists.txt: if(SUPPORTS_SIMPLE_IPC)
>      + 		add_compile_definitions(HAVE_FSMONITOR_DAEMON_BACKEND)
>      + 		list(APPEND compat_SOURCES compat/fsmonitor/fsm-listen-win32.c)
>      + 		list(APPEND compat_SOURCES compat/fsmonitor/fsm-health-win32.c)
>      ++		list(APPEND compat_SOURCES compat/fsmonitor/fsm-ipc-win32.c)
>      + 		list(APPEND compat_SOURCES compat/fsmonitor/fsm-path-utils-win32.c)
>        
>      - enum ipc_active_state fsmonitor_ipc__get_state(void)
>      - {
>      + 		add_compile_definitions(HAVE_FSMONITOR_OS_SETTINGS)
>      +@@ contrib/buildsystems/CMakeLists.txt: if(SUPPORTS_SIMPLE_IPC)
>      + 		add_compile_definitions(HAVE_FSMONITOR_DAEMON_BACKEND)
>      + 		list(APPEND compat_SOURCES compat/fsmonitor/fsm-listen-darwin.c)
>      + 		list(APPEND compat_SOURCES compat/fsmonitor/fsm-health-darwin.c)
>      ++		list(APPEND compat_SOURCES compat/fsmonitor/fsm-ipc-darwin.c)
>      + 		list(APPEND compat_SOURCES compat/fsmonitor/fsm-path-utils-darwin.c)
>      + 
>      + 		add_compile_definitions(HAVE_FSMONITOR_OS_SETTINGS)
>       
>      - ## fsmonitor-ipc.h ##
>      -@@ fsmonitor-ipc.h: int fsmonitor_ipc__is_supported(void);
>      -  */
>      - const char *fsmonitor_ipc__get_path(void);
>      + ## fsmonitor-ipc.c ##
>      +@@ fsmonitor-ipc.c: int fsmonitor_ipc__is_supported(void)
>      + 	return 1;
>      + }
>        
>      -+/*
>      -+ * Returns the pathname to the default IPC named pipe or Unix domain
>      -+ * socket.
>      -+ */
>      -+const char *fsmonitor_ipc__get_default_path(void);
>      -+
>      - /*
>      -  * Try to determine whether there is a `git-fsmonitor--daemon` process
>      -  * listening on the IPC pipe/socket.
>      +-GIT_PATH_FUNC(fsmonitor_ipc__get_path, "fsmonitor--daemon.ipc")
>      +-
>      + enum ipc_active_state fsmonitor_ipc__get_state(void)
>      + {
>      + 	return ipc_get_active_state(fsmonitor_ipc__get_path());
>  1:  836a791e6b7 ! 3:  ff54b6e0bb5 fsmonitor: add two new config options, allowRemote and socketDir
>      @@ Metadata
>       Author: Eric DeCosta <edecosta@mathworks.com>
>       
>        ## Commit message ##
>      -    fsmonitor: add two new config options, allowRemote and socketDir
>      +    fsmonitor: avoid socket location check if using hook
>       
>      -    Introduce two new configuration options
>      -
>      -       fsmonitor.allowRemote - setting this to true overrides fsmonitor's
>      -       default behavior of erroring out when enountering network file
>      -       systems. Additionly, when true, the Unix domain socket (UDS) file
>      -       used for IPC is located in $HOME rather than in the .git directory.
>      -
>      -       fsmonitor.socketDir - allows for the UDS file to be located
>      -       anywhere the user chooses rather $HOME.
>      +    If monitoring is done via fsmonitor hook rather than IPC there is no
>      +    need to check if the location of the Unix Domain socket (UDS) file is
>      +    on a remote filesystem.
>       
>           Signed-off-by: Eric DeCosta <edecosta@mathworks.com>
>       
>      - ## fsmonitor-settings.c ##
>      -@@
>      - struct fsmonitor_settings {
>      - 	enum fsmonitor_mode mode;
>      + ## compat/fsmonitor/fsm-settings-darwin.c ##
>      +@@ compat/fsmonitor/fsm-settings-darwin.c: static enum fsmonitor_reason check_uds_volume(struct repository *r)
>      + 	return FSMONITOR_REASON_OK;
>      + }
>      + 
>      +-enum fsmonitor_reason fsm_os__incompatible(struct repository *r)
>      ++enum fsmonitor_reason fsm_os__incompatible(struct repository *r, int ipc)
>      + {
>        	enum fsmonitor_reason reason;
>      -+	int allow_remote;
>      - 	char *hook_path;
>      -+	char *sock_dir;
>      - };
>        
>      - static enum fsmonitor_reason check_for_incompatible(struct repository *r)
>      -@@ fsmonitor-settings.c: static struct fsmonitor_settings *alloc_settings(void)
>      - 	CALLOC_ARRAY(s, 1);
>      - 	s->mode = FSMONITOR_MODE_DISABLED;
>      - 	s->reason = FSMONITOR_REASON_UNTESTED;
>      -+	s->allow_remote = -1;
>      +-	reason = check_uds_volume(r);
>      +-	if (reason != FSMONITOR_REASON_OK)
>      +-		return reason;
>      ++	if (ipc) {
>      ++		reason = check_uds_volume(r);
>      ++		if (reason != FSMONITOR_REASON_OK)
>      ++			return reason;
>      ++	}
>        
>      - 	return s;
>      + 	return FSMONITOR_REASON_OK;
>        }
>      -@@ fsmonitor-settings.c: static void lookup_fsmonitor_settings(struct repository *r)
>      - 		fsm_settings__set_disabled(r);
>      +
>      + ## compat/fsmonitor/fsm-settings-win32.c ##
>      +@@ compat/fsmonitor/fsm-settings-win32.c: static enum fsmonitor_reason check_vfs4git(struct repository *r)
>      + 	return FSMONITOR_REASON_OK;
>        }
>        
>      -+int fsm_settings__get_allow_remote(struct repository *r)
>      -+{
>      -+	if (!r)
>      -+		r = the_repository;
>      -+	if (!r->settings.fsmonitor)
>      -+		lookup_fsmonitor_settings(r);
>      -+
>      -+	return r->settings.fsmonitor->allow_remote;
>      -+}
>      -+
>      -+const char *fsm_settings__get_socket_dir(struct repository *r)
>      -+{
>      -+	if (!r)
>      -+		r = the_repository;
>      -+	if (!r->settings.fsmonitor)
>      -+		lookup_fsmonitor_settings(r);
>      -+
>      -+	return r->settings.fsmonitor->sock_dir;
>      -+}
>      -+
>      - enum fsmonitor_mode fsm_settings__get_mode(struct repository *r)
>      +-enum fsmonitor_reason fsm_os__incompatible(struct repository *r)
>      ++enum fsmonitor_reason fsm_os__incompatible(struct repository *r, int ipc)
>        {
>      - 	if (!r)
>      -@@ fsmonitor-settings.c: enum fsmonitor_mode fsm_settings__get_mode(struct repository *r)
>      - 	return r->settings.fsmonitor->mode;
>      + 	enum fsmonitor_reason reason;
>      + 
>      +
>      + ## fsmonitor-settings.c ##
>      +@@ fsmonitor-settings.c: static enum fsmonitor_reason check_remote(struct repository *r)
>        }
>      + #endif
>        
>      -+
>      - const char *fsm_settings__get_hook_path(struct repository *r)
>      +-static enum fsmonitor_reason check_for_incompatible(struct repository *r)
>      ++static enum fsmonitor_reason check_for_incompatible(struct repository *r, int ipc)
>        {
>      - 	if (!r)
>      + 	if (!r->worktree) {
>      + 		/*
>      +@@ fsmonitor-settings.c: static enum fsmonitor_reason check_for_incompatible(struct repository *r)
>      + 		reason = check_remote(r);
>      + 		if (reason != FSMONITOR_REASON_OK)
>      + 			return reason;
>      +-		reason = fsm_os__incompatible(r);
>      ++		reason = fsm_os__incompatible(r, ipc);
>      + 		if (reason != FSMONITOR_REASON_OK)
>      + 			return reason;
>      + 	}
>       @@ fsmonitor-settings.c: const char *fsm_settings__get_hook_path(struct repository *r)
>      - 	return r->settings.fsmonitor->hook_path;
>      - }
>        
>      -+void fsm_settings__set_allow_remote(struct repository *r)
>      -+{
>      -+	int allow;
>      -+
>      -+	if (!r)
>      -+		r = the_repository;
>      -+	if (!r->settings.fsmonitor)
>      -+		r->settings.fsmonitor = alloc_settings();
>      -+	if (!repo_config_get_bool(r, "fsmonitor.allowremote", &allow))
>      -+		r->settings.fsmonitor->allow_remote = allow;
>      -+
>      -+	return;
>      -+}
>      -+
>      -+void fsm_settings__set_socket_dir(struct repository *r)
>      -+{
>      -+	const char *path;
>      -+
>      -+	if (!r)
>      -+		r = the_repository;
>      -+	if (!r->settings.fsmonitor)
>      -+		r->settings.fsmonitor = alloc_settings();
>      -+
>      -+	if (!repo_config_get_pathname(r, "fsmonitor.socketdir", &path)) {
>      -+		FREE_AND_NULL(r->settings.fsmonitor->sock_dir);
>      -+		r->settings.fsmonitor->sock_dir = strdup(path);
>      -+	}
>      -+
>      -+	return;
>      -+}
>      -+
>        void fsm_settings__set_ipc(struct repository *r)
>        {
>       -	enum fsmonitor_reason reason = check_for_incompatible(r);
>      -+	enum fsmonitor_reason reason;
>      -+
>      -+	fsm_settings__set_allow_remote(r);
>      -+	fsm_settings__set_socket_dir(r);
>      -+	reason = check_for_incompatible(r);
>      ++	enum fsmonitor_reason reason = check_for_incompatible(r, 1);
>        
>        	if (reason != FSMONITOR_REASON_OK) {
>        		fsm_settings__set_incompatible(r, reason);
>      @@ fsmonitor-settings.c: void fsm_settings__set_ipc(struct repository *r)
>        void fsm_settings__set_hook(struct repository *r, const char *path)
>        {
>       -	enum fsmonitor_reason reason = check_for_incompatible(r);
>      -+	enum fsmonitor_reason reason;
>      -+
>      -+	fsm_settings__set_allow_remote(r);
>      -+	fsm_settings__set_socket_dir(r);
>      -+	reason = check_for_incompatible(r);
>      ++	enum fsmonitor_reason reason = check_for_incompatible(r, 0);
>        
>        	if (reason != FSMONITOR_REASON_OK) {
>        		fsm_settings__set_incompatible(r, reason);
>       
>        ## fsmonitor-settings.h ##
>      -@@ fsmonitor-settings.h: enum fsmonitor_reason {
>      - 	FSMONITOR_REASON_NOSOCKETS, /* NTFS,FAT32 do not support Unix sockets */
>      - };
>      - 
>      -+void fsm_settings__set_allow_remote(struct repository *r);
>      -+void fsm_settings__set_socket_dir(struct repository *r);
>      - void fsm_settings__set_ipc(struct repository *r);
>      - void fsm_settings__set_hook(struct repository *r, const char *path);
>      - void fsm_settings__set_disabled(struct repository *r);
>      - void fsm_settings__set_incompatible(struct repository *r,
>      - 				    enum fsmonitor_reason reason);
>      - 
>      -+int fsm_settings__get_allow_remote(struct repository *r);
>      -+const char *fsm_settings__get_socket_dir(struct repository *r);
>      - enum fsmonitor_mode fsm_settings__get_mode(struct repository *r);
>      - const char *fsm_settings__get_hook_path(struct repository *r);
>      +@@ fsmonitor-settings.h: struct fsmonitor_settings;
>      +  * fsm_os__* routines should considered private to fsm_settings__
>      +  * routines.
>      +  */
>      +-enum fsmonitor_reason fsm_os__incompatible(struct repository *r);
>      ++enum fsmonitor_reason fsm_os__incompatible(struct repository *r, int ipc);
>      + #endif /* HAVE_FSMONITOR_OS_SETTINGS */
>        
>      + #endif /* FSMONITOR_SETTINGS_H */
>  3:  a3110f1e25a < -:  ----------- fsmonitor: ensure filesystem and unix socket filesystem are compatible
>  4:  56cabf3be3b ! 4:  b7d6cf44695 fsmonitor: normalize FSEvents event paths to the real path
>      @@ Metadata
>       Author: Eric DeCosta <edecosta@mathworks.com>
>       
>        ## Commit message ##
>      -    fsmonitor: normalize FSEvents event paths to the real path
>      +    fsmonitor: deal with synthetic firmlinks on macOS
>       
>      -    Consider the following network working directory that is mounted under
>      -    /System/Volumes/Data:
>      +    Starting with macOS 10.15 (Catalina), Apple introduced a new feature
>      +    called 'firmlinks' in order to separate the boot volume into two
>      +    volumes, one read-only and one writable but still present them to the
>      +    user as a single volume. Along with this change, Apple removed the
>      +    ability to create symlinks in the root directory and replaced them with
>      +    'synthetic firmlinks'. See 'man synthetic.conf'
>       
>      -    /network/working/directory
>      +    When FSEevents reports the path of changed files, if the path invloves
>      +    a synthetic firmlink, the path is reported from the point of the
>      +    synthetic firmlink and not the real path. For example:
>       
>      -    The git working directory path is:
>      +    Real path:
>      +    /System/Volumes/Data/network/working/directory/foo.txt
>       
>      -    /System/Volumes/Data/network/working/directory
>      +    Synthetic firmlink:
>      +    /network -> /System/Volumes/Data/network
>       
>      -    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.
>      +    FSEvents path:
>      +    /network/working/directory/foo.txt
>       
>      -    Change things such that if fsmonitor.allowRemote is true that the
>      -    paths reported via FSEevents are normalized to the real path.
>      +    This causes the FSEvents path to not match against the worktree
>      +    directory.
>      +
>      +    There are several ways in which synthetic firmlinks can be created:
>      +    they can be defined in /etc/synthetic.conf, the automounter can create
>      +    them, and there may be other means. Simply reading /etc/synthetic.conf
>      +    is insufficient. No matter what process creates synthetic firmlinks,
>      +    they all get created in the root directory.
>      +
>      +    Therefore, in order to deal with synthetic firmlinks, the root directory
>      +    is scanned and the first possible synthetic firmink that, when resolved,
>      +    is a prefix of the worktree is used to map FSEvents paths to worktree
>      +    paths.
>       
>           Signed-off-by: Eric DeCosta <edecosta@mathworks.com>
>       
>      + ## builtin/fsmonitor--daemon.c ##
>      +@@
>      + #include "parse-options.h"
>      + #include "fsmonitor.h"
>      + #include "fsmonitor-ipc.h"
>      ++#include "fsmonitor-path-utils.h"
>      + #include "compat/fsmonitor/fsm-health.h"
>      + #include "compat/fsmonitor/fsm-listen.h"
>      + #include "fsmonitor--daemon.h"
>      +@@ builtin/fsmonitor--daemon.c: static int fsmonitor_run_daemon(void)
>      + 	strbuf_addstr(&state.path_worktree_watch, absolute_path(get_git_work_tree()));
>      + 	state.nr_paths_watching = 1;
>      + 
>      ++	strbuf_init(&state.alias.alias, 0);
>      ++	strbuf_init(&state.alias.points_to, 0);
>      ++	if (fsmonitor__get_alias(state.path_worktree_watch.buf, &state.alias)) {
>      ++		err = error(_("could not get worktree alias"));
>      ++		goto done;
>      ++	}
>      ++
>      + 	/*
>      + 	 * We create and delete cookie files somewhere inside the .git
>      + 	 * directory to help us keep sync with the file system.  If
>      +
>        ## compat/fsmonitor/fsm-listen-darwin.c ##
>       @@
>        #include "fsmonitor.h"
>        #include "fsm-listen.h"
>        #include "fsmonitor--daemon.h"
>      -+#include "fsmonitor-settings.h"
>      ++#include "fsmonitor-path-utils.h"
>        
>        struct fsm_listen_data
>        {
>      -@@ compat/fsmonitor/fsm-listen-darwin.c: 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,
>       @@ compat/fsmonitor/fsm-listen-darwin.c: 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 = fsmonitor__resolve_alias(paths[k], &state->alias);
>      ++		if (!path_k)
>       +			path_k = paths[k];
>        
>        		/*
>        		 * If you want to debug FSEvents, log them to GIT_TRACE_FSMONITOR.
>       @@ compat/fsmonitor/fsm-listen-darwin.c: static void fsevent_callback(ConstFSEventStreamRef streamRef,
>      - 
>        			fsmonitor_force_resync(state);
>        			fsmonitor_batch__free_list(batch);
>      -+			batch = NULL;
>        			string_list_clear(&cookie_list, 0);
>      ++			batch = NULL;
>        
>        			/*
>      -@@ compat/fsmonitor/fsm-listen-darwin.c: static void fsevent_callback(ConstFSEventStreamRef streamRef,
>      + 			 * We assume that any events that we received
>      +
>      + ## compat/fsmonitor/fsm-path-utils-darwin.c ##
>      +@@
>      + #include "fsmonitor.h"
>      + #include "fsmonitor-path-utils.h"
>      ++#include <dirent.h>
>      ++#include <errno.h>
>      ++#include <fcntl.h>
>      + #include <sys/param.h>
>      + #include <sys/mount.h>
>      + 
>      +@@ compat/fsmonitor/fsm-path-utils-darwin.c: int fsmonitor__is_fs_remote(const char *path)
>      + 		return -1;
>      + 	return fs.is_remote;
>      + }
>      ++
>      ++/*
>      ++ * Scan the root directory for synthetic firmlinks that when resolved
>      ++ * are a prefix of the path, stopping at the first one found.
>      ++ *
>      ++ * Some information about firmlinks and synthetic firmlinks:
>      ++ * https://eclecticlight.co/2020/01/23/catalina-boot-volumes/
>      ++ *
>      ++ * macOS no longer allows symlinks in the root directory; any link found
>      ++ * there is therefore a synthetic firmlink.
>      ++ *
>      ++ * If this function gets called often, will want to cache all the firmlink
>      ++ * information, but for now there is only one caller of this function.
>      ++ *
>      ++ * If there is more than one alias for the path, that is another
>      ++ * matter altogteher.
>      ++ */
>      ++int fsmonitor__get_alias(const char *path, struct alias_info *info)
>      ++{
>      ++	DIR * dir;
>      ++	int read;
>      ++	int retval;
>      ++	struct dirent *de;
>      ++	struct strbuf alias;
>      ++	struct strbuf points_to;
>      ++
>      ++	retval = 0;
>      ++	dir = opendir("/");
>      ++	if (!dir)
>      ++		return -1;
>      ++
>      ++	strbuf_init(&alias, 256);
>      ++	strbuf_init(&points_to, MAXPATHLEN);
>      ++
>      ++	while ((de = readdir(dir)) != NULL) {
>      ++		strbuf_reset(&alias);
>      ++		strbuf_addch(&alias, '/');
>      ++		strbuf_add(&alias, de->d_name, strlen(de->d_name));
>      ++
>      ++		read = readlink(alias.buf, points_to.buf, MAXPATHLEN);
>      ++		if (read > 0) {
>      ++			strbuf_setlen(&points_to, read);
>      ++			if ((strncmp(points_to.buf, path, points_to.len) == 0)
>      ++				&& path[points_to.len] == '/') {
>      ++				strbuf_addbuf(&info->alias, &alias);
>      ++				strbuf_addbuf(&info->points_to, &points_to);
>      ++				trace_printf_key(&trace_fsmonitor,
>      ++					"Found alias for '%s' : '%s' -> '%s'",
>      ++					path, info->alias.buf, info->points_to.buf);
>      ++				retval = 0;
>      ++				goto done;
>      ++			}
>      ++		} else if (errno != EINVAL) { /* Something other than not a link */
>      ++			trace_printf_key(&trace_fsmonitor, "Error %s", strerror(errno));
>      ++			retval = -1;
>      ++			goto done;
>      ++		}
>      ++	}
>      ++
>      ++	done:
>      ++	closedir(dir);
>      ++	strbuf_release(&alias);
>      ++	strbuf_release(&points_to);
>      ++	return retval;
>      ++}
>      ++
>      ++char *fsmonitor__resolve_alias(const char *path,
>      ++	const struct alias_info *info)
>      ++{
>      ++	int len = info->alias.len;
>      ++
>      ++	if (!len)
>      ++		return NULL;
>      ++
>      ++	if ((strncmp(info->alias.buf, path, len) == 0)
>      ++		&& path[len] == '/') {
>      ++		struct strbuf tmp;
>      ++		const char *remainder = path + len;
>      ++		int rem_len = strlen(remainder);
>      ++
>      ++		strbuf_init(&tmp, info->points_to.len + rem_len);
>      ++		strbuf_addbuf(&tmp, &info->points_to);
>      ++		strbuf_add(&tmp, remainder, rem_len);
>      ++		return strbuf_detach(&tmp, NULL);
>      ++	}
>      ++
>      ++	return NULL;
>      ++}
>      +
>      + ## compat/fsmonitor/fsm-path-utils-win32.c ##
>      +@@ compat/fsmonitor/fsm-path-utils-win32.c: int fsmonitor__is_fs_remote(const char *path)
>      + 		return -1;
>      + 	return fs.is_remote;
>      + }
>      ++
>      ++/*
>      ++ * No-op for now.
>      ++ */
>      ++int fsmonitor__get_alias(const char *path, struct alias_info *info)
>      ++{
>      ++	return 0;
>      ++}
>      ++
>      ++/*
>      ++ * No-op for now.
>      ++ */
>      ++char *fsmonitor__resolve_alias(const char *path,
>      ++	const struct alias_info *info)
>      ++{
>      ++	return NULL;
>      ++}
>      +
>      + ## fsmonitor--daemon.h ##
>      +@@
>      + #include "run-command.h"
>      + #include "simple-ipc.h"
>      + #include "thread-utils.h"
>      ++#include "fsmonitor-path-utils.h"
>      + 
>      + struct fsmonitor_batch;
>      + struct fsmonitor_token_data;
>      +@@ fsmonitor--daemon.h: struct fsmonitor_daemon_state {
>      + 
>      + 	struct strbuf path_worktree_watch;
>      + 	struct strbuf path_gitdir_watch;
>      ++	struct alias_info alias;
>      + 	int nr_paths_watching;
>      + 
>      + 	struct fsmonitor_token_data *current_token_data;
>      +@@ fsmonitor--daemon.h: struct fsmonitor_daemon_state {
>      + 
>      + 	struct ipc_server_data *ipc_server_data;
>      + 	struct strbuf path_ipc;
>      ++
>      + };
>      + 
>      + /*
>      +@@ fsmonitor--daemon.h: void fsmonitor_publish(struct fsmonitor_daemon_state *state,
>      +  */
>      + void fsmonitor_force_resync(struct fsmonitor_daemon_state *state);
>      + 
>      ++char *fsmonitor_resolve_alias(const char *path,
>      ++	struct alias_info *alias);
>      ++
>      + #endif /* HAVE_FSMONITOR_DAEMON_BACKEND */
>      + #endif /* FSMONITOR_DAEMON_H */
>      +
>      + ## fsmonitor-path-utils.h ##
>      +@@
>      + #ifndef FSM_PATH_UTILS_H
>      + #define FSM_PATH_UTILS_H
>        
>      - 		case IS_WORKDIR_PATH:
>      - 			/* try to queue normal pathnames */
>      --
>      - 			if (trace_pass_fl(&trace_fsmonitor))
>      - 				log_flags_set(path_k, event_flags[k]);
>      ++#include "strbuf.h"
>      ++
>      ++struct alias_info
>      ++{
>      ++	struct strbuf alias;
>      ++	struct strbuf points_to;
>      ++};
>      ++
>      + struct fs_info {
>      + 	int is_remote;
>      + 	char *typename;
>      +@@ fsmonitor-path-utils.h: int fsmonitor__get_fs_info(const char *path, struct fs_info *fs_info);
>      +  */
>      + int fsmonitor__is_fs_remote(const char *path);
>        
>      ++/*
>      ++ * Get the alias in given path, if any.
>      ++ *
>      ++ * Sets alias to the first alias that matches any part of the path.
>      ++ *
>      ++ * Returns -1 on error, 0 otherwise.
>      ++ */
>      ++int fsmonitor__get_alias(const char *path, struct alias_info *info);
>      ++
>      ++/*
>      ++ * Resolve the path against the given alias.
>      ++ *
>      ++ * Returns the resolved path if there is one, NULL otherwise.
>      ++ */
>      ++char *fsmonitor__resolve_alias(const char *path,
>      ++	const struct alias_info *info);
>      ++
>      ++
>      + #endif

  parent reply	other threads:[~2022-09-12 15:27 UTC|newest]

Thread overview: 170+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-18 20:48 [PATCH] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta via GitGitGadget
2022-08-18 21:35 ` Junio C Hamano
2022-08-18 21:38   ` Junio C Hamano
2022-08-19 10:05 ` Johannes Schindelin
2022-08-19 16:50 ` Jeff Hostetler
2022-08-19 18:38   ` Eric DeCosta
2022-08-19 20:15     ` Jeff Hostetler
2022-08-19 17:48 ` Eric Sunshine
2022-08-19 18:58 ` Torsten Bögershausen
2022-08-20 22:24 ` Junio C Hamano
2022-08-22 13:22   ` Johannes Schindelin
2022-08-22 16:07     ` Junio C Hamano
2022-08-23 13:51     ` Jeff Hostetler
2022-08-24 15:45       ` Eric DeCosta
2022-08-23 13:03 ` [PATCH v2 0/4] " Eric DeCosta via GitGitGadget
2022-08-23 13:03   ` [PATCH v2 1/4] " Eric DeCosta via GitGitGadget
2022-08-23 13:03   ` [PATCH v2 2/4] fsmonitor: macOS: " Eric DeCosta via GitGitGadget
2022-08-23 13:03   ` [PATCH v2 3/4] Check working directory and Unix domain socket file for compatability edecosta via GitGitGadget
2022-08-23 13:03   ` [PATCH v2 4/4] Minor refactoring and simplification of Windows settings checks edecosta via GitGitGadget
2022-08-23 18:55   ` [PATCH v3 0/2] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta via GitGitGadget
2022-08-23 18:55     ` [PATCH v3 1/2] fsmonitor: macOS: " Eric DeCosta via GitGitGadget
2022-08-23 18:55     ` [PATCH v3 2/2] Check working directory and Unix domain socket file for compatability edecosta via GitGitGadget
2022-08-24 20:31       ` Junio C Hamano
2022-08-24 16:46     ` [PATCH v3 0/2] fsmonitor: option to allow fsmonitor to run against network-mounted repos Junio C Hamano
2022-08-31 16:09     ` [PATCH v4 0/4] " Eric DeCosta via GitGitGadget
2022-08-31 16:09       ` [PATCH v4 1/4] fsmonitor: add two new config options, allowRemote and socketDir Eric DeCosta via GitGitGadget
2022-08-31 19:41         ` Ævar Arnfjörð Bjarmason
2022-08-31 20:04         ` Junio C Hamano
2022-09-01  2:25           ` Ramsay Jones
2022-09-01 17:53         ` Jeff Hostetler
2022-09-01 18:04         ` Jeff Hostetler
2022-09-01 21:21         ` Jeff Hostetler
2022-09-02 16:54           ` Eric DeCosta
2022-09-06 14:27             ` Jeff Hostetler
2022-08-31 16:09       ` [PATCH v4 2/4] fsmonitor: generate unique Unix socket file name in the desired location Eric DeCosta via GitGitGadget
2022-08-31 19:49         ` Ævar Arnfjörð Bjarmason
2022-08-31 20:11         ` Junio C Hamano
2022-08-31 16:09       ` [PATCH v4 3/4] fsmonitor: ensure filesystem and unix socket filesystem are compatible Eric DeCosta via GitGitGadget
2022-08-31 16:09       ` [PATCH v4 4/4] fsmonitor: normalize FSEvents event paths to the real path Eric DeCosta via GitGitGadget
2022-08-31 19:37         ` Ævar Arnfjörð Bjarmason
2022-09-01 20:05         ` Jeff Hostetler
2022-09-02 16:35           ` Eric DeCosta
2022-09-06 17:13             ` Jeff Hostetler
2022-09-06 19:02               ` Eric DeCosta
2022-09-06 19:33                 ` Eric DeCosta
2022-09-06 22:11                   ` Eric DeCosta
2022-09-07 19:14                   ` Jeff Hostetler
2022-09-07 23:04                     ` Eric DeCosta
2022-09-10 20:00       ` [PATCH v5 0/4] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta via GitGitGadget
2022-09-10 20:00         ` [PATCH v5 1/4] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2022-09-10 20:00         ` [PATCH v5 2/4] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2022-09-10 20:00         ` [PATCH v5 3/4] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-09-10 20:00         ` [PATCH v5 4/4] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2022-09-11  1:01           ` Eric Sunshine
2022-09-12 15:27         ` Junio C Hamano [this message]
2022-09-12 19:37           ` [PATCH v5 0/4] fsmonitor: option to allow fsmonitor to run against network-mounted repos Junio C Hamano
2022-09-12 19:39             ` Eric DeCosta
2022-09-12 15:35         ` Junio C Hamano
2022-09-12 19:35           ` Eric DeCosta
2022-09-13 20:27         ` [PATCH v6 0/6] " Eric DeCosta via GitGitGadget
2022-09-13 20:27           ` [PATCH v6 1/6] " Eric DeCosta via GitGitGadget
2022-09-13 20:27           ` [PATCH v6 2/6] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2022-09-13 20:27           ` [PATCH v6 3/6] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2022-09-14  0:48             ` Junio C Hamano
2022-09-14 15:47               ` Eric DeCosta
2022-09-13 20:27           ` [PATCH v6 4/6] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-09-14  1:48             ` Junio C Hamano
2022-09-13 20:27           ` [PATCH v6 5/6] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2022-09-13 20:27           ` [PATCH v6 6/6] fsmonitor: add documentation for allowRemote and socketDir options Eric DeCosta via GitGitGadget
2022-09-16 17:58           ` [PATCH v6 0/6] fsmonitor: option to allow fsmonitor to run against network-mounted repos Jeff Hostetler
2022-09-16 20:02             ` Eric DeCosta
2022-09-16 19:53           ` [PATCH v7 " Eric DeCosta via GitGitGadget
2022-09-16 19:53             ` [PATCH v7 1/6] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2022-09-16 19:53             ` [PATCH v7 2/6] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2022-09-16 20:11               ` Junio C Hamano
2022-09-19 12:31                 ` Jeff Hostetler
2022-09-19 16:42                   ` Junio C Hamano
2022-09-19 17:08                     ` Jeff Hostetler
2022-09-19 17:49                       ` Junio C Hamano
2022-09-19 23:51                         ` Eric DeCosta
2022-09-20 14:35                           ` Jeff Hostetler
2022-09-20 15:49                             ` Eric DeCosta
2022-09-16 19:53             ` [PATCH v7 3/6] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-09-16 19:53             ` [PATCH v7 4/6] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2022-09-16 19:53             ` [PATCH v7 5/6] " Eric DeCosta via GitGitGadget
2022-09-16 20:15               ` Junio C Hamano
2022-09-16 19:53             ` [PATCH v7 6/6] fsmonitor: add documentation for allowRemote and socketDir options Eric DeCosta via GitGitGadget
2022-09-16 20:09             ` [PATCH v7 0/6] fsmonitor: option to allow fsmonitor to run against network-mounted repos Junio C Hamano
2022-09-17  1:12             ` [PATCH v8 0/5] " Eric DeCosta via GitGitGadget
2022-09-17  1:12               ` [PATCH v8 1/5] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2022-09-17  1:12               ` [PATCH v8 2/5] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2022-09-17  4:13                 ` Eric Sunshine
2022-09-19 16:50                   ` Junio C Hamano
2022-09-17  6:29                 ` Eric Sunshine
2022-09-17 16:29                   ` Eric DeCosta
2022-09-19 16:58                   ` Junio C Hamano
2022-09-17  1:12               ` [PATCH v8 3/5] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-09-17  1:12               ` [PATCH v8 4/5] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2022-09-17  1:12               ` [PATCH v8 5/5] fsmonitor: add documentation for allowRemote and socketDir options Eric DeCosta via GitGitGadget
2022-09-17  6:08                 ` Eric Sunshine
2022-09-19 23:55                   ` Eric DeCosta
2022-09-19 19:37               ` [PATCH v9 0/6] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta via GitGitGadget
2022-09-19 19:37                 ` [PATCH v9 1/6] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2022-09-19 19:37                 ` [PATCH v9 2/6] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2022-09-19 19:57                   ` Eric Sunshine
2022-09-19 19:37                 ` [PATCH v9 3/6] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-09-19 19:37                 ` [PATCH v9 4/6] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2022-09-19 19:37                 ` [PATCH v9 5/6] fsmonitor: check for compatability before communicating with fsmonitor Eric DeCosta via GitGitGadget
2022-09-19 19:37                 ` [PATCH v9 6/6] fsmonitor: add documentation for allowRemote and socketDir options Eric DeCosta via GitGitGadget
2022-09-20 20:33                 ` [PATCH v10 0/6] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta via GitGitGadget
2022-09-20 20:33                   ` [PATCH v10 1/6] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2022-09-20 20:33                   ` [PATCH v10 2/6] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2022-09-20 20:33                   ` [PATCH v10 3/6] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-09-20 20:33                   ` [PATCH v10 4/6] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2022-09-20 20:33                   ` [PATCH v10 5/6] fsmonitor: check for compatability before communicating with fsmonitor Eric DeCosta via GitGitGadget
2022-09-21 11:22                     ` Jeff Hostetler
2022-09-21 13:03                       ` Eric DeCosta
2022-09-20 20:33                   ` [PATCH v10 6/6] fsmonitor: add documentation for allowRemote and socketDir options Eric DeCosta via GitGitGadget
2022-09-21 22:18                   ` [PATCH v11 0/6] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta via GitGitGadget
2022-09-21 22:18                     ` [PATCH v11 1/6] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2022-09-21 22:18                     ` [PATCH v11 2/6] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2022-09-21 22:18                     ` [PATCH v11 3/6] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-09-21 22:18                     ` [PATCH v11 4/6] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2022-09-21 22:18                     ` [PATCH v11 5/6] fsmonitor: check for compatability before communicating with fsmonitor Eric DeCosta via GitGitGadget
2022-09-21 22:18                     ` [PATCH v11 6/6] fsmonitor: add documentation for allowRemote and socketDir options Eric DeCosta via GitGitGadget
2022-09-24 19:46                     ` [PATCH v12 0/6] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta via GitGitGadget
2022-09-24 19:46                       ` [PATCH v12 1/6] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2022-09-24 19:46                       ` [PATCH v12 2/6] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2022-09-24 19:46                       ` [PATCH v12 3/6] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-09-24 19:46                       ` [PATCH v12 4/6] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2022-09-26 15:16                         ` Ævar Arnfjörð Bjarmason
2022-09-27  1:53                           ` Eric DeCosta
2022-09-26 15:27                         ` Ævar Arnfjörð Bjarmason
2022-09-24 19:46                       ` [PATCH v12 5/6] fsmonitor: check for compatability before communicating with fsmonitor Eric DeCosta via GitGitGadget
2022-09-25 14:00                         ` Eric DeCosta
2022-09-26 15:23                         ` Ævar Arnfjörð Bjarmason
2022-09-27  1:25                           ` Eric DeCosta
2022-09-24 19:46                       ` [PATCH v12 6/6] fsmonitor: add documentation for allowRemote and socketDir options Eric DeCosta via GitGitGadget
2022-09-26 15:11                         ` Ævar Arnfjörð Bjarmason
2022-09-27  2:16                           ` Eric Sunshine
2022-09-27  4:03                             ` Eric DeCosta
2022-09-25 14:18                       ` [PATCH v12 0/6] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta
2022-09-27 20:57                       ` [PATCH v13 " Eric DeCosta via GitGitGadget
2022-09-27 20:57                         ` [PATCH v13 1/6] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2022-09-27 20:57                         ` [PATCH v13 2/6] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2022-09-27 20:57                         ` [PATCH v13 3/6] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-09-27 20:57                         ` [PATCH v13 4/6] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2022-09-28  5:55                           ` Ævar Arnfjörð Bjarmason
2022-09-27 20:57                         ` [PATCH v13 5/6] fsmonitor: check for compatability before communicating with fsmonitor Eric DeCosta via GitGitGadget
2022-09-27 20:57                         ` [PATCH v13 6/6] fsmonitor: add documentation for allowRemote and socketDir options Eric DeCosta via GitGitGadget
2022-09-28 20:12                         ` [PATCH v14 0/6] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta via GitGitGadget
2022-09-28 20:12                           ` [PATCH v14 1/6] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2022-09-28 20:12                           ` [PATCH v14 2/6] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2022-09-28 20:12                           ` [PATCH v14 3/6] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-09-28 20:12                           ` [PATCH v14 4/6] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2022-09-28 20:12                           ` [PATCH v14 5/6] fsmonitor: check for compatability before communicating with fsmonitor Eric DeCosta via GitGitGadget
2022-09-28 20:12                           ` [PATCH v14 6/6] fsmonitor: add documentation for allowRemote and socketDir options Eric DeCosta via GitGitGadget
2022-10-04 17:32                           ` [PATCH v15 0/6] fsmonitor: option to allow fsmonitor to run against network-mounted repos Eric DeCosta via GitGitGadget
2022-10-04 17:32                             ` [PATCH v15 1/6] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2023-01-30  9:37                               ` Ævar Arnfjörð Bjarmason
2022-10-04 17:32                             ` [PATCH v15 2/6] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2023-01-30  9:58                               ` Ævar Arnfjörð Bjarmason
2022-10-04 17:32                             ` [PATCH v15 3/6] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-10-04 17:32                             ` [PATCH v15 4/6] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2023-01-30 10:08                               ` Ævar Arnfjörð Bjarmason
2022-10-04 17:32                             ` [PATCH v15 5/6] fsmonitor: check for compatability before communicating with fsmonitor Eric DeCosta via GitGitGadget
2022-10-04 17:32                             ` [PATCH v15 6/6] fsmonitor: add documentation for allowRemote and socketDir options Eric DeCosta via GitGitGadget
2023-01-30 10:04                               ` Ævar Arnfjörð Bjarmason
2022-10-05 18:05                             ` [PATCH v15 0/6] fsmonitor: option to allow fsmonitor to run against network-mounted repos Junio C Hamano
2022-10-05 21:14                               ` Eric DeCosta

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqedwghauv.fsf@gitster.g \
    --to=gitster@pobox.com \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=avarab@gmail.com \
    --cc=edecosta@mathworks.com \
    --cc=git@jeffhostetler.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=ramsay@ramsayjones.plus.com \
    --cc=sunshine@sunshineco.com \
    --cc=tboegi@web.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).