This patch series adds a builtin FSMonitor daemon to Git. This daemon uses platform-specific filesystem notifications to keep track of changes to a working directory. It also listens over the "Simple IPC" facility for client requests and responds with a list of files/directories that have been recently modified. Client commands, such as git status, already know how to request a list of modified files via the FSMonitor Hook. This patch series teaches client commands to talk directly to the daemon via IPC and avoid the overhead of the hook API. (Hook process creation can be expensive on Windows.) Since the daemon is a feature of Git, rather than a generic third-party tool like Watchman, the daemon can format its response to be exactly what the client needs, so there is no need for a hook process to proxy and reformat the data. For example, when Watchman is used, Watchman responds in JSON and the hook process (typically a PERL script) must parse it and convert it into a simple NUL-delimited list. FSMonitor daemon responses are already in this NUL-delimited format, so no processing is required. The current daemon implementation is rather simple in that it just records the set of files/directories that have changed. For example, it is not aware of specific Git features, such as .gitignore and doesn't attempt to filter out ignored files. Having a Git-specific daemon lets us explore such things in the future. Finally, having a builtin daemon eliminates the need for user to download and install a third-party tool. This makes enterprise deployments simpler since there are fewer parts to install, maintain, and updates to track. This RFC version includes support for Windows and MacOS file system events. A Linux version will be submitted in a later patch series. This patch series is being previewed as an experimental feature in Git for Windows v2.31.0.windows.1. This patch series requires the jh/simple-ipc and jh/fsmonitor-prework patch series. Jeff Hostetler (21): fsmonitor--daemon: man page and documentation fsmonitor-ipc: create client routines for git-fsmonitor--daemon fsmonitor--daemon: add a built-in fsmonitor daemon fsmonitor--daemon: implement client command options fsmonitor-fs-listen-win32: stub in backend for Windows fsmonitor-fs-listen-macos: stub in backend for MacOS fsmonitor--daemon: implement daemon command options fsmonitor--daemon: add pathname classification fsmonitor--daemon: define token-ids fsmonitor--daemon: create token-based changed path cache fsmonitor-fs-listen-win32: implement FSMonitor backend on Windows fsmonitor-fs-listen-macos: add macos header files for FSEvent fsmonitor-fs-listen-macos: implement FSEvent listener on MacOS fsmonitor--daemon: implement handle_client callback fsmonitor--daemon: periodically truncate list of modified files fsmonitor--daemon:: introduce client delay for testing fsmonitor--daemon: use a cookie file to sync with file system fsmonitor: force update index when fsmonitor token advances t7527: create test for fsmonitor--daemon p7519: add fsmonitor--daemon t7527: test status with untracked-cache and fsmonitor--daemon Johannes Schindelin (2): config: FSMonitor is repository-specific fsmonitor: introduce `core.useBuiltinFSMonitor` to call the daemon via IPC .gitignore | 1 + Documentation/config/core.txt | 45 +- Documentation/git-fsmonitor--daemon.txt | 104 ++ Documentation/git-update-index.txt | 4 +- Documentation/githooks.txt | 3 +- Makefile | 15 + builtin.h | 1 + builtin/fsmonitor--daemon.c | 1611 ++++++++++++++++++ builtin/update-index.c | 4 +- compat/fsmonitor/fsmonitor-fs-listen-macos.c | 484 ++++++ compat/fsmonitor/fsmonitor-fs-listen-win32.c | 514 ++++++ compat/fsmonitor/fsmonitor-fs-listen.h | 49 + config.c | 9 +- config.h | 2 +- config.mak.uname | 4 + contrib/buildsystems/CMakeLists.txt | 8 + fsmonitor--daemon.h | 142 ++ fsmonitor-ipc.c | 153 ++ fsmonitor-ipc.h | 48 + fsmonitor.c | 32 +- git.c | 1 + help.c | 4 + repo-settings.c | 3 + repository.h | 2 + t/perf/p7519-fsmonitor.sh | 37 +- t/t7527-builtin-fsmonitor.sh | 582 +++++++ 26 files changed, 3839 insertions(+), 23 deletions(-) create mode 100644 Documentation/git-fsmonitor--daemon.txt create mode 100644 builtin/fsmonitor--daemon.c create mode 100644 compat/fsmonitor/fsmonitor-fs-listen-macos.c create mode 100644 compat/fsmonitor/fsmonitor-fs-listen-win32.c create mode 100644 compat/fsmonitor/fsmonitor-fs-listen.h create mode 100644 fsmonitor--daemon.h create mode 100644 fsmonitor-ipc.c create mode 100644 fsmonitor-ipc.h create mode 100755 t/t7527-builtin-fsmonitor.sh base-commit: f1725819714fbcd96c47ae5f14e00cc01045272f Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-923%2Fjeffhostetler%2Fbuiltin-fsmonitor-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-923/jeffhostetler/builtin-fsmonitor-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/923 -- gitgitgadget