Re: [PATCH v4] fsmonitor: implement filesystem change listener for Linux
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Jan 5, 2026, 12:07 UTC
- Message-ID
- <aVuplzNaoCHlZG3S@pks.im>
- In-Reply-To
- <pull.2147.v4.git.git.1767202894884.gitgitgadget@gmail.com>
On Wed, Dec 31, 2025 at 05:41:34PM +0000, Paul Tarjan via GitGitGadget wrote:
Show 26 quoted lines
> From: Paul Tarjan <github@paulisageek.com> > > 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')