From: Victoria Dye Date: Wed, 17 Aug 2022 23:47:13 GMT Subject: Re: [PATCH v2 3/5] scalar: enable built-in FSMonitor on `register` Message-ID: <3a238691-c37f-39a1-f4f6-2b8f9b4c4dcb@github.com> In-Reply-To: Derrick Stolee wrote: > On 8/16/2022 7:58 PM, Matthew John Cheetham via GitGitGadget wrote: > >> +#ifdef HAVE_FSMONITOR_DAEMON_BACKEND >> + /* >> + * Enable the built-in FSMonitor on supported platforms. >> + */ >> + { "core.fsmonitor", "true" }, >> +#endif >> + if (fsmonitor_ipc__is_supported() && start_fsmonitor_daemon()) >> + return error(_("could not start the FSMonitor daemon")); >> + > > I initially worried if fsmonitor_ipc__is_supported() could use some > run-time information to detect if FS Monitor is supported (say, existence > of a network share or something). However, that implementation is > currently defined as a constant depending on > HAVE_FSMONITOR_DAEMON_BACKEND. > > The reason I was worried is that we could enable core.fsmonitor=true based > on the compile-time macro, but then avoid starting the daemon based on the > run-time results. If we get into this state, would the user's 'git status' > calls start complaining about the core.fsmonitor=true config because it is > not supported? > > The most future-proof thing to do might be to move the config write out of > the set_recommended_config() and into start_fsmonitor_daemon(). Perhaps > rename it to enable_fsmonitor() so it can fail due to writing the config > _or_ for starting the daemon. The error message would change, then, too. I spent some time digging into this, and I think gating both the config and subsequent 'git fsmonitor--daemon start' on having platform *and* repository support is a good idea. I'll update the next version to both set the 'core.fsmonitor' config and start the daemon only if the built-in FSMonitor is fully supported. (warning: long-winded tangent mostly unrelated to FSMonitor) In the process of testing FSMonitor behavior, I think found other issues with Scalar registration. Specifically, the test I wrote attempted to 'scalar register' a bare repo, since bare directories are incompatible with FSMonitor. After seeing that FSMonitor was *not* incompatible with the repository, I found that Scalar was 1) ignoring the bare repository and, as a result, 2) identifying my Git clone (way above GIT_CEILING_DIRECTORIES) as the "enlistment root". I think 1) might be fine as-is - uniformly ignoring bare repos seems like a reasonable choice - but 2) seems like more of a problem. Right now, 'setup_enlistment_directory()' searches for the repo root beginning at directory '', which is either a user-provided path or current working directory. It checks whether '' or '/src' is a repo root: if so, it sets the enlistment info; otherwise, it repeats the process with the parent of '' until the repo root is found. For example, given the following directory structure: somedir └── enlistment ├── src │ └── .git └── test └── data 'scalar register somedir/enlistment/test/data' will search: * somedir/enlistment/test/data/src * somedir/enlistment/test/data * somedir/enlistment/test/src * somedir/enlistment/test * somedir/enlistment/src The current usage of GIT_CEILING_DIRECTORIES relies on the fact that, when invoking a normal 'git' command, 'setup_git_directory()' only searches upwards from the current working directory to find the repo root; it's a clear "yes" or "no" as to whether that search passes a ceiling directory. Scalar isn't as clear, since it searches for the repo root both "downwards" into '/src' *and* upwards through the parents of ''. It's not totally clear to me what the "right" behavior for Scalar is, but my current thought is to follow the same rules as 'setup_git_directory()', but for the *enlistment* root rather than the repository root. It's more restrictive than GIT_CEILING_DIRECTORIES on a normal git repo, e.g.: 1. 'GIT_CEILING_DIRECTORIES=somedir/enlistment git -C somedir/enlistment/src status' is valid. 2. 'GIT_CEILING_DIRECTORIES=somedir/enlistment scalar register somedir/enlistment/src' is not valid. but since Scalar works on the entire enlistment (not just the repo inside of it), I think it makes sense to prevent it from crossing a ceiling directory boundary. What do you think? Hopefully my rambling wasn't too confusing (if it is, please let me know what I can clarify). > > Or maybe I'm making a mountain out of a mole hill and what exists here is > perfectly fine. > >> +test_lazy_prereq BUILTIN_FSMONITOR ' >> + git version --build-options | grep -q "feature:.*fsmonitor--daemon" >> +' > > It looks like we already have a FSMONITOR_DAEMON prereq in test-lib.sh. > Should we use that instead? Works for me, happy to reuse code wherever possible. :) > > Thanks, > -Stolee