git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v15 1/6] fsmonitor: refactor filesystem checks to common interface

From
Eric DeCosta via GitGitGadget <gitgitgadget@gmail.com>
Date
Oct 4, 2022, 17:32 UTC
Message-ID
<ec49a74086dee4545a3bb7b24c8da22e77aef579.1664904751.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1326.v15.git.1664904751.gitgitgadget@gmail.com>
From: Eric DeCosta <edecosta@mathworks.com>

Provide a common interface for getting basic filesystem information including filesystem type and whether the filesystem is remote.

Refactor existing code for getting basic filesystem info and detecting remote file systems to the new interface.

Refactor filesystem checks to leverage new interface. For macOS, error-out if the Unix Domain socket (UDS) file is on a remote filesystem.

Signed-off-by: Eric DeCosta <edecosta@mathworks.com>
---
 Makefile                                 |   1 +
 compat/fsmonitor/fsm-path-utils-darwin.c |  43 ++++++
 compat/fsmonitor/fsm-path-utils-win32.c  | 128 +++++++++++++++++
 compat/fsmonitor/fsm-settings-darwin.c   |  69 +++------
 compat/fsmonitor/fsm-settings-win32.c    | 172 +----------------------
 contrib/buildsystems/CMakeLists.txt      |   2 +
 fsmonitor-path-utils.h                   |  26 ++++
 fsmonitor-settings.c                     |  50 +++++++
 8 files changed, 272 insertions(+), 219 deletions(-)
 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
diff --git a/Makefile b/Makefile
index cac3452edb9..ffab427ea5b 100644
--- a/Makefile
+++ b/Makefile
@@ -2044,6 +2044,7 @@ endif
 ifdef FSMONITOR_OS_SETTINGS
 	COMPAT_CFLAGS += -DHAVE_FSMONITOR_OS_SETTINGS
 	COMPAT_OBJS += compat/fsmonitor/fsm-settings-$(FSMONITOR_OS_SETTINGS).o
+	COMPAT_OBJS += compat/fsmonitor/fsm-path-utils-$(FSMONITOR_OS_SETTINGS).o
 endif
 
 ifeq ($(TCLTK_PATH),)
diff --git a/compat/fsmonitor/fsm-path-utils-darwin.c b/compat/fsmonitor/fsm-path-utils-darwin.c
new file mode 100644
index 00000000000..d46d7f13538
--- /dev/null
+++ b/compat/fsmonitor/fsm-path-utils-darwin.c
@@ -0,0 +1,43 @@
+#include "fsmonitor.h"
+#include "fsmonitor-path-utils.h"
+#include <sys/param.h>
+#include <sys/mount.h>
+
+int fsmonitor__get_fs_info(const char *path, struct fs_info *fs_info)
+{
+	struct statfs fs;
+	if (statfs(path, &fs) == -1) {
+		int saved_errno = errno;
+		trace_printf_key(&trace_fsmonitor, "statfs('%s') failed: %s",
+				 path, strerror(saved_errno));
+		errno = saved_errno;
+		return -1;
+	}
+
+	trace_printf_key(&trace_fsmonitor,
+			 "statfs('%s') [type 0x%08x][flags 0x%08x] '%s'",
+			 path, fs.f_type, fs.f_flags, fs.f_fstypename);
+
+	if (!(fs.f_flags & MNT_LOCAL))
+		fs_info->is_remote = 1;
+	else
+		fs_info->is_remote = 0;
+
+	fs_info->typename = xstrdup(fs.f_fstypename);
+
+	trace_printf_key(&trace_fsmonitor,
+				"'%s' is_remote: %d",
+				path, fs_info->is_remote);
+	return 0;
+}
+
+int fsmonitor__is_fs_remote(const char *path)
+{
+	struct fs_info fs;
+	if (fsmonitor__get_fs_info(path, &fs))
+		return -1;
+
+	free(fs.typename);
+
+	return fs.is_remote;
+}
diff --git a/compat/fsmonitor/fsm-path-utils-win32.c b/compat/fsmonitor/fsm-path-utils-win32.c
new file mode 100644
index 00000000000..a90b8f7925b
--- /dev/null
+++ b/compat/fsmonitor/fsm-path-utils-win32.c
@@ -0,0 +1,128 @@
+#include "cache.h"
+#include "fsmonitor.h"
+#include "fsmonitor-path-utils.h"
+
+/*
+ * Check remote working directory protocol.
+ *
+ * Return -1 if client machine cannot get remote protocol information.
+ */
+static int check_remote_protocol(wchar_t *wpath)
+{
+	HANDLE h;
+	FILE_REMOTE_PROTOCOL_INFO proto_info;
+
+	h = CreateFileW(wpath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
+			FILE_FLAG_BACKUP_SEMANTICS, NULL);
+
+	if (h == INVALID_HANDLE_VALUE) {
+		error(_("[GLE %ld] unable to open for read '%ls'"),
+		      GetLastError(), wpath);
+		return -1;
+	}
+
+	if (!GetFileInformationByHandleEx(h, FileRemoteProtocolInfo,
+		&proto_info, sizeof(proto_info))) {
+		error(_("[GLE %ld] unable to get protocol information for '%ls'"),
+		      GetLastError(), wpath);
+		CloseHandle(h);
+		return -1;
+	}
+
+	CloseHandle(h);
+
+	trace_printf_key(&trace_fsmonitor,
+				"check_remote_protocol('%ls') remote protocol %#8.8lx",
+				wpath, proto_info.Protocol);
+
+	return 0;
+}
+
+/*
+ * Notes for testing:
+ *
+ * (a) Windows allows a network share to be mapped to a drive letter.
+ *     (This is the normal method to access it.)
+ *
+ *     $ NET USE Z: \\server\share
+ *     $ git -C Z:/repo status
+ *
+ * (b) Windows allows a network share to be referenced WITHOUT mapping
+ *     it to drive letter.
+ *
+ *     $ NET USE \\server\share\dir
+ *     $ git -C //server/share/repo status
+ *
+ * (c) Windows allows "SUBST" to create a fake drive mapping to an
+ *     arbitrary path (which may be remote)
+ *
+ *     $ SUBST Q: Z:\repo
+ *     $ git -C Q:/ status
+ *
+ * (d) Windows allows a directory symlink to be created on a local
+ *     file system that points to a remote repo.
+ *
+ *     $ mklink /d ./link //server/share/repo
+ *     $ git -C ./link status
+ */
+int fsmonitor__get_fs_info(const char *path, struct fs_info *fs_info)
+{
+	wchar_t wpath[MAX_PATH];
+	wchar_t wfullpath[MAX_PATH];
+	size_t wlen;
+	UINT driveType;
+
+	/*
+	 * Do everything in wide chars because the drive letter might be
+	 * a multi-byte sequence.  See win32_has_dos_drive_prefix().
+	 */
+	if (xutftowcs_path(wpath, path) < 0) {
+		return -1;
+	}
+
+	/*
+	 * GetDriveTypeW() requires a final slash.  We assume that the
+	 * worktree pathname points to an actual directory.
+	 */
+	wlen = wcslen(wpath);
+	if (wpath[wlen - 1] != L'\\' && wpath[wlen - 1] != L'/') {
+		wpath[wlen++] = L'\\';
+		wpath[wlen] = 0;
+	}
+
+	/*
+	 * Normalize the path.  If nothing else, this converts forward
+	 * slashes to backslashes.  This is essential to get GetDriveTypeW()
+	 * correctly handle some UNC "\\server\share\..." paths.
+	 */
+	if (!GetFullPathNameW(wpath, MAX_PATH, wfullpath, NULL)) {
+		return -1;
+	}
+
+	driveType = GetDriveTypeW(wfullpath);
+	trace_printf_key(&trace_fsmonitor,
+			 "DriveType '%s' L'%ls' (%u)",
+			 path, wfullpath, driveType);
+
+	if (driveType == DRIVE_REMOTE) {
+		fs_info->is_remote = 1;
+		if (check_remote_protocol(wfullpath) < 0)
+			return -1;
+	} else {
+		fs_info->is_remote = 0;
+	}
+
+	trace_printf_key(&trace_fsmonitor,
+				"'%s' is_remote: %d",
+				path, fs_info->is_remote);
+
+	return 0;
+}
+
+int fsmonitor__is_fs_remote(const char *path)
+{
+	struct fs_info fs;
+	if (fsmonitor__get_fs_info(path, &fs))
+		return -1;
+	return fs.is_remote;
+}
diff --git a/compat/fsmonitor/fsm-settings-darwin.c b/compat/fsmonitor/fsm-settings-darwin.c
index efc732c0f31..699f0b272e6 100644
--- a/compat/fsmonitor/fsm-settings-darwin.c
+++ b/compat/fsmonitor/fsm-settings-darwin.c
@@ -1,32 +1,10 @@
-#include "cache.h"
 #include "config.h"
-#include "repository.h"
-#include "fsmonitor-settings.h"
 #include "fsmonitor.h"
-#include <sys/param.h>
-#include <sys/mount.h>
+#include "fsmonitor-ipc.h"
+#include "fsmonitor-settings.h"
+#include "fsmonitor-path-utils.h"
 
-/*
- * [1] Remote working directories are problematic for FSMonitor.
- *
- * The underlying file system on the server machine and/or the remote
- * mount type (NFS, SAMBA, etc.) dictates whether notification events
- * are available at all to remote client machines.
- *
- * Kernel differences between the server and client machines also
- * dictate the how (buffering, frequency, de-dup) the events are
- * delivered to client machine processes.
- *
- * A client machine (such as a laptop) may choose to suspend/resume
- * and it is unclear (without lots of testing) whether the watcher can
- * resync after a resume.  We might be able to treat this as a normal
- * "events were dropped by the kernel" event and do our normal "flush
- * and resync" --or-- we might need to close the existing (zombie?)
- * notification fd and create a new one.
- *
- * In theory, the above issues need to be addressed whether we are
- * using the Hook or IPC API.
- *
+ /*
  * For the builtin FSMonitor, we create the Unix domain socket for the
  * IPC in the .git directory.  If the working directory is remote,
  * then the socket will be created on the remote file system.  This
@@ -38,42 +16,35 @@
  * be taken to ensure that $HOME is actually local and not a managed
  * file share.)
  *
- * So (for now at least), mark remote working directories as
- * incompatible.
- *
- *
- * [2] FAT32 and NTFS working directories are problematic too.
+ * FAT32 and NTFS working directories are problematic too.
  *
  * The builtin FSMonitor uses a Unix domain socket in the .git
  * directory for IPC.  These Windows drive formats do not support
  * Unix domain sockets, so mark them as incompatible for the daemon.
  *
  */
-static enum fsmonitor_reason check_volume(struct repository *r)
+static enum fsmonitor_reason check_uds_volume(struct repository *r)
 {
-	struct statfs fs;
+	struct fs_info fs;
+	const char *ipc_path = fsmonitor_ipc__get_path();
+	struct strbuf path = STRBUF_INIT;
+	strbuf_add(&path, ipc_path, strlen(ipc_path));
 
-	if (statfs(r->worktree, &fs) == -1) {
-		int saved_errno = errno;
-		trace_printf_key(&trace_fsmonitor, "statfs('%s') failed: %s",
-				 r->worktree, strerror(saved_errno));
-		errno = saved_errno;
+	if (fsmonitor__get_fs_info(dirname(path.buf), &fs) == -1) {
+		strbuf_release(&path);
 		return FSMONITOR_REASON_ERROR;
 	}
 
-	trace_printf_key(&trace_fsmonitor,
-			 "statfs('%s') [type 0x%08x][flags 0x%08x] '%s'",
-			 r->worktree, fs.f_type, fs.f_flags, fs.f_fstypename);
-
-	if (!(fs.f_flags & MNT_LOCAL))
-		return FSMONITOR_REASON_REMOTE;
+	strbuf_release(&path);
 
-	if (!strcmp(fs.f_fstypename, "msdos")) /* aka FAT32 */
-		return FSMONITOR_REASON_NOSOCKETS;
-
-	if (!strcmp(fs.f_fstypename, "ntfs"))
+	if (fs.is_remote ||
+		!strcmp(fs.typename, "msdos") ||
+		!strcmp(fs.typename, "ntfs")) {
+		free(fs.typename);
 		return FSMONITOR_REASON_NOSOCKETS;
+	}
 
+	free(fs.typename);
 	return FSMONITOR_REASON_OK;
 }
 
@@ -81,7 +52,7 @@ enum fsmonitor_reason fsm_os__incompatible(struct repository *r)
 {
 	enum fsmonitor_reason reason;
 
-	reason = check_volume(r);
+	reason = check_uds_volume(r);
 	if (reason != FSMONITOR_REASON_OK)
 		return reason;
 
diff --git a/compat/fsmonitor/fsm-settings-win32.c b/compat/fsmonitor/fsm-settings-win32.c
index e5ec5b0a9f7..d88b06ae610 100644
--- a/compat/fsmonitor/fsm-settings-win32.c
+++ b/compat/fsmonitor/fsm-settings-win32.c
@@ -1,8 +1,9 @@
 #include "cache.h"
 #include "config.h"
 #include "repository.h"
-#include "fsmonitor-settings.h"
 #include "fsmonitor.h"
+#include "fsmonitor-settings.h"
+#include "fsmonitor-path-utils.h"
 
 /*
  * VFS for Git is incompatible with FSMonitor.
@@ -24,171 +25,6 @@ static enum fsmonitor_reason check_vfs4git(struct repository *r)
 	return FSMONITOR_REASON_OK;
 }
 
-/*
- * Check if monitoring remote working directories is allowed.
- *
- * By default, monitoring remote working directories is
- * disabled.  Users may override this behavior in enviroments where
- * they have proper support.
- */
-static int check_config_allowremote(struct repository *r)
-{
-	int allow;
-
-	if (!repo_config_get_bool(r, "fsmonitor.allowremote", &allow))
-		return allow;
-
-	return -1; /* fsmonitor.allowremote not set */
-}
-
-/*
- * Check remote working directory protocol.
- *
- * Error if client machine cannot get remote protocol information.
- */
-static int check_remote_protocol(wchar_t *wpath)
-{
-	HANDLE h;
-	FILE_REMOTE_PROTOCOL_INFO proto_info;
-
-	h = CreateFileW(wpath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
-			FILE_FLAG_BACKUP_SEMANTICS, NULL);
-
-	if (h == INVALID_HANDLE_VALUE) {
-		error(_("[GLE %ld] unable to open for read '%ls'"),
-		      GetLastError(), wpath);
-		return -1;
-	}
-
-	if (!GetFileInformationByHandleEx(h, FileRemoteProtocolInfo,
-		&proto_info, sizeof(proto_info))) {
-		error(_("[GLE %ld] unable to get protocol information for '%ls'"),
-		      GetLastError(), wpath);
-		CloseHandle(h);
-		return -1;
-	}
-
-	CloseHandle(h);
-
-	trace_printf_key(&trace_fsmonitor,
-				"check_remote_protocol('%ls') remote protocol %#8.8lx",
-				wpath, proto_info.Protocol);
-
-	return 0;
-}
-
-/*
- * Remote working directories are problematic for FSMonitor.
- *
- * The underlying file system on the server machine and/or the remote
- * mount type dictates whether notification events are available at
- * all to remote client machines.
- *
- * Kernel differences between the server and client machines also
- * dictate the how (buffering, frequency, de-dup) the events are
- * delivered to client machine processes.
- *
- * A client machine (such as a laptop) may choose to suspend/resume
- * and it is unclear (without lots of testing) whether the watcher can
- * resync after a resume.  We might be able to treat this as a normal
- * "events were dropped by the kernel" event and do our normal "flush
- * and resync" --or-- we might need to close the existing (zombie?)
- * notification fd and create a new one.
- *
- * In theory, the above issues need to be addressed whether we are
- * using the Hook or IPC API.
- *
- * So (for now at least), mark remote working directories as
- * incompatible.
- *
- * Notes for testing:
- *
- * (a) Windows allows a network share to be mapped to a drive letter.
- *     (This is the normal method to access it.)
- *
- *     $ NET USE Z: \\server\share
- *     $ git -C Z:/repo status
- *
- * (b) Windows allows a network share to be referenced WITHOUT mapping
- *     it to drive letter.
- *
- *     $ NET USE \\server\share\dir
- *     $ git -C //server/share/repo status
- *
- * (c) Windows allows "SUBST" to create a fake drive mapping to an
- *     arbitrary path (which may be remote)
- *
- *     $ SUBST Q: Z:\repo
- *     $ git -C Q:/ status
- *
- * (d) Windows allows a directory symlink to be created on a local
- *     file system that points to a remote repo.
- *
- *     $ mklink /d ./link //server/share/repo
- *     $ git -C ./link status
- */
-static enum fsmonitor_reason check_remote(struct repository *r)
-{
-	int ret;
-	wchar_t wpath[MAX_PATH];
-	wchar_t wfullpath[MAX_PATH];
-	size_t wlen;
-	UINT driveType;
-
-	/*
-	 * Do everything in wide chars because the drive letter might be
-	 * a multi-byte sequence.  See win32_has_dos_drive_prefix().
-	 */
-	if (xutftowcs_path(wpath, r->worktree) < 0)
-		return FSMONITOR_REASON_ERROR;
-
-	/*
-	 * GetDriveTypeW() requires a final slash.  We assume that the
-	 * worktree pathname points to an actual directory.
-	 */
-	wlen = wcslen(wpath);
-	if (wpath[wlen - 1] != L'\\' && wpath[wlen - 1] != L'/') {
-		wpath[wlen++] = L'\\';
-		wpath[wlen] = 0;
-	}
-
-	/*
-	 * Normalize the path.  If nothing else, this converts forward
-	 * slashes to backslashes.  This is essential to get GetDriveTypeW()
-	 * correctly handle some UNC "\\server\share\..." paths.
-	 */
-	if (!GetFullPathNameW(wpath, MAX_PATH, wfullpath, NULL))
-		return FSMONITOR_REASON_ERROR;
-
-	driveType = GetDriveTypeW(wfullpath);
-	trace_printf_key(&trace_fsmonitor,
-			 "DriveType '%s' L'%ls' (%u)",
-			 r->worktree, wfullpath, driveType);
-
-	if (driveType == DRIVE_REMOTE) {
-		trace_printf_key(&trace_fsmonitor,
-				 "check_remote('%s') true",
-				 r->worktree);
-
-		ret = check_remote_protocol(wfullpath);
-		if (ret < 0)
-			return FSMONITOR_REASON_ERROR;
-
-		switch (check_config_allowremote(r)) {
-		case 0: /* config overrides and disables */
-			return FSMONITOR_REASON_REMOTE;
-		case 1: /* config overrides and enables */
-			return FSMONITOR_REASON_OK;
-		default:
-			break; /* config has no opinion */
-		}
-
-		return FSMONITOR_REASON_REMOTE;
-	}
-
-	return FSMONITOR_REASON_OK;
-}
-
 enum fsmonitor_reason fsm_os__incompatible(struct repository *r)
 {
 	enum fsmonitor_reason reason;
@@ -197,9 +33,5 @@ enum fsmonitor_reason fsm_os__incompatible(struct repository *r)
 	if (reason != FSMONITOR_REASON_OK)
 		return reason;
 
-	reason = check_remote(r);
-	if (reason != FSMONITOR_REASON_OK)
-		return reason;
-
 	return FSMONITOR_REASON_OK;
 }
diff --git a/contrib/buildsystems/CMakeLists.txt b/contrib/buildsystems/CMakeLists.txt
index ea2a531be87..5482a04b3ce 100644
--- a/contrib/buildsystems/CMakeLists.txt
+++ b/contrib/buildsystems/CMakeLists.txt
@@ -308,6 +308,7 @@ 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-path-utils-win32.c)
 
 		add_compile_definitions(HAVE_FSMONITOR_OS_SETTINGS)
 		list(APPEND compat_SOURCES compat/fsmonitor/fsm-settings-win32.c)
@@ -315,6 +316,7 @@ 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-path-utils-darwin.c)
 
 		add_compile_definitions(HAVE_FSMONITOR_OS_SETTINGS)
 		list(APPEND compat_SOURCES compat/fsmonitor/fsm-settings-darwin.c)
diff --git a/fsmonitor-path-utils.h b/fsmonitor-path-utils.h
new file mode 100644
index 00000000000..41edf5b934f
--- /dev/null
+++ b/fsmonitor-path-utils.h
@@ -0,0 +1,26 @@
+#ifndef FSM_PATH_UTILS_H
+#define FSM_PATH_UTILS_H
+
+struct fs_info {
+	int is_remote;
+	char *typename;
+};
+
+/*
+ * Get some basic filesystem informtion for the given path
+ *
+ * The caller owns the storage that is occupied by fs_info and
+ * is responsible for releasing it.
+ *
+ * Returns -1 on error, zero otherwise.
+ */
+int fsmonitor__get_fs_info(const char *path, struct fs_info *fs_info);
+
+/*
+ * Determines if the filesystem that path resides on is remote.
+ *
+ * Returns -1 on error, 0 if not remote, 1 if remote.
+ */
+int fsmonitor__is_fs_remote(const char *path);
+
+#endif
diff --git a/fsmonitor-settings.c b/fsmonitor-settings.c
index 464424a1e92..d288cbad479 100644
--- a/fsmonitor-settings.c
+++ b/fsmonitor-settings.c
@@ -2,6 +2,7 @@
 #include "config.h"
 #include "repository.h"
 #include "fsmonitor-settings.h"
+#include "fsmonitor-path-utils.h"
 
 /*
  * We keep this structure defintion private and have getters
@@ -13,6 +14,52 @@ struct fsmonitor_settings {
 	char *hook_path;
 };
 
+/*
+ * Remote working directories are problematic for FSMonitor.
+ *
+ * The underlying file system on the server machine and/or the remote
+ * mount type dictates whether notification events are available at
+ * all to remote client machines.
+ *
+ * Kernel differences between the server and client machines also
+ * dictate the how (buffering, frequency, de-dup) the events are
+ * delivered to client machine processes.
+ *
+ * A client machine (such as a laptop) may choose to suspend/resume
+ * and it is unclear (without lots of testing) whether the watcher can
+ * resync after a resume.  We might be able to treat this as a normal
+ * "events were dropped by the kernel" event and do our normal "flush
+ * and resync" --or-- we might need to close the existing (zombie?)
+ * notification fd and create a new one.
+ *
+ * In theory, the above issues need to be addressed whether we are
+ * using the Hook or IPC API.
+ *
+ * So (for now at least), mark remote working directories as
+ * incompatible unless 'fsmonitor.allowRemote' is true.
+ *
+ */
+#ifdef HAVE_FSMONITOR_OS_SETTINGS
+static enum fsmonitor_reason check_remote(struct repository *r)
+{
+	int allow_remote = -1; /* -1 unset, 0 not allowed, 1 allowed */
+	int is_remote = fsmonitor__is_fs_remote(r->worktree);
+
+	switch (is_remote) {
+		case 0:
+			return FSMONITOR_REASON_OK;
+		case 1:
+			repo_config_get_bool(r, "fsmonitor.allowremote", &allow_remote);
+			if (allow_remote < 1)
+				return FSMONITOR_REASON_REMOTE;
+			else
+				return FSMONITOR_REASON_OK;
+		default:
+			return FSMONITOR_REASON_ERROR;
+	}
+}
+#endif
+
 static enum fsmonitor_reason check_for_incompatible(struct repository *r)
 {
 	if (!r->worktree) {
@@ -27,6 +74,9 @@ static enum fsmonitor_reason check_for_incompatible(struct repository *r)
 	{
 		enum fsmonitor_reason reason;
 
+		reason = check_remote(r);
+		if (reason != FSMONITOR_REASON_OK)
+			return reason;
 		reason = fsm_os__incompatible(r);
 		if (reason != FSMONITOR_REASON_OK)
 			return reason;
-- 
gitgitgadget
Previous: Eric DeCosta via GitGitGadgetNext: Ævar Arnfjörð Bjarmason
Message 159 of 170 in “fsmonitor: option to allow fsmonitor to run against network-mounted repos”
  1. fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Aug 18, 2022
  2. Junio C HamanoAug 18, 2022
  3. Junio C HamanoAug 18, 2022
  4. Johannes SchindelinAug 19, 2022
  5. Jeff HostetlerAug 19, 2022
  6. Eric DeCostaAug 19, 2022
  7. Jeff HostetlerAug 19, 2022
  8. Eric SunshineAug 19, 2022
  9. Torsten BögershausenAug 19, 2022
  10. Junio C HamanoAug 20, 2022
  11. Johannes SchindelinAug 22, 2022
  12. Junio C HamanoAug 22, 2022
  13. Jeff HostetlerAug 23, 2022
  14. Eric DeCostaAug 24, 2022
  15. 0/4 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Aug 23, 2022
  16. 1/4 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Aug 23, 2022
  17. 2/4 fsmonitor: macOS: allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Aug 23, 2022
  18. 3/4 Check working directory and Unix domain socket file for compatabilityedecosta via GitGitGadget, Aug 23, 2022
  19. 4/4 Minor refactoring and simplification of Windows settings checksedecosta via GitGitGadget, Aug 23, 2022
  20. 0/2 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Aug 23, 2022
  21. 2/2 Check working directory and Unix domain socket file for compatabilityedecosta via GitGitGadget, Aug 23, 2022
  22. Junio C Hamano, Aug 24, 2022
  23. 1/2 fsmonitor: macOS: allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Aug 23, 2022
  24. Junio C HamanoAug 24, 2022
  25. 0/4 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Aug 31, 2022
  26. 1/4 fsmonitor: add two new config options, allowRemote and socketDirEric DeCosta via GitGitGadget, Aug 31, 2022
  27. Ævar Arnfjörð BjarmasonAug 31, 2022
  28. Junio C HamanoAug 31, 2022
  29. Ramsay JonesSep 1, 2022
  30. Jeff HostetlerSep 1, 2022
  31. Jeff HostetlerSep 1, 2022
  32. Jeff HostetlerSep 1, 2022
  33. Eric DeCostaSep 2, 2022
  34. Jeff HostetlerSep 6, 2022
  35. 2/4 fsmonitor: generate unique Unix socket file name in the desired locationEric DeCosta via GitGitGadget, Aug 31, 2022
  36. Ævar Arnfjörð BjarmasonAug 31, 2022
  37. Junio C HamanoAug 31, 2022
  38. 3/4 fsmonitor: ensure filesystem and unix socket filesystem are compatibleEric DeCosta via GitGitGadget, Aug 31, 2022
  39. 4/4 fsmonitor: normalize FSEvents event paths to the real pathEric DeCosta via GitGitGadget, Aug 31, 2022
  40. Ævar Arnfjörð BjarmasonAug 31, 2022
  41. Jeff HostetlerSep 1, 2022
  42. Eric DeCostaSep 2, 2022
  43. Jeff HostetlerSep 6, 2022
  44. Eric DeCostaSep 6, 2022
  45. Eric DeCostaSep 6, 2022
  46. Eric DeCostaSep 6, 2022
  47. Jeff HostetlerSep 7, 2022
  48. Eric DeCostaSep 7, 2022
  49. 0/4 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Sep 10, 2022
  50. 1/4 fsmonitor: refactor filesystem checks to common interfaceEric DeCosta via GitGitGadget, Sep 10, 2022
  51. 2/4 fsmonitor: relocate socket file if .git directory is remoteEric DeCosta via GitGitGadget, Sep 10, 2022
  52. 3/4 fsmonitor: avoid socket location check if using hookEric DeCosta via GitGitGadget, Sep 10, 2022
  53. 4/4 fsmonitor: deal with synthetic firmlinks on macOSEric DeCosta via GitGitGadget, Sep 10, 2022
  54. Eric SunshineSep 11, 2022
  55. Junio C HamanoSep 12, 2022
  56. Junio C HamanoSep 12, 2022
  57. Eric DeCostaSep 12, 2022
  58. Junio C HamanoSep 12, 2022
  59. Eric DeCostaSep 12, 2022
  60. 0/6 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Sep 13, 2022
  61. 1/6 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Sep 13, 2022
  62. 3/6 fsmonitor: relocate socket file if .git directory is remoteEric DeCosta via GitGitGadget, Sep 13, 2022
  63. Junio C HamanoSep 14, 2022
  64. Eric DeCostaSep 14, 2022
  65. 2/6 fsmonitor: refactor filesystem checks to common interfaceEric DeCosta via GitGitGadget, Sep 13, 2022
  66. 4/6 fsmonitor: avoid socket location check if using hookEric DeCosta via GitGitGadget, Sep 13, 2022
  67. Junio C HamanoSep 14, 2022
  68. 6/6 fsmonitor: add documentation for allowRemote and socketDir optionsEric DeCosta via GitGitGadget, Sep 13, 2022
  69. 5/6 fsmonitor: deal with synthetic firmlinks on macOSEric DeCosta via GitGitGadget, Sep 13, 2022
  70. Jeff HostetlerSep 16, 2022
  71. Eric DeCostaSep 16, 2022
  72. 0/6 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Sep 16, 2022
  73. 1/6 fsmonitor: refactor filesystem checks to common interfaceEric DeCosta via GitGitGadget, Sep 16, 2022
  74. 2/6 fsmonitor: relocate socket file if .git directory is remoteEric DeCosta via GitGitGadget, Sep 16, 2022
  75. Junio C HamanoSep 16, 2022
  76. Jeff HostetlerSep 19, 2022
  77. Junio C HamanoSep 19, 2022
  78. Jeff HostetlerSep 19, 2022
  79. Junio C HamanoSep 19, 2022
  80. Eric DeCostaSep 19, 2022
  81. Jeff HostetlerSep 20, 2022
  82. Eric DeCostaSep 20, 2022
  83. 3/6 fsmonitor: avoid socket location check if using hookEric DeCosta via GitGitGadget, Sep 16, 2022
  84. 6/6 fsmonitor: add documentation for allowRemote and socketDir optionsEric DeCosta via GitGitGadget, Sep 16, 2022
  85. 5/6 fsmonitor: deal with synthetic firmlinks on macOSEric DeCosta via GitGitGadget, Sep 16, 2022
  86. Junio C HamanoSep 16, 2022
  87. 4/6 fsmonitor: deal with synthetic firmlinks on macOSEric DeCosta via GitGitGadget, Sep 16, 2022
  88. Junio C HamanoSep 16, 2022
  89. 0/5 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Sep 17, 2022
  90. 2/5 fsmonitor: relocate socket file if .git directory is remoteEric DeCosta via GitGitGadget, Sep 17, 2022
  91. Eric SunshineSep 17, 2022
  92. Junio C HamanoSep 19, 2022
  93. Eric SunshineSep 17, 2022
  94. Eric DeCostaSep 17, 2022
  95. Junio C HamanoSep 19, 2022
  96. 1/5 fsmonitor: refactor filesystem checks to common interfaceEric DeCosta via GitGitGadget, Sep 17, 2022
  97. 3/5 fsmonitor: avoid socket location check if using hookEric DeCosta via GitGitGadget, Sep 17, 2022
  98. 4/5 fsmonitor: deal with synthetic firmlinks on macOSEric DeCosta via GitGitGadget, Sep 17, 2022
  99. 5/5 fsmonitor: add documentation for allowRemote and socketDir optionsEric DeCosta via GitGitGadget, Sep 17, 2022
  100. Eric SunshineSep 17, 2022
  101. Eric DeCostaSep 19, 2022
  102. 0/6 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Sep 19, 2022
  103. 1/6 fsmonitor: refactor filesystem checks to common interfaceEric DeCosta via GitGitGadget, Sep 19, 2022
  104. 2/6 fsmonitor: relocate socket file if .git directory is remoteEric DeCosta via GitGitGadget, Sep 19, 2022
  105. Eric SunshineSep 19, 2022
  106. 3/6 fsmonitor: avoid socket location check if using hookEric DeCosta via GitGitGadget, Sep 19, 2022
  107. 4/6 fsmonitor: deal with synthetic firmlinks on macOSEric DeCosta via GitGitGadget, Sep 19, 2022
  108. 5/6 fsmonitor: check for compatability before communicating with fsmonitorEric DeCosta via GitGitGadget, Sep 19, 2022
  109. 6/6 fsmonitor: add documentation for allowRemote and socketDir optionsEric DeCosta via GitGitGadget, Sep 19, 2022
  110. 0/6 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Sep 20, 2022
  111. 2/6 fsmonitor: relocate socket file if .git directory is remoteEric DeCosta via GitGitGadget, Sep 20, 2022
  112. 1/6 fsmonitor: refactor filesystem checks to common interfaceEric DeCosta via GitGitGadget, Sep 20, 2022
  113. 3/6 fsmonitor: avoid socket location check if using hookEric DeCosta via GitGitGadget, Sep 20, 2022
  114. 5/6 fsmonitor: check for compatability before communicating with fsmonitorEric DeCosta via GitGitGadget, Sep 20, 2022
  115. Jeff HostetlerSep 21, 2022
  116. Eric DeCostaSep 21, 2022
  117. 4/6 fsmonitor: deal with synthetic firmlinks on macOSEric DeCosta via GitGitGadget, Sep 20, 2022
  118. 6/6 fsmonitor: add documentation for allowRemote and socketDir optionsEric DeCosta via GitGitGadget, Sep 20, 2022
  119. 0/6 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Sep 21, 2022
  120. 1/6 fsmonitor: refactor filesystem checks to common interfaceEric DeCosta via GitGitGadget, Sep 21, 2022
  121. 2/6 fsmonitor: relocate socket file if .git directory is remoteEric DeCosta via GitGitGadget, Sep 21, 2022
  122. 3/6 fsmonitor: avoid socket location check if using hookEric DeCosta via GitGitGadget, Sep 21, 2022
  123. 4/6 fsmonitor: deal with synthetic firmlinks on macOSEric DeCosta via GitGitGadget, Sep 21, 2022
  124. 5/6 fsmonitor: check for compatability before communicating with fsmonitorEric DeCosta via GitGitGadget, Sep 21, 2022
  125. 6/6 fsmonitor: add documentation for allowRemote and socketDir optionsEric DeCosta via GitGitGadget, Sep 21, 2022
  126. 0/6 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Sep 24, 2022
  127. 1/6 fsmonitor: refactor filesystem checks to common interfaceEric DeCosta via GitGitGadget, Sep 24, 2022
  128. 2/6 fsmonitor: relocate socket file if .git directory is remoteEric DeCosta via GitGitGadget, Sep 24, 2022
  129. 3/6 fsmonitor: avoid socket location check if using hookEric DeCosta via GitGitGadget, Sep 24, 2022
  130. 4/6 fsmonitor: deal with synthetic firmlinks on macOSEric DeCosta via GitGitGadget, Sep 24, 2022
  131. Ævar Arnfjörð BjarmasonSep 26, 2022
  132. Eric DeCostaSep 27, 2022
  133. Ævar Arnfjörð BjarmasonSep 26, 2022
  134. 5/6 fsmonitor: check for compatability before communicating with fsmonitorEric DeCosta via GitGitGadget, Sep 24, 2022
  135. Eric DeCostaSep 25, 2022
  136. Ævar Arnfjörð BjarmasonSep 26, 2022
  137. Eric DeCostaSep 27, 2022
  138. 6/6 fsmonitor: add documentation for allowRemote and socketDir optionsEric DeCosta via GitGitGadget, Sep 24, 2022
  139. Ævar Arnfjörð BjarmasonSep 26, 2022
  140. Eric SunshineSep 27, 2022
  141. Eric DeCostaSep 27, 2022
  142. Eric DeCostaSep 25, 2022
  143. 0/6 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Sep 27, 2022
  144. 1/6 fsmonitor: refactor filesystem checks to common interfaceEric DeCosta via GitGitGadget, Sep 27, 2022
  145. 2/6 fsmonitor: relocate socket file if .git directory is remoteEric DeCosta via GitGitGadget, Sep 27, 2022
  146. 3/6 fsmonitor: avoid socket location check if using hookEric DeCosta via GitGitGadget, Sep 27, 2022
  147. 4/6 fsmonitor: deal with synthetic firmlinks on macOSEric DeCosta via GitGitGadget, Sep 27, 2022
  148. Ævar Arnfjörð BjarmasonSep 28, 2022
  149. 5/6 fsmonitor: check for compatability before communicating with fsmonitorEric DeCosta via GitGitGadget, Sep 27, 2022
  150. 6/6 fsmonitor: add documentation for allowRemote and socketDir optionsEric DeCosta via GitGitGadget, Sep 27, 2022
  151. 0/6 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Sep 28, 2022
  152. 1/6 fsmonitor: refactor filesystem checks to common interfaceEric DeCosta via GitGitGadget, Sep 28, 2022
  153. 2/6 fsmonitor: relocate socket file if .git directory is remoteEric DeCosta via GitGitGadget, Sep 28, 2022
  154. 3/6 fsmonitor: avoid socket location check if using hookEric DeCosta via GitGitGadget, Sep 28, 2022
  155. 5/6 fsmonitor: check for compatability before communicating with fsmonitorEric DeCosta via GitGitGadget, Sep 28, 2022
  156. 4/6 fsmonitor: deal with synthetic firmlinks on macOSEric DeCosta via GitGitGadget, Sep 28, 2022
  157. 6/6 fsmonitor: add documentation for allowRemote and socketDir optionsEric DeCosta via GitGitGadget, Sep 28, 2022
  158. 0/6 fsmonitor: option to allow fsmonitor to run against network-mounted reposEric DeCosta via GitGitGadget, Oct 4, 2022
  159. 1/6 fsmonitor: refactor filesystem checks to common interfaceEric DeCosta via GitGitGadget, Oct 4, 2022
  160. Ævar Arnfjörð BjarmasonJan 30, 2023
  161. 2/6 fsmonitor: relocate socket file if .git directory is remoteEric DeCosta via GitGitGadget, Oct 4, 2022
  162. Ævar Arnfjörð BjarmasonJan 30, 2023
  163. 3/6 fsmonitor: avoid socket location check if using hookEric DeCosta via GitGitGadget, Oct 4, 2022
  164. 5/6 fsmonitor: check for compatability before communicating with fsmonitorEric DeCosta via GitGitGadget, Oct 4, 2022
  165. 4/6 fsmonitor: deal with synthetic firmlinks on macOSEric DeCosta via GitGitGadget, Oct 4, 2022
  166. Ævar Arnfjörð BjarmasonJan 30, 2023
  167. 6/6 fsmonitor: add documentation for allowRemote and socketDir optionsEric DeCosta via GitGitGadget, Oct 4, 2022
  168. Ævar Arnfjörð BjarmasonJan 30, 2023
  169. Junio C HamanoOct 5, 2022
  170. Eric DeCostaOct 5, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.