fsmonitor: relocate socket file if .git directory is remote
If the .git directory is on a remote filesystem, create the socket file in 'fsmonitor.socketDir' if it is defined, else create it in $HOME. Signed-off-by: Eric DeCosta <edecosta@mathworks.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
508c1a572d
commit
6beb2688d3
1
Makefile
1
Makefile
@ -2032,6 +2032,7 @@ ifdef FSMONITOR_DAEMON_BACKEND
|
|||||||
COMPAT_CFLAGS += -DHAVE_FSMONITOR_DAEMON_BACKEND
|
COMPAT_CFLAGS += -DHAVE_FSMONITOR_DAEMON_BACKEND
|
||||||
COMPAT_OBJS += compat/fsmonitor/fsm-listen-$(FSMONITOR_DAEMON_BACKEND).o
|
COMPAT_OBJS += compat/fsmonitor/fsm-listen-$(FSMONITOR_DAEMON_BACKEND).o
|
||||||
COMPAT_OBJS += compat/fsmonitor/fsm-health-$(FSMONITOR_DAEMON_BACKEND).o
|
COMPAT_OBJS += compat/fsmonitor/fsm-health-$(FSMONITOR_DAEMON_BACKEND).o
|
||||||
|
COMPAT_OBJS += compat/fsmonitor/fsm-ipc-$(FSMONITOR_DAEMON_BACKEND).o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef FSMONITOR_OS_SETTINGS
|
ifdef FSMONITOR_OS_SETTINGS
|
||||||
|
@ -1343,7 +1343,8 @@ static int fsmonitor_run_daemon(void)
|
|||||||
* directory.)
|
* directory.)
|
||||||
*/
|
*/
|
||||||
strbuf_init(&state.path_ipc, 0);
|
strbuf_init(&state.path_ipc, 0);
|
||||||
strbuf_addstr(&state.path_ipc, absolute_path(fsmonitor_ipc__get_path()));
|
strbuf_addstr(&state.path_ipc,
|
||||||
|
absolute_path(fsmonitor_ipc__get_path(the_repository)));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Confirm that we can create platform-specific resources for the
|
* Confirm that we can create platform-specific resources for the
|
||||||
|
52
compat/fsmonitor/fsm-ipc-darwin.c
Normal file
52
compat/fsmonitor/fsm-ipc-darwin.c
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#include "cache.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "strbuf.h"
|
||||||
|
#include "fsmonitor.h"
|
||||||
|
#include "fsmonitor-ipc.h"
|
||||||
|
#include "fsmonitor-path-utils.h"
|
||||||
|
|
||||||
|
static GIT_PATH_FUNC(fsmonitor_ipc__get_default_path, "fsmonitor--daemon.ipc")
|
||||||
|
|
||||||
|
const char *fsmonitor_ipc__get_path(struct repository *r)
|
||||||
|
{
|
||||||
|
static const char *ipc_path = NULL;
|
||||||
|
SHA_CTX sha1ctx;
|
||||||
|
char *sock_dir = NULL;
|
||||||
|
struct strbuf ipc_file = STRBUF_INIT;
|
||||||
|
unsigned char hash[SHA_DIGEST_LENGTH];
|
||||||
|
|
||||||
|
if (!r)
|
||||||
|
BUG("No repository passed into fsmonitor_ipc__get_path");
|
||||||
|
|
||||||
|
if (ipc_path)
|
||||||
|
return ipc_path;
|
||||||
|
|
||||||
|
|
||||||
|
/* By default the socket file is created in the .git directory */
|
||||||
|
if (fsmonitor__is_fs_remote(r->gitdir) < 1) {
|
||||||
|
ipc_path = fsmonitor_ipc__get_default_path();
|
||||||
|
return ipc_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHA1_Init(&sha1ctx);
|
||||||
|
SHA1_Update(&sha1ctx, r->worktree, strlen(r->worktree));
|
||||||
|
SHA1_Final(hash, &sha1ctx);
|
||||||
|
|
||||||
|
repo_config_get_string(r, "fsmonitor.socketdir", &sock_dir);
|
||||||
|
|
||||||
|
/* Create the socket file in either socketDir or $HOME */
|
||||||
|
if (sock_dir && *sock_dir) {
|
||||||
|
strbuf_addf(&ipc_file, "%s/.git-fsmonitor-%s",
|
||||||
|
sock_dir, hash_to_hex(hash));
|
||||||
|
} else {
|
||||||
|
strbuf_addf(&ipc_file, "~/.git-fsmonitor-%s", hash_to_hex(hash));
|
||||||
|
}
|
||||||
|
free(sock_dir);
|
||||||
|
|
||||||
|
ipc_path = interpolate_path(ipc_file.buf, 1);
|
||||||
|
if (!ipc_path)
|
||||||
|
die(_("Invalid path: %s"), ipc_file.buf);
|
||||||
|
|
||||||
|
strbuf_release(&ipc_file);
|
||||||
|
return ipc_path;
|
||||||
|
}
|
9
compat/fsmonitor/fsm-ipc-win32.c
Normal file
9
compat/fsmonitor/fsm-ipc-win32.c
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#include "config.h"
|
||||||
|
#include "fsmonitor-ipc.h"
|
||||||
|
|
||||||
|
const char *fsmonitor_ipc__get_path(struct repository *r) {
|
||||||
|
static char *ret;
|
||||||
|
if (!ret)
|
||||||
|
ret = git_pathdup("fsmonitor--daemon.ipc");
|
||||||
|
return ret;
|
||||||
|
}
|
@ -26,7 +26,7 @@
|
|||||||
static enum fsmonitor_reason check_uds_volume(struct repository *r)
|
static enum fsmonitor_reason check_uds_volume(struct repository *r)
|
||||||
{
|
{
|
||||||
struct fs_info fs;
|
struct fs_info fs;
|
||||||
const char *ipc_path = fsmonitor_ipc__get_path();
|
const char *ipc_path = fsmonitor_ipc__get_path(r);
|
||||||
struct strbuf path = STRBUF_INIT;
|
struct strbuf path = STRBUF_INIT;
|
||||||
strbuf_add(&path, ipc_path, strlen(ipc_path));
|
strbuf_add(&path, ipc_path, strlen(ipc_path));
|
||||||
|
|
||||||
|
@ -308,6 +308,7 @@ if(SUPPORTS_SIMPLE_IPC)
|
|||||||
add_compile_definitions(HAVE_FSMONITOR_DAEMON_BACKEND)
|
add_compile_definitions(HAVE_FSMONITOR_DAEMON_BACKEND)
|
||||||
list(APPEND compat_SOURCES compat/fsmonitor/fsm-listen-win32.c)
|
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-health-win32.c)
|
||||||
|
list(APPEND compat_SOURCES compat/fsmonitor/fsm-ipc-win32.c)
|
||||||
list(APPEND compat_SOURCES compat/fsmonitor/fsm-path-utils-win32.c)
|
list(APPEND compat_SOURCES compat/fsmonitor/fsm-path-utils-win32.c)
|
||||||
|
|
||||||
add_compile_definitions(HAVE_FSMONITOR_OS_SETTINGS)
|
add_compile_definitions(HAVE_FSMONITOR_OS_SETTINGS)
|
||||||
@ -316,6 +317,7 @@ if(SUPPORTS_SIMPLE_IPC)
|
|||||||
add_compile_definitions(HAVE_FSMONITOR_DAEMON_BACKEND)
|
add_compile_definitions(HAVE_FSMONITOR_DAEMON_BACKEND)
|
||||||
list(APPEND compat_SOURCES compat/fsmonitor/fsm-listen-darwin.c)
|
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-health-darwin.c)
|
||||||
|
list(APPEND compat_SOURCES compat/fsmonitor/fsm-ipc-darwin.c)
|
||||||
list(APPEND compat_SOURCES compat/fsmonitor/fsm-path-utils-darwin.c)
|
list(APPEND compat_SOURCES compat/fsmonitor/fsm-path-utils-darwin.c)
|
||||||
|
|
||||||
add_compile_definitions(HAVE_FSMONITOR_OS_SETTINGS)
|
add_compile_definitions(HAVE_FSMONITOR_OS_SETTINGS)
|
||||||
|
@ -18,7 +18,7 @@ int fsmonitor_ipc__is_supported(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *fsmonitor_ipc__get_path(void)
|
const char *fsmonitor_ipc__get_path(struct repository *r)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -47,11 +47,9 @@ int fsmonitor_ipc__is_supported(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
GIT_PATH_FUNC(fsmonitor_ipc__get_path, "fsmonitor--daemon.ipc")
|
|
||||||
|
|
||||||
enum ipc_active_state fsmonitor_ipc__get_state(void)
|
enum ipc_active_state fsmonitor_ipc__get_state(void)
|
||||||
{
|
{
|
||||||
return ipc_get_active_state(fsmonitor_ipc__get_path());
|
return ipc_get_active_state(fsmonitor_ipc__get_path(the_repository));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int spawn_daemon(void)
|
static int spawn_daemon(void)
|
||||||
@ -81,8 +79,8 @@ int fsmonitor_ipc__send_query(const char *since_token,
|
|||||||
trace2_data_string("fsm_client", NULL, "query/command", tok);
|
trace2_data_string("fsm_client", NULL, "query/command", tok);
|
||||||
|
|
||||||
try_again:
|
try_again:
|
||||||
state = ipc_client_try_connect(fsmonitor_ipc__get_path(), &options,
|
state = ipc_client_try_connect(fsmonitor_ipc__get_path(the_repository),
|
||||||
&connection);
|
&options, &connection);
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case IPC_STATE__LISTENING:
|
case IPC_STATE__LISTENING:
|
||||||
@ -117,13 +115,13 @@ try_again:
|
|||||||
|
|
||||||
case IPC_STATE__INVALID_PATH:
|
case IPC_STATE__INVALID_PATH:
|
||||||
ret = error(_("fsmonitor_ipc__send_query: invalid path '%s'"),
|
ret = error(_("fsmonitor_ipc__send_query: invalid path '%s'"),
|
||||||
fsmonitor_ipc__get_path());
|
fsmonitor_ipc__get_path(the_repository));
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
case IPC_STATE__OTHER_ERROR:
|
case IPC_STATE__OTHER_ERROR:
|
||||||
default:
|
default:
|
||||||
ret = error(_("fsmonitor_ipc__send_query: unspecified error on '%s'"),
|
ret = error(_("fsmonitor_ipc__send_query: unspecified error on '%s'"),
|
||||||
fsmonitor_ipc__get_path());
|
fsmonitor_ipc__get_path(the_repository));
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,8 +147,8 @@ int fsmonitor_ipc__send_command(const char *command,
|
|||||||
options.wait_if_busy = 1;
|
options.wait_if_busy = 1;
|
||||||
options.wait_if_not_found = 0;
|
options.wait_if_not_found = 0;
|
||||||
|
|
||||||
state = ipc_client_try_connect(fsmonitor_ipc__get_path(), &options,
|
state = ipc_client_try_connect(fsmonitor_ipc__get_path(the_repository),
|
||||||
&connection);
|
&options, &connection);
|
||||||
if (state != IPC_STATE__LISTENING) {
|
if (state != IPC_STATE__LISTENING) {
|
||||||
die(_("fsmonitor--daemon is not running"));
|
die(_("fsmonitor--daemon is not running"));
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
#include "simple-ipc.h"
|
#include "simple-ipc.h"
|
||||||
|
|
||||||
|
struct repository;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns true if built-in file system monitor daemon is defined
|
* Returns true if built-in file system monitor daemon is defined
|
||||||
* for this platform.
|
* for this platform.
|
||||||
@ -16,7 +18,7 @@ int fsmonitor_ipc__is_supported(void);
|
|||||||
*
|
*
|
||||||
* Returns NULL if the daemon is not supported on this platform.
|
* Returns NULL if the daemon is not supported on this platform.
|
||||||
*/
|
*/
|
||||||
const char *fsmonitor_ipc__get_path(void);
|
const char *fsmonitor_ipc__get_path(struct repository *r);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Try to determine whether there is a `git-fsmonitor--daemon` process
|
* Try to determine whether there is a `git-fsmonitor--daemon` process
|
||||||
|
Loading…
Reference in New Issue
Block a user