Skip to content

Commit

Permalink
fsmonitor: rebase with master
Browse files Browse the repository at this point in the history
  • Loading branch information
edecosta-mw authored and Marzi1904 committed Feb 8, 2024
1 parent 235986b commit f2d6291
Show file tree
Hide file tree
Showing 7 changed files with 142 additions and 119 deletions.
24 changes: 24 additions & 0 deletions compat/fsmonitor/fsm-health-linux.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include "cache.h"
#include "config.h"
#include "fsmonitor.h"
#include "fsm-health.h"
#include "fsmonitor--daemon.h"

int fsm_health__ctor(struct fsmonitor_daemon_state *state)
{
return 0;
}

void fsm_health__dtor(struct fsmonitor_daemon_state *state)
{
return;
}

void fsm_health__loop(struct fsmonitor_daemon_state *state)
{
return;
}

void fsm_health__stop_async(struct fsmonitor_daemon_state *state)
{
}
57 changes: 1 addition & 56 deletions compat/fsmonitor/fsm-ipc-darwin.c
Original file line number Diff line number Diff line change
@@ -1,56 +1 @@
#include "git-compat-util.h"
#include "config.h"
#include "gettext.h"
#include "hex.h"
#include "path.h"
#include "repository.h"
#include "strbuf.h"
#include "fsmonitor-ll.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;
git_SHA_CTX sha1ctx;
char *sock_dir = NULL;
struct strbuf ipc_file = STRBUF_INIT;
unsigned char hash[GIT_MAX_RAWSZ];

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

git_SHA1_Init(&sha1ctx);
git_SHA1_Update(&sha1ctx, r->worktree, strlen(r->worktree));
git_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;
}
#include "fsm-ipc-unix.c"
1 change: 1 addition & 0 deletions compat/fsmonitor/fsm-ipc-linux.c
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include "fsm-ipc-unix.c"
53 changes: 53 additions & 0 deletions compat/fsmonitor/fsm-ipc-unix.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#include "cache.h"
#include "config.h"
#include "hex.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;
git_SHA_CTX sha1ctx;
char *sock_dir = NULL;
struct strbuf ipc_file = STRBUF_INIT;
unsigned char hash[GIT_MAX_RAWSZ];

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

git_SHA1_Init(&sha1ctx);
git_SHA1_Update(&sha1ctx, r->worktree, strlen(r->worktree));
git_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;
}
64 changes: 1 addition & 63 deletions compat/fsmonitor/fsm-settings-darwin.c
Original file line number Diff line number Diff line change
@@ -1,63 +1 @@
#include "git-compat-util.h"
#include "config.h"
#include "fsmonitor-ll.h"
#include "fsmonitor-ipc.h"
#include "fsmonitor-settings.h"
#include "fsmonitor-path-utils.h"

/*
* For the builtin FSMonitor, we create the Unix domain socket for the
* IPC in the .git directory. If the working directory is remote,
* then the socket will be created on the remote file system. This
* can fail if the remote file system does not support UDS file types
* (e.g. smbfs to a Windows server) or if the remote kernel does not
* allow a non-local process to bind() the socket. (These problems
* could be fixed by moving the UDS out of the .git directory and to a
* well-known local directory on the client machine, but care should
* be taken to ensure that $HOME is actually local and not a managed
* file share.)
*
* FAT32 and NTFS working directories are problematic too.
*
* The builtin FSMonitor uses a Unix domain socket in the .git
* directory for IPC. These Windows drive formats do not support
* Unix domain sockets, so mark them as incompatible for the daemon.
*
*/
static enum fsmonitor_reason check_uds_volume(struct repository *r)
{
struct fs_info fs;
const char *ipc_path = fsmonitor_ipc__get_path(r);
struct strbuf path = STRBUF_INIT;
strbuf_add(&path, ipc_path, strlen(ipc_path));

if (fsmonitor__get_fs_info(dirname(path.buf), &fs) == -1) {
strbuf_release(&path);
return FSMONITOR_REASON_ERROR;
}

strbuf_release(&path);

if (fs.is_remote ||
!strcmp(fs.typename, "msdos") ||
!strcmp(fs.typename, "ntfs")) {
free(fs.typename);
return FSMONITOR_REASON_NOSOCKETS;
}

free(fs.typename);
return FSMONITOR_REASON_OK;
}

enum fsmonitor_reason fsm_os__incompatible(struct repository *r, int ipc)
{
enum fsmonitor_reason reason;

if (ipc) {
reason = check_uds_volume(r);
if (reason != FSMONITOR_REASON_OK)
return reason;
}

return FSMONITOR_REASON_OK;
}
#include "fsm-settings-unix.c"
1 change: 1 addition & 0 deletions compat/fsmonitor/fsm-settings-linux.c
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include "fsm-settings-unix.c"
61 changes: 61 additions & 0 deletions compat/fsmonitor/fsm-settings-unix.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#include "fsmonitor.h"
#include "fsmonitor-ipc.h"
#include "fsmonitor-path-utils.h"

/*
* For the builtin FSMonitor, we create the Unix domain socket for the
* IPC in the .git directory. If the working directory is remote,
* then the socket will be created on the remote file system. This
* can fail if the remote file system does not support UDS file types
* (e.g. smbfs to a Windows server) or if the remote kernel does not
* allow a non-local process to bind() the socket. (These problems
* could be fixed by moving the UDS out of the .git directory and to a
* well-known local directory on the client machine, but care should
* be taken to ensure that $HOME is actually local and not a managed
* file share.)
*
* FAT32 and NTFS working directories are problematic too.
*
* The builtin FSMonitor uses a Unix domain socket in the .git
* directory for IPC. These Windows drive formats do not support
* Unix domain sockets, so mark them as incompatible for the daemon.
*
*/
static enum fsmonitor_reason check_uds_volume(struct repository *r)
{
struct fs_info fs;
const char *ipc_path = fsmonitor_ipc__get_path(r);
struct strbuf path = STRBUF_INIT;
strbuf_addstr(&path, ipc_path);

if (fsmonitor__get_fs_info(dirname(path.buf), &fs) == -1) {
free(fs.typename);
strbuf_release(&path);
return FSMONITOR_REASON_ERROR;
}

strbuf_release(&path);

if (fs.is_remote ||
!strcmp(fs.typename, "msdos") ||
!strcmp(fs.typename, "ntfs")) {
free(fs.typename);
return FSMONITOR_REASON_NOSOCKETS;
}

free(fs.typename);
return FSMONITOR_REASON_OK;
}

enum fsmonitor_reason fsm_os__incompatible(struct repository *r, int ipc)
{
enum fsmonitor_reason reason;

if (ipc) {
reason = check_uds_volume(r);
if (reason != FSMONITOR_REASON_OK)
return reason;
}

return FSMONITOR_REASON_OK;
}

0 comments on commit f2d6291

Please sign in to comment.