]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fsmonitor: option to allow fsmonitor to run against network-mounted repos
authorEric DeCosta <edecosta@mathworks.com>
Thu, 11 Aug 2022 23:57:11 +0000 (23:57 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 12 Aug 2022 04:03:09 +0000 (21:03 -0700)
Though perhaps not common, there are use cases where users have large,
network-mounted repos. Having the ability to run fsmonitor against
network paths would benefit those users.

Most modern Samba-based filers have the necessary support to enable
fsmonitor on network-mounted repos. As a first step towards enabling
fsmonitor to work against network-mounted repos, introduce a
configuration option, 'fsmonitor.allowRemote'. Setting this option to
true will override the default behavior (erroring-out) when a
network-mounted repo is detected by fsmonitor.

Signed-off-by: Eric DeCosta <edecosta@mathworks.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/fsmonitor/fsm-settings-win32.c

index 907655720bb41e303e5ce86ae367778608b08548..e5ec5b0a9f73bcf04085b5d62d7b123690ce937e 100644 (file)
@@ -24,6 +24,59 @@ 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.
  *
@@ -76,6 +129,7 @@ static enum fsmonitor_reason check_vfs4git(struct repository *r)
  */
 static enum fsmonitor_reason check_remote(struct repository *r)
 {
+       int ret;
        wchar_t wpath[MAX_PATH];
        wchar_t wfullpath[MAX_PATH];
        size_t wlen;
@@ -115,6 +169,20 @@ static enum fsmonitor_reason check_remote(struct repository *r)
                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;
        }