Merge branch 'ed/fsmonitor-on-network-disk'

The built-in fsmonitor refuses to work on a network mounted
repositories; a configuration knob for users to override this has
been introduced.

* ed/fsmonitor-on-network-disk:
  fsmonitor: option to allow fsmonitor to run against network-mounted repos
This commit is contained in:
Junio C Hamano 2022-09-13 11:38:22 -07:00
Родитель dd3f6c4cae 85dc0da6dc
Коммит 0479138645
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;
}