fsmonitor: option to allow fsmonitor to run against network-mounted repos

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>
This commit is contained in:
Eric DeCosta 2022-08-11 23:57:11 +00:00 коммит произвёл Junio C Hamano
Родитель 5502f77b69
Коммит 85dc0da6dc
1 изменённых файлов: 68 добавлений и 0 удалений

Просмотреть файл

@ -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;
}