#include <sys/mount.h>
/*
- * Remote working directories are problematic for FSMonitor.
+ * [1] Remote working directories are problematic for FSMonitor.
*
* The underlying file system on the server machine and/or the remote
* mount type (NFS, SAMBA, etc.) dictates whether notification events
*
* So (for now at least), mark remote working directories as
* incompatible.
+ *
+ *
+ * [2] 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_remote(struct repository *r)
+static enum fsmonitor_reason check_volume(struct repository *r)
{
struct statfs fs;
if (!(fs.f_flags & MNT_LOCAL))
return FSMONITOR_REASON_REMOTE;
+ if (!strcmp(fs.f_fstypename, "msdos")) /* aka FAT32 */
+ return FSMONITOR_REASON_NOSOCKETS;
+
+ if (!strcmp(fs.f_fstypename, "ntfs"))
+ return FSMONITOR_REASON_NOSOCKETS;
+
return FSMONITOR_REASON_OK;
}
{
enum fsmonitor_reason reason;
- reason = check_remote(r);
+ reason = check_volume(r);
if (reason != FSMONITOR_REASON_OK)
return reason;
_("virtual repository '%s' is incompatible with fsmonitor"),
r->worktree);
goto done;
+
+ case FSMONITOR_REASON_NOSOCKETS:
+ strbuf_addf(&msg,
+ _("repository '%s' is incompatible with fsmonitor due to lack of Unix sockets"),
+ r->worktree);
+ goto done;
}
BUG("Unhandled case in fsm_settings__get_incompatible_msg: '%d'",
FSMONITOR_REASON_ERROR, /* FS error probing for compatibility */
FSMONITOR_REASON_REMOTE,
FSMONITOR_REASON_VFS4GIT, /* VFS for Git virtualization */
+ FSMONITOR_REASON_NOSOCKETS, /* NTFS,FAT32 do not support Unix sockets */
};
void fsm_settings__set_ipc(struct repository *r);