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:
@ -24,6 +24,59 @@ static enum fsmonitor_reason check_vfs4git(struct repository *r)
|
|||||||
return FSMONITOR_REASON_OK;
|
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.
|
* 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)
|
static enum fsmonitor_reason check_remote(struct repository *r)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
wchar_t wpath[MAX_PATH];
|
wchar_t wpath[MAX_PATH];
|
||||||
wchar_t wfullpath[MAX_PATH];
|
wchar_t wfullpath[MAX_PATH];
|
||||||
size_t wlen;
|
size_t wlen;
|
||||||
@ -115,6 +169,20 @@ static enum fsmonitor_reason check_remote(struct repository *r)
|
|||||||
trace_printf_key(&trace_fsmonitor,
|
trace_printf_key(&trace_fsmonitor,
|
||||||
"check_remote('%s') true",
|
"check_remote('%s') true",
|
||||||
r->worktree);
|
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_REMOTE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user