From: Patrick Steinhardt Date: Mon, 05 Jan 2026 12:07:51 GMT Subject: Re: [PATCH v4] fsmonitor: implement filesystem change listener for Linux Message-ID: In-Reply-To: On Wed, Dec 31, 2025 at 05:41:34PM +0000, Paul Tarjan via GitGitGadget wrote: > From: Paul Tarjan > > Implement fsmonitor for Linux using the inotify API, bringing it to > feature parity with existing Windows and macOS implementations. > > The Linux implementation uses inotify to monitor filesystem events. > Unlike macOS's FSEvents which can watch a single root directory, > inotify requires registering watches on every directory of interest. > The implementation carefully handles directory renames and moves > using inotify's cookie mechanism to track IN_MOVED_FROM/IN_MOVED_TO > event pairs. > > Key implementation details: > - Uses inotify_init1(O_NONBLOCK) for non-blocking event monitoring > - Maintains bidirectional hashmaps between watch descriptors and paths > for efficient event processing > - Handles directory creation, deletion, and renames dynamically > - Detects remote filesystems (NFS, CIFS, SMB, etc.) via statfs() > - Falls back to $HOME/.git-fsmonitor-* for socket when .git is remote > - Creates batches lazily (only for actual file events, not cookies) > to avoid spurious sequence number increments > > Build configuration: > - Enabled via FSMONITOR_DAEMON_BACKEND=linux and FSMONITOR_OS_SETTINGS=linux > - Requires NO_PTHREADS and NO_UNIX_SOCKETS to be unset > - Adds HAVE_LINUX_MAGIC_H for filesystem type detection This would also need the below patch to support Meson. Would be great if you include it, otherwise I can send it as a separate patch once this topic lands. Thanks! Patrick -- >8 -- diff --git a/meson.build b/meson.build index dd52efd1c8..0130d40702 100644 --- a/meson.build +++ b/meson.build @@ -1322,6 +1322,9 @@ endif fsmonitor_backend = '' if host_machine.system() == 'windows' fsmonitor_backend = 'win32' +elif host_machine.system() == 'linux' and threads.found() and compiler.has_header('linux/magic.h') + fsmonitor_backend = 'linux' + libgit_c_args += '-DHAVE_LINUX_MAGIC_H' elif host_machine.system() == 'darwin' fsmonitor_backend = 'darwin' libgit_dependencies += dependency('CoreServices')