@@ -1,7 +1,6 @@
#include "cache.h"
-#include "fsmonitor.h"
-#include "simple-ipc.h"
#include "fsmonitor-ipc.h"
+#include "fsmonitor-settings.h"
#include "run-command.h"
#include "strbuf.h"
#include "trace2.h"
@@ -47,7 +46,42 @@ int fsmonitor_ipc__is_supported(void)
return 1;
}
-GIT_PATH_FUNC(fsmonitor_ipc__get_path, "fsmonitor--daemon.ipc")
+GIT_PATH_FUNC(fsmonitor_ipc__get_default_path, "fsmonitor--daemon.ipc")
+
+const char *fsmonitor_ipc__get_path(void)
+{
+#ifdef WIN32
+ return fsmonitor_ipc__get_default_path();
+#else
+ char *retval;
+ SHA_CTX sha1ctx;
+ const char *git_dir;
+ const char *sock_dir;
+ struct strbuf ipc_file = STRBUF_INIT;
+ unsigned char hash[SHA_DIGEST_LENGTH];
+
+ if (fsm_settings__get_allow_remote(the_repository) < 1)
+ return fsmonitor_ipc__get_default_path();
+
+ git_dir = get_git_dir();
+ sock_dir = fsm_settings__get_socket_dir(the_repository);
+
+ SHA1_Init(&sha1ctx);
+ SHA1_Update(&sha1ctx, git_dir, strlen(git_dir));
+ SHA1_Final(hash, &sha1ctx);
+
+ 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));
+ retval = interpolate_path(ipc_file.buf, 1);
+ if (!retval)
+ die(_("Invalid path: %s"), ipc_file.buf);
+ strbuf_release(&ipc_file);
+ return retval;
+#endif
+}
enum ipc_active_state fsmonitor_ipc__get_state(void)
{
@@ -18,6 +18,12 @@ int fsmonitor_ipc__is_supported(void);
*/
const char *fsmonitor_ipc__get_path(void);
+/*
+ * Returns the pathname to the default IPC named pipe or Unix domain
+ * socket.
+ */
+const char *fsmonitor_ipc__get_default_path(void);
+
/*
* Try to determine whether there is a `git-fsmonitor--daemon` process
* listening on the IPC pipe/socket.
@@ -10,7 +10,9 @@
struct fsmonitor_settings {
enum fsmonitor_mode mode;
enum fsmonitor_reason reason;
+ int allow_remote;
char *hook_path;
+ char *sock_dir;
};
static enum fsmonitor_reason check_for_incompatible(struct repository *r)
@@ -43,6 +45,7 @@ static struct fsmonitor_settings *alloc_settings(void)
CALLOC_ARRAY(s, 1);
s->mode = FSMONITOR_MODE_DISABLED;
s->reason = FSMONITOR_REASON_UNTESTED;
+ s->allow_remote = -1;
return s;
}
@@ -90,6 +93,26 @@ static void lookup_fsmonitor_settings(struct repository *r)
fsm_settings__set_disabled(r);
}
+int fsm_settings__get_allow_remote(struct repository *r)
+{
+ if (!r)
+ r = the_repository;
+ if (!r->settings.fsmonitor)
+ lookup_fsmonitor_settings(r);
+
+ return r->settings.fsmonitor->allow_remote;
+}
+
+const char *fsm_settings__get_socket_dir(struct repository *r)
+{
+ if (!r)
+ r = the_repository;
+ if (!r->settings.fsmonitor)
+ lookup_fsmonitor_settings(r);
+
+ return r->settings.fsmonitor->sock_dir;
+}
+
enum fsmonitor_mode fsm_settings__get_mode(struct repository *r)
{
if (!r)
@@ -100,6 +123,7 @@ enum fsmonitor_mode fsm_settings__get_mode(struct repository *r)
return r->settings.fsmonitor->mode;
}
+
const char *fsm_settings__get_hook_path(struct repository *r)
{
if (!r)
@@ -110,9 +134,44 @@ const char *fsm_settings__get_hook_path(struct repository *r)
return r->settings.fsmonitor->hook_path;
}
+void fsm_settings__set_allow_remote(struct repository *r)
+{
+ int allow;
+
+ if (!r)
+ r = the_repository;
+ if (!r->settings.fsmonitor)
+ r->settings.fsmonitor = alloc_settings();
+ if (!repo_config_get_bool(r, "fsmonitor.allowremote", &allow))
+ r->settings.fsmonitor->allow_remote = allow;
+
+ return;
+}
+
+void fsm_settings__set_socket_dir(struct repository *r)
+{
+ const char *path;
+
+ if (!r)
+ r = the_repository;
+ if (!r->settings.fsmonitor)
+ r->settings.fsmonitor = alloc_settings();
+
+ if (!repo_config_get_pathname(r, "fsmonitor.socketdir", &path)) {
+ FREE_AND_NULL(r->settings.fsmonitor->sock_dir);
+ r->settings.fsmonitor->sock_dir = strdup(path);
+ }
+
+ return;
+}
+
void fsm_settings__set_ipc(struct repository *r)
{
- enum fsmonitor_reason reason = check_for_incompatible(r);
+ enum fsmonitor_reason reason;
+
+ fsm_settings__set_allow_remote(r);
+ fsm_settings__set_socket_dir(r);
+ reason = check_for_incompatible(r);
if (reason != FSMONITOR_REASON_OK) {
fsm_settings__set_incompatible(r, reason);
@@ -135,7 +194,11 @@ void fsm_settings__set_ipc(struct repository *r)
void fsm_settings__set_hook(struct repository *r, const char *path)
{
- enum fsmonitor_reason reason = check_for_incompatible(r);
+ enum fsmonitor_reason reason;
+
+ fsm_settings__set_allow_remote(r);
+ fsm_settings__set_socket_dir(r);
+ reason = check_for_incompatible(r);
if (reason != FSMONITOR_REASON_OK) {
fsm_settings__set_incompatible(r, reason);
@@ -23,12 +23,16 @@ enum fsmonitor_reason {
FSMONITOR_REASON_NOSOCKETS, /* NTFS,FAT32 do not support Unix sockets */
};
+void fsm_settings__set_allow_remote(struct repository *r);
+void fsm_settings__set_socket_dir(struct repository *r);
void fsm_settings__set_ipc(struct repository *r);
void fsm_settings__set_hook(struct repository *r, const char *path);
void fsm_settings__set_disabled(struct repository *r);
void fsm_settings__set_incompatible(struct repository *r,
enum fsmonitor_reason reason);
+int fsm_settings__get_allow_remote(struct repository *r);
+const char *fsm_settings__get_socket_dir(struct repository *r);
enum fsmonitor_mode fsm_settings__get_mode(struct repository *r);
const char *fsm_settings__get_hook_path(struct repository *r);