All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Jeff Hostetler via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: "Bagas Sanjaya" <bagasdotme@gmail.com>,
	"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
	"Jeff Hostetler" <git@jeffhostetler.com>,
	"Eric Sunshine" <sunshine@sunshineco.com>,
	"Johannes Schindelin" <Johannes.Schindelin@gmx.de>,
	"Tao Klerks" <tao@klerks.biz>,
	"Jeff Hostetler" <jeffhost@microsoft.com>
Subject: [PATCH v7 00/29] Builtin FSMonitor Part 2
Date: Tue, 22 Mar 2022 17:59:41 +0000	[thread overview]
Message-ID: <pull.1041.v7.git.1647972010.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1041.v6.git.1646160212.gitgitgadget@gmail.com>

Here is V7 of Part 2 of my builtin FSmonitor series. This version squashes
in the fixups from Part 2.5 and any other last minute suggestions. I'll send
an updated version of Part 3 that builds upon this version.

Here is a range-diff from V6 to V7 relative to 715d08a9e5 (The eighth batch,
2022-02-25). Changes since V6 can be summarized as: (1) Adding/removing
"_()" on die() and error() messages. (2) Splitting GCC-specific declarations
for MacOS FSEvents into a separate header file. (3) Enhancing the
"start_daemon()" function in t7527 to take keyword args and reduce some code
duplication in unit tests. (4) Fixing "&&" chains in the tests. (5) Other
minor style cleanups.

$ git range-diff eight..builtin-fsmonitor-part2-v6 eight..builtin-fsmonitor-part2
 1:  10a34082fc =  1:  e98373f997 fsmonitor: enhance existing comments, clarify trivial response handling
 2:  e1c946af2c !  2:  ab68b94417 fsmonitor-ipc: create client routines for git-fsmonitor--daemon
    @@ fsmonitor-ipc.c (new)
     +    state = ipc_client_try_connect(fsmonitor_ipc__get_path(), &options,
     +                       &connection);
     +    if (state != IPC_STATE__LISTENING) {
    -+        die("fsmonitor--daemon is not running");
    ++        die(_("fsmonitor--daemon is not running"));
     +        return -1;
     +    }
     +
    @@ fsmonitor-ipc.c (new)
     +    ipc_client_close_connection(connection);
     +
     +    if (ret == -1) {
    -+        die("could not send '%s' command to fsmonitor--daemon", c);
    ++        die(_("could not send '%s' command to fsmonitor--daemon"), c);
     +        return -1;
     +    }
     +
 3:  ae622a517c !  3:  e04c7301f2 fsmonitor: config settings are repository-specific
    @@ fsmonitor-settings.c (new)
     +        return;
     +
     +    CALLOC_ARRAY(s, 1);
    ++    s->mode = FSMONITOR_MODE_DISABLED;
     +
     +    r->settings.fsmonitor = s;
     +
    -+    fsm_settings__set_disabled(r);
    -+
     +    /*
     +     * Overload the existing "core.fsmonitor" config setting (which
     +     * has historically been either unset or a hook pathname) to
 4:  55974867da =  4:  ea02ba25d8 fsmonitor: use IPC to query the builtin FSMonitor daemon
 5:  ce42d5bbaf =  5:  6ab7db9cb7 fsmonitor: document builtin fsmonitor
 6:  9ce938c69b =  6:  0ce8ae3f2c fsmonitor--daemon: add a built-in fsmonitor daemon
 7:  3bd7e6a051 =  7:  4624ce2fa4 fsmonitor--daemon: implement 'stop' and 'status' commands
 8:  92d3e54da7 =  8:  a29fe7266a compat/fsmonitor/fsm-listen-win32: stub in backend for Windows
 9:  f121922127 =  9:  2f8a42fdb9 compat/fsmonitor/fsm-listen-darwin: stub in backend for Darwin
10:  a3f94627cf ! 10:  f07800690e fsmonitor--daemon: implement 'run' command
    @@ builtin/fsmonitor--daemon.c: static int do_as_client__status(void)
     +     * common error case.
     +     */
     +    if (fsmonitor_ipc__get_state() == IPC_STATE__LISTENING)
    -+        die("fsmonitor--daemon is already running '%s'",
    ++        die(_("fsmonitor--daemon is already running '%s'"),
     +            the_repository->worktree);
     +
     +    if (fsmonitor__announce_startup) {
11:  8de40b0fe8 ! 11:  a6a39a3306 fsmonitor--daemon: implement 'start' command
    @@ builtin/fsmonitor--daemon.c: static int try_to_run_foreground_daemon(void)
     +     * immediately exited).
     +     */
     +    if (fsmonitor_ipc__get_state() == IPC_STATE__LISTENING)
    -+        die("fsmonitor--daemon is already running '%s'",
    ++        die(_("fsmonitor--daemon is already running '%s'"),
     +            the_repository->worktree);
     +
     +    if (fsmonitor__announce_startup) {
    @@ builtin/fsmonitor--daemon.c: static int try_to_run_foreground_daemon(void)
     +    default:
     +    case SBGR_ERROR:
     +    case SBGR_CB_ERROR:
    -+        return error("daemon failed to start");
    ++        return error(_("daemon failed to start"));
     +
     +    case SBGR_TIMEOUT:
    -+        return error("daemon not online yet");
    ++        return error(_("daemon not online yet"));
     +
     +    case SBGR_DIED:
    -+        return error("daemon terminated");
    ++        return error(_("daemon terminated"));
     +    }
     +}
     +
12:  e5d419b1ea = 12:  d62e338d00 fsmonitor--daemon: add pathname classification
13:  c2f3668a86 = 13:  53e06b4ae5 fsmonitor--daemon: define token-ids
14:  bd492d13fb = 14:  39f43fabe0 fsmonitor--daemon: create token-based changed path cache
15:  6b5b3d0822 ! 15:  239558e34f compat/fsmonitor/fsm-listen-win32: implement FSMonitor backend on Windows
    @@ compat/fsmonitor/fsm-listen-win32.c
     +        if (len > 0)
     +            goto normalize;
     +        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
    -+            error("[GLE %ld] could not convert path to UTF-8: '%.*ls'",
    ++            error(_("[GLE %ld] could not convert path to UTF-8: '%.*ls'"),
     +                  GetLastError(),
     +                  (int)(info->FileNameLength / sizeof(WCHAR)),
     +                  info->FileName);
    @@ compat/fsmonitor/fsm-listen-win32.c
     +    if (watch->is_active)
     +        return 0;
     +
    -+    error("ReadDirectoryChangedW failed on '%s' [GLE %ld]",
    ++    error(_("ReadDirectoryChangedW failed on '%s' [GLE %ld]"),
     +          watch->path.buf, GetLastError());
     +    return -1;
     +}
    @@ compat/fsmonitor/fsm-listen-win32.c
     +     * sure it is worth it.
     +     */
     +
    -+    error("GetOverlappedResult failed on '%s' [GLE %ld]",
    ++    error(_("GetOverlappedResult failed on '%s' [GLE %ld]"),
     +          watch->path.buf, gle);
     +    return -1;
     +}
16:  cdef9730b3 ! 16:  14b775e9d8 compat/fsmonitor/fsm-listen-darwin: add MacOS header files for FSEvent
    @@ Commit message
         Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
         Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
    - ## compat/fsmonitor/fsm-listen-darwin.c ##
    + ## compat/fsmonitor/fsm-darwin-gcc.h (new) ##
     @@
    ++#ifndef FSM_DARWIN_GCC_H
    ++#define FSM_DARWIN_GCC_H
    ++
     +#ifndef __clang__
     +/*
     + * It is possible to #include CoreFoundation/CoreFoundation.h when compiling
    @@ compat/fsmonitor/fsm-listen-darwin.c
     +void FSEventStreamStop(FSEventStreamRef stream);
     +void FSEventStreamInvalidate(FSEventStreamRef stream);
     +void FSEventStreamRelease(FSEventStreamRef stream);
    ++
    ++#endif /* !clang */
    ++#endif /* FSM_DARWIN_GCC_H */
    +
    + ## compat/fsmonitor/fsm-listen-darwin.c ##
    +@@
    ++#ifndef __clang__
    ++#include "fsm-darwin-gcc.h"
     +#else
    -+/*
    -+ * Let Apple's headers declare `isalnum()` first, before
    -+ * Git's headers override it via a constant
    -+ */
    -+#include <string.h>
     +#include <CoreFoundation/CoreFoundation.h>
     +#include <CoreServices/CoreServices.h>
    ++
    ++#ifndef AVAILABLE_MAC_OS_X_VERSION_10_13_AND_LATER
    ++/*
    ++ * This enum value was added in 10.13 to:
    ++ *
    ++ * /Applications/Xcode.app/Contents/Developer/Platforms/ \
    ++ *    MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/ \
    ++ *    Library/Frameworks/CoreServices.framework/Frameworks/ \
    ++ *    FSEvents.framework/Versions/Current/Headers/FSEvents.h
    ++ *
    ++ * If we're compiling against an older SDK, this symbol won't be
    ++ * present.  Silently define it here so that we don't have to ifdef
    ++ * the logging or masking below.  This should be harmless since older
    ++ * versions of macOS won't ever emit this FS event anyway.
    ++ */
    ++#define kFSEventStreamEventFlagItemCloned         0x00400000
    ++#endif
     +#endif
     +
      #include "cache.h"
17:  aabfebd3a4 ! 17:  55bd7aee06 compat/fsmonitor/fsm-listen-darwin: implement FSEvent listener on MacOS
    @@ Commit message
         Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## compat/fsmonitor/fsm-listen-darwin.c ##
    -@@ compat/fsmonitor/fsm-listen-darwin.c: void FSEventStreamRelease(FSEventStreamRef stream);
    +@@
      #include "cache.h"
      #include "fsmonitor.h"
      #include "fsm-listen.h"
    @@ compat/fsmonitor/fsm-listen-darwin.c: void FSEventStreamRelease(FSEventStreamRef
     +    return 0;
     +
     +failed:
    -+    error("Unable to create FSEventStream.");
    ++    error(_("Unable to create FSEventStream."));
     +
     +    FREE_AND_NULL(state->backend_data);
          return -1;
    @@ compat/fsmonitor/fsm-listen-darwin.c: void FSEventStreamRelease(FSEventStreamRef
     +    data->stream_scheduled = 1;
     +
     +    if (!FSEventStreamStart(data->stream)) {
    -+        error("Failed to start the FSEventStream");
    ++        error(_("Failed to start the FSEventStream"));
     +        goto force_error_stop_without_loop;
     +    }
     +    data->stream_started = 1;
18:  0896e72e2b = 18:  1f4b5209bf fsmonitor--daemon: implement handle_client callback
19:  bc240a9e66 ! 19:  8cf62c9fc6 help: include fsmonitor--daemon feature flag in version info
    @@ t/test-lib.sh: test_lazy_prereq SHA1 '
     +# Does this platform support `git fsmonitor--daemon`
     +#
     +test_lazy_prereq FSMONITOR_DAEMON '
    -+    git version --build-options | grep "feature:" | grep "fsmonitor--daemon"
    ++    git version --build-options >output &&
    ++    grep "feature: fsmonitor--daemon" output
     +'
20:  2b563c240e ! 20:  1bd74a8159 t/helper/fsmonitor-client: create IPC client to talk to FSMonitor Daemon
    @@ t/helper/test-fsmonitor-client.c (new)
     +
     +    ret = fsmonitor_ipc__send_query(token, &answer);
     +    if (ret < 0)
    -+        die(_("could not query fsmonitor--daemon"));
    ++        die("could not query fsmonitor--daemon");
     +
     +    write_in_full(1, answer.buf, answer.len);
     +    strbuf_release(&answer);
    @@ t/helper/test-fsmonitor-client.c (new)
     +    const char *token = NULL;
     +
     +    const char * const fsmonitor_client_usage[] = {
    -+        N_("test-helper fsmonitor-client query [<token>]"),
    -+        N_("test-helper fsmonitor-client flush"),
    ++        "test-tool fsmonitor-client query [<token>]",
    ++        "test-tool fsmonitor-client flush",
     +        NULL,
     +    };
     +
     +    struct option options[] = {
    -+        OPT_STRING(0, "token", &token, N_("token"),
    -+               N_("command token to send to the server")),
    ++        OPT_STRING(0, "token", &token, "token",
    ++               "command token to send to the server"),
     +        OPT_END()
     +    };
     +
    -+    if (argc < 2)
    -+        usage_with_options(fsmonitor_client_usage, options);
    ++    argc = parse_options(argc, argv, NULL, options, fsmonitor_client_usage, 0);
     +
    -+    if (argc == 2 && !strcmp(argv[1], "-h"))
    ++    if (argc != 1)
     +        usage_with_options(fsmonitor_client_usage, options);
     +
    -+    subcmd = argv[1];
    -+    argv--;
    -+    argc++;
    -+
    -+    argc = parse_options(argc, argv, NULL, options, fsmonitor_client_usage, 0);
    ++    subcmd = argv[0];
     +
     +    setup_git_directory();
     +
21:  db8809da08 ! 21:  4a920d0b54 t7527: create test for fsmonitor--daemon
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +fi
     +
     +stop_daemon_delete_repo () {
    -+    r=$1
    -+    git -C $r fsmonitor--daemon stop >/dev/null 2>/dev/null
    ++    r=$1 &&
    ++    test_might_fail git -C $r fsmonitor--daemon stop &&
     +    rm -rf $1
    -+    return 0
     +}
     +
     +start_daemon () {
    -+    case "$#" in
    -+        1) r="-C $1";;
    -+        *) r="";
    -+    esac
    ++    r= &&
    ++    tf= &&
    ++    t2= &&
    ++    tk= &&
    ++
    ++    while test "$#" -ne 0
    ++    do
    ++        case "$1" in
    ++        -C)
    ++            shift;
    ++            test "$#" -ne 0 || BUG "error: -C requires arg"
    ++            r="-C $1"
    ++            shift
    ++            ;;
    ++        -tf)
    ++            shift;
    ++            test "$#" -ne 0 || BUG "error: -tf requires arg"
    ++            tf="$1"
    ++            shift
    ++            ;;
    ++        -t2)
    ++            shift;
    ++            test "$#" -ne 0 || BUG "error: -t2 requires arg"
    ++            t2="$1"
    ++            shift
    ++            ;;
    ++        -tk)
    ++            shift;
    ++            test "$#" -ne 0 || BUG "error: -tk requires arg"
    ++            tk="$1"
    ++            shift
    ++            ;;
    ++        *)
    ++            BUG "error: unknown option: '$1'"
    ++            ;;
    ++        esac
    ++    done &&
     +
    -+    git $r fsmonitor--daemon start || return $?
    -+    git $r fsmonitor--daemon status || return $?
    -+
    -+    return 0
    ++    (
    ++        if test -n "$tf"
    ++        then
    ++            GIT_TRACE_FSMONITOR="$tf"
    ++            export GIT_TRACE_FSMONITOR
    ++        fi &&
    ++
    ++        if test -n "$t2"
    ++        then
    ++            GIT_TRACE2_PERF="$t2"
    ++            export GIT_TRACE2_PERF
    ++        fi &&
    ++
    ++        if test -n "$tk"
    ++        then
    ++            GIT_TEST_FSMONITOR_TOKEN="$tk"
    ++            export GIT_TEST_FSMONITOR_TOKEN
    ++        fi &&
    ++
    ++        git $r fsmonitor--daemon start &&
    ++        git $r fsmonitor--daemon status
    ++    )
     +}
     +
     +# Is a Trace2 data event present with the given catetory and key?
     +# We do not care what the value is.
     +#
     +have_t2_data_event () {
    -+    c=$1
    -+    k=$2
    ++    c=$1 &&
    ++    k=$2 &&
     +
     +    grep -e '"event":"data".*"category":"'"$c"'".*"key":"'"$k"'"'
     +}
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +    test_when_finished "stop_daemon_delete_repo test_explicit" &&
     +
     +    git init test_explicit &&
    -+    start_daemon test_explicit &&
    ++    start_daemon -C test_explicit &&
     +
     +    git -C test_explicit fsmonitor--daemon stop &&
     +    test_must_fail git -C test_explicit fsmonitor--daemon status
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +    # but this test case is only concerned with whether the daemon was
     +    # implicitly started.)
     +
    -+    GIT_TRACE2_EVENT="$(pwd)/.git/trace" \
    ++    GIT_TRACE2_EVENT="$PWD/.git/trace" \
     +        test-tool -C test_implicit fsmonitor-client query --token 0 >actual &&
     +    nul_to_q <actual >actual.filtered &&
     +    grep "builtin:" actual.filtered &&
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +
     +    git init test_implicit_1 &&
     +
    -+    start_daemon test_implicit_1 &&
    ++    start_daemon -C test_implicit_1 &&
     +
     +    # deleting the .git directory will implicitly stop the daemon.
     +    rm -rf test_implicit_1/.git &&
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +
     +    git init test_implicit_2 &&
     +
    -+    start_daemon test_implicit_2 &&
    ++    start_daemon -C test_implicit_2 &&
     +
     +    # renaming the .git directory will implicitly stop the daemon.
     +    mv test_implicit_2/.git test_implicit_2/.xxx &&
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +
     +    git init test_multiple &&
     +
    -+    start_daemon test_multiple &&
    ++    start_daemon -C test_multiple &&
     +
     +    test_must_fail git -C test_multiple fsmonitor--daemon start 2>actual &&
     +    grep "fsmonitor--daemon is already running" actual &&
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +# This is here in case something else fails first.
     +#
     +redundant_stop_daemon () {
    -+    git fsmonitor--daemon stop
    -+    return 0
    ++    test_might_fail git fsmonitor--daemon stop
     +}
     +
     +test_expect_success 'update-index implicitly starts daemon' '
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +
     +    test_must_fail git fsmonitor--daemon status &&
     +
    -+    GIT_TRACE2_EVENT="$(pwd)/.git/trace_implicit_1" \
    ++    GIT_TRACE2_EVENT="$PWD/.git/trace_implicit_1" \
     +        git update-index --fsmonitor &&
     +
     +    git fsmonitor--daemon status &&
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +
     +    test_must_fail git fsmonitor--daemon status &&
     +
    -+    GIT_TRACE2_EVENT="$(pwd)/.git/trace_implicit_2" \
    ++    GIT_TRACE2_EVENT="$PWD/.git/trace_implicit_2" \
     +        git status >actual &&
     +
     +    git fsmonitor--daemon status &&
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +'
     +
     +edit_files () {
    -+    echo 1 >modified
    -+    echo 2 >dir1/modified
    -+    echo 3 >dir2/modified
    ++    echo 1 >modified &&
    ++    echo 2 >dir1/modified &&
    ++    echo 3 >dir2/modified &&
     +    >dir1/untracked
     +}
     +
     +delete_files () {
    -+    rm -f delete
    -+    rm -f dir1/delete
    ++    rm -f delete &&
    ++    rm -f dir1/delete &&
     +    rm -f dir2/delete
     +}
     +
     +create_files () {
    -+    echo 1 >new
    -+    echo 2 >dir1/new
    ++    echo 1 >new &&
    ++    echo 2 >dir1/new &&
     +    echo 3 >dir2/new
     +}
     +
     +rename_files () {
    -+    mv rename renamed
    -+    mv dir1/rename dir1/renamed
    ++    mv rename renamed &&
    ++    mv dir1/rename dir1/renamed &&
     +    mv dir2/rename dir2/renamed
     +}
     +
     +file_to_directory () {
    -+    rm -f delete
    -+    mkdir delete
    ++    rm -f delete &&
    ++    mkdir delete &&
     +    echo 1 >delete/new
     +}
     +
     +directory_to_file () {
    -+    rm -rf dir1
    ++    rm -rf dir1 &&
     +    echo 1 >dir1
     +}
     +
    -+verify_status () {
    -+    git status >actual &&
    -+    GIT_INDEX_FILE=.git/fresh-index git read-tree master &&
    -+    GIT_INDEX_FILE=.git/fresh-index git -c core.fsmonitor=false status >expect &&
    -+    test_cmp expect actual &&
    -+    echo HELLO AFTER &&
    -+    cat .git/trace &&
    -+    echo HELLO AFTER
    -+}
    -+
     +# The next few test cases confirm that our fsmonitor daemon sees each type
     +# of OS filesystem notification that we care about.  At this layer we just
     +# ensure we are getting the OS notifications and do not try to confirm what
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +# daemon) because these commands might implicitly restart the daemon.
     +
     +clean_up_repo_and_stop_daemon () {
    -+    git reset --hard HEAD
    -+    git clean -fd
    -+    git fsmonitor--daemon stop
    ++    git reset --hard HEAD &&
    ++    git clean -fd &&
    ++    test_might_fail git fsmonitor--daemon stop &&
     +    rm -f .git/trace
     +}
     +
     +test_expect_success 'edit some files' '
     +    test_when_finished clean_up_repo_and_stop_daemon &&
     +
    -+    (
    -+        GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
    -+        export GIT_TRACE_FSMONITOR &&
    -+
    -+        start_daemon
    -+    ) &&
    ++    start_daemon -tf "$PWD/.git/trace" &&
     +
     +    edit_files &&
     +
    -+    test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
    ++    test-tool fsmonitor-client query --token 0 &&
     +
     +    grep "^event: dir1/modified$"  .git/trace &&
     +    grep "^event: dir2/modified$"  .git/trace &&
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +test_expect_success 'create some files' '
     +    test_when_finished clean_up_repo_and_stop_daemon &&
     +
    -+    (
    -+        GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
    -+        export GIT_TRACE_FSMONITOR &&
    -+
    -+        start_daemon
    -+    ) &&
    ++    start_daemon -tf "$PWD/.git/trace" &&
     +
     +    create_files &&
     +
    -+    test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
    ++    test-tool fsmonitor-client query --token 0 &&
     +
     +    grep "^event: dir1/new$" .git/trace &&
     +    grep "^event: dir2/new$" .git/trace &&
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +test_expect_success 'delete some files' '
     +    test_when_finished clean_up_repo_and_stop_daemon &&
     +
    -+    (
    -+        GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
    -+        export GIT_TRACE_FSMONITOR &&
    -+
    -+        start_daemon
    -+    ) &&
    ++    start_daemon -tf "$PWD/.git/trace" &&
     +
     +    delete_files &&
     +
    -+    test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
    ++    test-tool fsmonitor-client query --token 0 &&
     +
     +    grep "^event: dir1/delete$" .git/trace &&
     +    grep "^event: dir2/delete$" .git/trace &&
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +test_expect_success 'rename some files' '
     +    test_when_finished clean_up_repo_and_stop_daemon &&
     +
    -+    (
    -+        GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
    -+        export GIT_TRACE_FSMONITOR &&
    -+
    -+        start_daemon
    -+    ) &&
    ++    start_daemon -tf "$PWD/.git/trace" &&
     +
     +    rename_files &&
     +
    -+    test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
    ++    test-tool fsmonitor-client query --token 0 &&
     +
     +    grep "^event: dir1/rename$"  .git/trace &&
     +    grep "^event: dir2/rename$"  .git/trace &&
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +test_expect_success 'rename directory' '
     +    test_when_finished clean_up_repo_and_stop_daemon &&
     +
    -+    (
    -+        GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
    -+        export GIT_TRACE_FSMONITOR &&
    -+
    -+        start_daemon
    -+    ) &&
    ++    start_daemon -tf "$PWD/.git/trace" &&
     +
     +    mv dirtorename dirrenamed &&
     +
    -+    test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
    ++    test-tool fsmonitor-client query --token 0 &&
     +
     +    grep "^event: dirtorename/*$" .git/trace &&
     +    grep "^event: dirrenamed/*$"  .git/trace
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +test_expect_success 'file changes to directory' '
     +    test_when_finished clean_up_repo_and_stop_daemon &&
     +
    -+    (
    -+        GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
    -+        export GIT_TRACE_FSMONITOR &&
    -+
    -+        start_daemon
    -+    ) &&
    ++    start_daemon -tf "$PWD/.git/trace" &&
     +
     +    file_to_directory &&
     +
    -+    test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
    ++    test-tool fsmonitor-client query --token 0 &&
     +
     +    grep "^event: delete$"     .git/trace &&
     +    grep "^event: delete/new$" .git/trace
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +test_expect_success 'directory changes to a file' '
     +    test_when_finished clean_up_repo_and_stop_daemon &&
     +
    -+    (
    -+        GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
    -+        export GIT_TRACE_FSMONITOR &&
    -+
    -+        start_daemon
    -+    ) &&
    ++    start_daemon -tf "$PWD/.git/trace" &&
     +
     +    directory_to_file &&
     +
    -+    test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
    ++    test-tool fsmonitor-client query --token 0 &&
     +
     +    grep "^event: dir1$" .git/trace
     +'
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +
     +    git init test_flush &&
     +
    -+    (
    -+        GIT_TEST_FSMONITOR_TOKEN=true &&
    -+        export GIT_TEST_FSMONITOR_TOKEN &&
    -+
    -+        GIT_TRACE_FSMONITOR="$(pwd)/.git/trace_daemon" &&
    -+        export GIT_TRACE_FSMONITOR &&
    -+
    -+        start_daemon test_flush
    -+    ) &&
    ++    start_daemon -C test_flush -tf "$PWD/.git/trace_daemon" -tk true &&
     +
     +    # The daemon should have an initial token with no events in _0 and
     +    # then a few (probably platform-specific number of) events in _1.
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +    test-tool -C test_flush fsmonitor-client query --token "builtin:test_00000001:0" >actual_0 &&
     +    nul_to_q <actual_0 >actual_q0 &&
     +
    -+    touch test_flush/file_1 &&
    -+    touch test_flush/file_2 &&
    ++    >test_flush/file_1 &&
    ++    >test_flush/file_2 &&
     +
     +    test-tool -C test_flush fsmonitor-client query --token "builtin:test_00000001:0" >actual_1 &&
     +    nul_to_q <actual_1 >actual_q1 &&
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +
     +    grep "^builtin:test_00000002:0Q$" actual_q2 &&
     +
    -+    touch test_flush/file_3 &&
    ++    >test_flush/file_3 &&
     +
     +    test-tool -C test_flush fsmonitor-client query --token "builtin:test_00000002:0" >actual_3 &&
     +    nul_to_q <actual_3 >actual_q3 &&
    @@ t/t7527-builtin-fsmonitor.sh (new)
     +test_expect_success 'worktree with .git file' '
     +    git -C wt-base worktree add ../wt-secondary &&
     +
    -+    (
    -+        GIT_TRACE2_PERF="$(pwd)/trace2_wt_secondary" &&
    -+        export GIT_TRACE2_PERF &&
    -+
    -+        GIT_TRACE_FSMONITOR="$(pwd)/trace_wt_secondary" &&
    -+        export GIT_TRACE_FSMONITOR &&
    -+
    -+        start_daemon wt-secondary
    -+    ) &&
    ++    start_daemon -C wt-secondary \
    ++        -tf "$PWD/trace_wt_secondary" \
    ++        -t2 "$PWD/trace2_wt_secondary" &&
     +
     +    git -C wt-secondary fsmonitor--daemon stop &&
     +    test_must_fail git -C wt-secondary fsmonitor--daemon status
22:  15bd5aaff3 = 22:  c925a9a745 t/perf: avoid copying builtin fsmonitor files into test repo
23:  4cb97918d2 = 23:  5b3381c223 t/helper/test-chmtime: skip directories on Windows
24:  a70748b464 ! 24:  803a540cc0 t/perf/p7519: speed up test on Windows
    @@ t/perf/p7519-fsmonitor.sh: test_fsmonitor_suite() {
                  head -100000 | \
                  grep -v \" | \
     -            sed '\''s/\(.\)/\\\1/g'\'' | \
    -+            egrep -v " ." | \
    ++            grep -v " ." | \
                  xargs test-tool chmtime -300 &&
              git status
          '
25:  b0c9c9c7a4 ! 25:  d5ca2df31c t/perf/p7519: add fsmonitor--daemon test cases
    @@ Commit message
         Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## t/perf/p7519-fsmonitor.sh ##
    +@@ t/perf/p7519-fsmonitor.sh: test_expect_success "one time repo setup" '
    +     fi
    + '
    + 
    +-setup_for_fsmonitor () {
    ++setup_for_fsmonitor_hook () {
    +     # set INTEGRATION_SCRIPT depending on the environment
    +     if test -n "$INTEGRATION_PATH"
    +     then
     @@ t/perf/p7519-fsmonitor.sh: test_perf_w_drop_caches () {
      }
      
    @@ t/perf/p7519-fsmonitor.sh: test_perf_w_drop_caches () {
     +    if test -n "$USE_FSMONITOR_DAEMON"
     +    then
     +        DESC="builtin fsmonitor--daemon"
    -+    elif test -n "$INTEGRATION_SCRIPT"; then
    ++    elif test -n "$INTEGRATION_SCRIPT"
    ++    then
              DESC="fsmonitor=$(basename $INTEGRATION_SCRIPT)"
          else
              DESC="fsmonitor=disabled"
    +@@ t/perf/p7519-fsmonitor.sh: test_fsmonitor_suite () {
    + trace_start fsmonitor-watchman
    + if test -n "$GIT_PERF_7519_FSMONITOR"; then
    +     for INTEGRATION_PATH in $GIT_PERF_7519_FSMONITOR; do
    +-        test_expect_success "setup for fsmonitor $INTEGRATION_PATH" 'setup_for_fsmonitor'
    ++        test_expect_success "setup for fsmonitor $INTEGRATION_PATH" 'setup_for_fsmonitor_hook'
    +         test_fsmonitor_suite
    +     done
    + else
    +-    test_expect_success "setup for fsmonitor" 'setup_for_fsmonitor'
    ++    test_expect_success "setup for fsmonitor hook" 'setup_for_fsmonitor_hook'
    +     test_fsmonitor_suite
    + fi
    + 
     @@ t/perf/p7519-fsmonitor.sh: test_expect_success "setup without fsmonitor" '
      test_fsmonitor_suite
      trace_stop
    @@ t/perf/p7519-fsmonitor.sh: test_expect_success "setup without fsmonitor" '
     +then
     +    USE_FSMONITOR_DAEMON=t
     +
    -+    trace_start fsmonitor--daemon--server
    -+    git fsmonitor--daemon start
    ++    test_expect_success "setup for builtin fsmonitor" '
    ++        trace_start fsmonitor--daemon--server &&
    ++        git fsmonitor--daemon start &&
     +
    -+    trace_start fsmonitor--daemon--client
    ++        trace_start fsmonitor--daemon--client &&
     +
    -+    git config core.fsmonitor true
    -+    git update-index --fsmonitor
    ++        git config core.fsmonitor true &&
    ++        git update-index --fsmonitor
    ++    '
     +
     +    test_fsmonitor_suite
     +
26:  64a5b74167 = 26:  42631259e8 fsmonitor--daemon: periodically truncate list of modified files
27:  5b06eb5d0e ! 27:  f256c3cbe8 fsmonitor--daemon: use a cookie file to sync with file system
    @@ builtin/fsmonitor--daemon.c: static int do_as_client__status(void)
      
     +enum fsmonitor_cookie_item_result {
     +    FCIR_ERROR = -1, /* could not create cookie file ? */
    -+    FCIR_INIT = 0,
    ++    FCIR_INIT,
     +    FCIR_SEEN,
     +    FCIR_ABORT,
     +};
     +
     +struct fsmonitor_cookie_item {
     +    struct hashmap_entry entry;
    -+    const char *name;
    ++    char *name;
     +    enum fsmonitor_cookie_item_result result;
     +};
     +
    @@ builtin/fsmonitor--daemon.c: static int do_as_client__status(void)
     +     * that the listener thread has seen it.
     +     */
     +    fd = open(cookie_pathname.buf, O_WRONLY | O_CREAT | O_EXCL, 0600);
    -+    if (fd >= 0) {
    -+        close(fd);
    -+        unlink(cookie_pathname.buf);
    -+
    -+        /*
    -+         * Technically, this is an infinite wait (well, unless another
    -+         * thread sends us an abort).  I'd like to change this to
    -+         * use `pthread_cond_timedwait()` and return an error/timeout
    -+         * and let the caller do the trivial response thing, but we
    -+         * don't have that routine in our thread-utils.
    -+         *
    -+         * After extensive beta testing I'm not really worried about
    -+         * this.  Also note that the above open() and unlink() calls
    -+         * will cause at least two FS events on that path, so the odds
    -+         * of getting stuck are pretty slim.
    -+         */
    -+        while (cookie->result == FCIR_INIT)
    -+            pthread_cond_wait(&state->cookies_cond,
    -+                      &state->main_lock);
    -+    } else {
    ++    if (fd < 0) {
     +        error_errno(_("could not create fsmonitor cookie '%s'"),
     +                cookie->name);
     +
     +        cookie->result = FCIR_ERROR;
    ++        goto done;
     +    }
     +
    ++    /*
    ++     * Technically, close() and unlink() can fail, but we don't
    ++     * care here.  We only created the file to trigger a watch
    ++     * event from the FS to know that when we're up to date.
    ++     */
    ++    close(fd);
    ++    unlink(cookie_pathname.buf);
    ++
    ++    /*
    ++     * Technically, this is an infinite wait (well, unless another
    ++     * thread sends us an abort).  I'd like to change this to
    ++     * use `pthread_cond_timedwait()` and return an error/timeout
    ++     * and let the caller do the trivial response thing, but we
    ++     * don't have that routine in our thread-utils.
    ++     *
    ++     * After extensive beta testing I'm not really worried about
    ++     * this.  Also note that the above open() and unlink() calls
    ++     * will cause at least two FS events on that path, so the odds
    ++     * of getting stuck are pretty slim.
    ++     */
    ++    while (cookie->result == FCIR_INIT)
    ++        pthread_cond_wait(&state->cookies_cond,
    ++                  &state->main_lock);
    ++
    ++done:
     +    hashmap_remove(&state->cookies, &cookie->entry, NULL);
     +
     +    result = cookie->result;
     +
    -+    free((char*)cookie->name);
    ++    free(cookie->name);
     +    free(cookie);
     +    strbuf_release(&cookie_pathname);
     +
28:  1fd5439de0 = 28:  08af8296f9 fsmonitor: force update index after large responses
29:  6fc1430285 ! 29:  e6cf84dc8e t7527: test status with untracked-cache and fsmonitor--daemon
    @@ t/t7527-builtin-fsmonitor.sh: test_expect_success 'cleanup worktrees' '
     +}
     +
     +matrix_try () {
    -+    uc=$1
    -+    fsm=$2
    -+    fn=$3
    ++    uc=$1 &&
    ++    fsm=$2 &&
    ++    fn=$3 &&
     +
     +    test_expect_success "Matrix[uc:$uc][fsm:$fsm] $fn" '
     +        matrix_clean_up_repo &&
30:  b915b95cc2 <  -:  ---------- update-index: convert fsmonitor warnings to advise


Jeff Hostetler (29):
  fsmonitor: enhance existing comments, clarify trivial response
    handling
  fsmonitor-ipc: create client routines for git-fsmonitor--daemon
  fsmonitor: config settings are repository-specific
  fsmonitor: use IPC to query the builtin FSMonitor daemon
  fsmonitor: document builtin fsmonitor
  fsmonitor--daemon: add a built-in fsmonitor daemon
  fsmonitor--daemon: implement 'stop' and 'status' commands
  compat/fsmonitor/fsm-listen-win32: stub in backend for Windows
  compat/fsmonitor/fsm-listen-darwin: stub in backend for Darwin
  fsmonitor--daemon: implement 'run' command
  fsmonitor--daemon: implement 'start' command
  fsmonitor--daemon: add pathname classification
  fsmonitor--daemon: define token-ids
  fsmonitor--daemon: create token-based changed path cache
  compat/fsmonitor/fsm-listen-win32: implement FSMonitor backend on
    Windows
  compat/fsmonitor/fsm-listen-darwin: add MacOS header files for FSEvent
  compat/fsmonitor/fsm-listen-darwin: implement FSEvent listener on
    MacOS
  fsmonitor--daemon: implement handle_client callback
  help: include fsmonitor--daemon feature flag in version info
  t/helper/fsmonitor-client: create IPC client to talk to FSMonitor
    Daemon
  t7527: create test for fsmonitor--daemon
  t/perf: avoid copying builtin fsmonitor files into test repo
  t/helper/test-chmtime: skip directories on Windows
  t/perf/p7519: speed up test on Windows
  t/perf/p7519: add fsmonitor--daemon test cases
  fsmonitor--daemon: periodically truncate list of modified files
  fsmonitor--daemon: use a cookie file to sync with file system
  fsmonitor: force update index after large responses
  t7527: test status with untracked-cache and fsmonitor--daemon

 .gitignore                              |    1 +
 Documentation/config/core.txt           |   60 +-
 Documentation/git-fsmonitor--daemon.txt |   75 ++
 Documentation/git-update-index.txt      |    8 +-
 Makefile                                |   17 +
 builtin.h                               |    1 +
 builtin/fsmonitor--daemon.c             | 1480 +++++++++++++++++++++++
 builtin/update-index.c                  |    7 +-
 cache.h                                 |    1 -
 compat/fsmonitor/fsm-darwin-gcc.h       |   92 ++
 compat/fsmonitor/fsm-listen-darwin.c    |  427 +++++++
 compat/fsmonitor/fsm-listen-win32.c     |  586 +++++++++
 compat/fsmonitor/fsm-listen.h           |   49 +
 config.c                                |   14 -
 config.h                                |    1 -
 config.mak.uname                        |   20 +
 contrib/buildsystems/CMakeLists.txt     |   10 +
 environment.c                           |    1 -
 fsmonitor--daemon.h                     |  166 +++
 fsmonitor-ipc.c                         |  171 +++
 fsmonitor-ipc.h                         |   48 +
 fsmonitor-settings.c                    |  114 ++
 fsmonitor-settings.h                    |   21 +
 fsmonitor.c                             |  216 +++-
 fsmonitor.h                             |   15 +-
 git.c                                   |    1 +
 help.c                                  |    4 +
 repo-settings.c                         |    1 +
 repository.h                            |    3 +
 t/README                                |    4 +-
 t/helper/test-chmtime.c                 |   15 +
 t/helper/test-fsmonitor-client.c        |  116 ++
 t/helper/test-tool.c                    |    1 +
 t/helper/test-tool.h                    |    1 +
 t/perf/p7519-fsmonitor.sh               |   68 +-
 t/perf/perf-lib.sh                      |    2 +-
 t/t7527-builtin-fsmonitor.sh            |  594 +++++++++
 t/test-lib.sh                           |    7 +
 38 files changed, 4312 insertions(+), 106 deletions(-)
 create mode 100644 Documentation/git-fsmonitor--daemon.txt
 create mode 100644 builtin/fsmonitor--daemon.c
 create mode 100644 compat/fsmonitor/fsm-darwin-gcc.h
 create mode 100644 compat/fsmonitor/fsm-listen-darwin.c
 create mode 100644 compat/fsmonitor/fsm-listen-win32.c
 create mode 100644 compat/fsmonitor/fsm-listen.h
 create mode 100644 fsmonitor--daemon.h
 create mode 100644 fsmonitor-ipc.c
 create mode 100644 fsmonitor-ipc.h
 create mode 100644 fsmonitor-settings.c
 create mode 100644 fsmonitor-settings.h
 create mode 100644 t/helper/test-fsmonitor-client.c
 create mode 100755 t/t7527-builtin-fsmonitor.sh


base-commit: 715d08a9e51251ad8290b181b6ac3b9e1f9719d7
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1041%2Fjeffhostetler%2Fbuiltin-fsmonitor-part2-v7
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1041/jeffhostetler/builtin-fsmonitor-part2-v7
Pull-Request: https://github.com/gitgitgadget/git/pull/1041

Range-diff vs v6:

  1:  10a34082fcc =  1:  e98373f997f fsmonitor: enhance existing comments, clarify trivial response handling
  2:  e1c946af2c5 !  2:  ab68b944173 fsmonitor-ipc: create client routines for git-fsmonitor--daemon
     @@ fsmonitor-ipc.c (new)
      +	state = ipc_client_try_connect(fsmonitor_ipc__get_path(), &options,
      +				       &connection);
      +	if (state != IPC_STATE__LISTENING) {
     -+		die("fsmonitor--daemon is not running");
     ++		die(_("fsmonitor--daemon is not running"));
      +		return -1;
      +	}
      +
     @@ fsmonitor-ipc.c (new)
      +	ipc_client_close_connection(connection);
      +
      +	if (ret == -1) {
     -+		die("could not send '%s' command to fsmonitor--daemon", c);
     ++		die(_("could not send '%s' command to fsmonitor--daemon"), c);
      +		return -1;
      +	}
      +
  3:  ae622a517cf !  3:  e04c7301f24 fsmonitor: config settings are repository-specific
     @@ fsmonitor-settings.c (new)
      +		return;
      +
      +	CALLOC_ARRAY(s, 1);
     ++	s->mode = FSMONITOR_MODE_DISABLED;
      +
      +	r->settings.fsmonitor = s;
      +
     -+	fsm_settings__set_disabled(r);
     -+
      +	/*
      +	 * Overload the existing "core.fsmonitor" config setting (which
      +	 * has historically been either unset or a hook pathname) to
  4:  55974867da5 =  4:  ea02ba25d8f fsmonitor: use IPC to query the builtin FSMonitor daemon
  5:  ce42d5bbaf6 =  5:  6ab7db9cb76 fsmonitor: document builtin fsmonitor
  6:  9ce938c69b5 =  6:  0ce8ae3f2cf fsmonitor--daemon: add a built-in fsmonitor daemon
  7:  3bd7e6a051e =  7:  4624ce2fa47 fsmonitor--daemon: implement 'stop' and 'status' commands
  8:  92d3e54da7f =  8:  a29fe7266a4 compat/fsmonitor/fsm-listen-win32: stub in backend for Windows
  9:  f1219221270 =  9:  2f8a42fdb93 compat/fsmonitor/fsm-listen-darwin: stub in backend for Darwin
 10:  a3f94627cf6 ! 10:  f07800690ee fsmonitor--daemon: implement 'run' command
     @@ builtin/fsmonitor--daemon.c: static int do_as_client__status(void)
      +	 * common error case.
      +	 */
      +	if (fsmonitor_ipc__get_state() == IPC_STATE__LISTENING)
     -+		die("fsmonitor--daemon is already running '%s'",
     ++		die(_("fsmonitor--daemon is already running '%s'"),
      +		    the_repository->worktree);
      +
      +	if (fsmonitor__announce_startup) {
 11:  8de40b0fe8b ! 11:  a6a39a3306d fsmonitor--daemon: implement 'start' command
     @@ builtin/fsmonitor--daemon.c: static int try_to_run_foreground_daemon(void)
      +	 * immediately exited).
      +	 */
      +	if (fsmonitor_ipc__get_state() == IPC_STATE__LISTENING)
     -+		die("fsmonitor--daemon is already running '%s'",
     ++		die(_("fsmonitor--daemon is already running '%s'"),
      +		    the_repository->worktree);
      +
      +	if (fsmonitor__announce_startup) {
     @@ builtin/fsmonitor--daemon.c: static int try_to_run_foreground_daemon(void)
      +	default:
      +	case SBGR_ERROR:
      +	case SBGR_CB_ERROR:
     -+		return error("daemon failed to start");
     ++		return error(_("daemon failed to start"));
      +
      +	case SBGR_TIMEOUT:
     -+		return error("daemon not online yet");
     ++		return error(_("daemon not online yet"));
      +
      +	case SBGR_DIED:
     -+		return error("daemon terminated");
     ++		return error(_("daemon terminated"));
      +	}
      +}
      +
 12:  e5d419b1ea0 = 12:  d62e338d008 fsmonitor--daemon: add pathname classification
 13:  c2f3668a866 = 13:  53e06b4ae5d fsmonitor--daemon: define token-ids
 14:  bd492d13fb1 = 14:  39f43fabe02 fsmonitor--daemon: create token-based changed path cache
 15:  6b5b3d08227 ! 15:  239558e34ff compat/fsmonitor/fsm-listen-win32: implement FSMonitor backend on Windows
     @@ compat/fsmonitor/fsm-listen-win32.c
      +		if (len > 0)
      +			goto normalize;
      +		if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
     -+			error("[GLE %ld] could not convert path to UTF-8: '%.*ls'",
     ++			error(_("[GLE %ld] could not convert path to UTF-8: '%.*ls'"),
      +			      GetLastError(),
      +			      (int)(info->FileNameLength / sizeof(WCHAR)),
      +			      info->FileName);
     @@ compat/fsmonitor/fsm-listen-win32.c
      +	if (watch->is_active)
      +		return 0;
      +
     -+	error("ReadDirectoryChangedW failed on '%s' [GLE %ld]",
     ++	error(_("ReadDirectoryChangedW failed on '%s' [GLE %ld]"),
      +	      watch->path.buf, GetLastError());
      +	return -1;
      +}
     @@ compat/fsmonitor/fsm-listen-win32.c
      +	 * sure it is worth it.
      +	 */
      +
     -+	error("GetOverlappedResult failed on '%s' [GLE %ld]",
     ++	error(_("GetOverlappedResult failed on '%s' [GLE %ld]"),
      +	      watch->path.buf, gle);
      +	return -1;
      +}
 16:  cdef9730b3f ! 16:  14b775e9d8b compat/fsmonitor/fsm-listen-darwin: add MacOS header files for FSEvent
     @@ Commit message
          Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
          Signed-off-by: Junio C Hamano <gitster@pobox.com>
      
     - ## compat/fsmonitor/fsm-listen-darwin.c ##
     + ## compat/fsmonitor/fsm-darwin-gcc.h (new) ##
      @@
     ++#ifndef FSM_DARWIN_GCC_H
     ++#define FSM_DARWIN_GCC_H
     ++
      +#ifndef __clang__
      +/*
      + * It is possible to #include CoreFoundation/CoreFoundation.h when compiling
     @@ compat/fsmonitor/fsm-listen-darwin.c
      +void FSEventStreamStop(FSEventStreamRef stream);
      +void FSEventStreamInvalidate(FSEventStreamRef stream);
      +void FSEventStreamRelease(FSEventStreamRef stream);
     ++
     ++#endif /* !clang */
     ++#endif /* FSM_DARWIN_GCC_H */
     +
     + ## compat/fsmonitor/fsm-listen-darwin.c ##
     +@@
     ++#ifndef __clang__
     ++#include "fsm-darwin-gcc.h"
      +#else
     -+/*
     -+ * Let Apple's headers declare `isalnum()` first, before
     -+ * Git's headers override it via a constant
     -+ */
     -+#include <string.h>
      +#include <CoreFoundation/CoreFoundation.h>
      +#include <CoreServices/CoreServices.h>
     ++
     ++#ifndef AVAILABLE_MAC_OS_X_VERSION_10_13_AND_LATER
     ++/*
     ++ * This enum value was added in 10.13 to:
     ++ *
     ++ * /Applications/Xcode.app/Contents/Developer/Platforms/ \
     ++ *    MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/ \
     ++ *    Library/Frameworks/CoreServices.framework/Frameworks/ \
     ++ *    FSEvents.framework/Versions/Current/Headers/FSEvents.h
     ++ *
     ++ * If we're compiling against an older SDK, this symbol won't be
     ++ * present.  Silently define it here so that we don't have to ifdef
     ++ * the logging or masking below.  This should be harmless since older
     ++ * versions of macOS won't ever emit this FS event anyway.
     ++ */
     ++#define kFSEventStreamEventFlagItemCloned         0x00400000
     ++#endif
      +#endif
      +
       #include "cache.h"
 17:  aabfebd3a41 ! 17:  55bd7aee06c compat/fsmonitor/fsm-listen-darwin: implement FSEvent listener on MacOS
     @@ Commit message
          Signed-off-by: Junio C Hamano <gitster@pobox.com>
      
       ## compat/fsmonitor/fsm-listen-darwin.c ##
     -@@ compat/fsmonitor/fsm-listen-darwin.c: void FSEventStreamRelease(FSEventStreamRef stream);
     +@@
       #include "cache.h"
       #include "fsmonitor.h"
       #include "fsm-listen.h"
     @@ compat/fsmonitor/fsm-listen-darwin.c: void FSEventStreamRelease(FSEventStreamRef
      +	return 0;
      +
      +failed:
     -+	error("Unable to create FSEventStream.");
     ++	error(_("Unable to create FSEventStream."));
      +
      +	FREE_AND_NULL(state->backend_data);
       	return -1;
     @@ compat/fsmonitor/fsm-listen-darwin.c: void FSEventStreamRelease(FSEventStreamRef
      +	data->stream_scheduled = 1;
      +
      +	if (!FSEventStreamStart(data->stream)) {
     -+		error("Failed to start the FSEventStream");
     ++		error(_("Failed to start the FSEventStream"));
      +		goto force_error_stop_without_loop;
      +	}
      +	data->stream_started = 1;
 18:  0896e72e2b8 = 18:  1f4b5209bf6 fsmonitor--daemon: implement handle_client callback
 19:  bc240a9e665 ! 19:  8cf62c9fc6f help: include fsmonitor--daemon feature flag in version info
     @@ t/test-lib.sh: test_lazy_prereq SHA1 '
      +# Does this platform support `git fsmonitor--daemon`
      +#
      +test_lazy_prereq FSMONITOR_DAEMON '
     -+	git version --build-options | grep "feature:" | grep "fsmonitor--daemon"
     ++	git version --build-options >output &&
     ++	grep "feature: fsmonitor--daemon" output
      +'
 20:  2b563c240eb ! 20:  1bd74a81593 t/helper/fsmonitor-client: create IPC client to talk to FSMonitor Daemon
     @@ t/helper/test-fsmonitor-client.c (new)
      +
      +	ret = fsmonitor_ipc__send_query(token, &answer);
      +	if (ret < 0)
     -+		die(_("could not query fsmonitor--daemon"));
     ++		die("could not query fsmonitor--daemon");
      +
      +	write_in_full(1, answer.buf, answer.len);
      +	strbuf_release(&answer);
     @@ t/helper/test-fsmonitor-client.c (new)
      +	const char *token = NULL;
      +
      +	const char * const fsmonitor_client_usage[] = {
     -+		N_("test-helper fsmonitor-client query [<token>]"),
     -+		N_("test-helper fsmonitor-client flush"),
     ++		"test-tool fsmonitor-client query [<token>]",
     ++		"test-tool fsmonitor-client flush",
      +		NULL,
      +	};
      +
      +	struct option options[] = {
     -+		OPT_STRING(0, "token", &token, N_("token"),
     -+			   N_("command token to send to the server")),
     ++		OPT_STRING(0, "token", &token, "token",
     ++			   "command token to send to the server"),
      +		OPT_END()
      +	};
      +
     -+	if (argc < 2)
     -+		usage_with_options(fsmonitor_client_usage, options);
     ++	argc = parse_options(argc, argv, NULL, options, fsmonitor_client_usage, 0);
      +
     -+	if (argc == 2 && !strcmp(argv[1], "-h"))
     ++	if (argc != 1)
      +		usage_with_options(fsmonitor_client_usage, options);
      +
     -+	subcmd = argv[1];
     -+	argv--;
     -+	argc++;
     -+
     -+	argc = parse_options(argc, argv, NULL, options, fsmonitor_client_usage, 0);
     ++	subcmd = argv[0];
      +
      +	setup_git_directory();
      +
 21:  db8809da089 ! 21:  4a920d0b54a t7527: create test for fsmonitor--daemon
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +fi
      +
      +stop_daemon_delete_repo () {
     -+	r=$1
     -+	git -C $r fsmonitor--daemon stop >/dev/null 2>/dev/null
     ++	r=$1 &&
     ++	test_might_fail git -C $r fsmonitor--daemon stop &&
      +	rm -rf $1
     -+	return 0
      +}
      +
      +start_daemon () {
     -+	case "$#" in
     -+		1) r="-C $1";;
     -+		*) r="";
     -+	esac
     ++	r= &&
     ++	tf= &&
     ++	t2= &&
     ++	tk= &&
     ++
     ++	while test "$#" -ne 0
     ++	do
     ++		case "$1" in
     ++		-C)
     ++			shift;
     ++			test "$#" -ne 0 || BUG "error: -C requires arg"
     ++			r="-C $1"
     ++			shift
     ++			;;
     ++		-tf)
     ++			shift;
     ++			test "$#" -ne 0 || BUG "error: -tf requires arg"
     ++			tf="$1"
     ++			shift
     ++			;;
     ++		-t2)
     ++			shift;
     ++			test "$#" -ne 0 || BUG "error: -t2 requires arg"
     ++			t2="$1"
     ++			shift
     ++			;;
     ++		-tk)
     ++			shift;
     ++			test "$#" -ne 0 || BUG "error: -tk requires arg"
     ++			tk="$1"
     ++			shift
     ++			;;
     ++		*)
     ++			BUG "error: unknown option: '$1'"
     ++			;;
     ++		esac
     ++	done &&
      +
     -+	git $r fsmonitor--daemon start || return $?
     -+	git $r fsmonitor--daemon status || return $?
     -+
     -+	return 0
     ++	(
     ++		if test -n "$tf"
     ++		then
     ++			GIT_TRACE_FSMONITOR="$tf"
     ++			export GIT_TRACE_FSMONITOR
     ++		fi &&
     ++
     ++		if test -n "$t2"
     ++		then
     ++			GIT_TRACE2_PERF="$t2"
     ++			export GIT_TRACE2_PERF
     ++		fi &&
     ++
     ++		if test -n "$tk"
     ++		then
     ++			GIT_TEST_FSMONITOR_TOKEN="$tk"
     ++			export GIT_TEST_FSMONITOR_TOKEN
     ++		fi &&
     ++
     ++		git $r fsmonitor--daemon start &&
     ++		git $r fsmonitor--daemon status
     ++	)
      +}
      +
      +# Is a Trace2 data event present with the given catetory and key?
      +# We do not care what the value is.
      +#
      +have_t2_data_event () {
     -+	c=$1
     -+	k=$2
     ++	c=$1 &&
     ++	k=$2 &&
      +
      +	grep -e '"event":"data".*"category":"'"$c"'".*"key":"'"$k"'"'
      +}
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +	test_when_finished "stop_daemon_delete_repo test_explicit" &&
      +
      +	git init test_explicit &&
     -+	start_daemon test_explicit &&
     ++	start_daemon -C test_explicit &&
      +
      +	git -C test_explicit fsmonitor--daemon stop &&
      +	test_must_fail git -C test_explicit fsmonitor--daemon status
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +	# but this test case is only concerned with whether the daemon was
      +	# implicitly started.)
      +
     -+	GIT_TRACE2_EVENT="$(pwd)/.git/trace" \
     ++	GIT_TRACE2_EVENT="$PWD/.git/trace" \
      +		test-tool -C test_implicit fsmonitor-client query --token 0 >actual &&
      +	nul_to_q <actual >actual.filtered &&
      +	grep "builtin:" actual.filtered &&
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +
      +	git init test_implicit_1 &&
      +
     -+	start_daemon test_implicit_1 &&
     ++	start_daemon -C test_implicit_1 &&
      +
      +	# deleting the .git directory will implicitly stop the daemon.
      +	rm -rf test_implicit_1/.git &&
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +
      +	git init test_implicit_2 &&
      +
     -+	start_daemon test_implicit_2 &&
     ++	start_daemon -C test_implicit_2 &&
      +
      +	# renaming the .git directory will implicitly stop the daemon.
      +	mv test_implicit_2/.git test_implicit_2/.xxx &&
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +
      +	git init test_multiple &&
      +
     -+	start_daemon test_multiple &&
     ++	start_daemon -C test_multiple &&
      +
      +	test_must_fail git -C test_multiple fsmonitor--daemon start 2>actual &&
      +	grep "fsmonitor--daemon is already running" actual &&
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +# This is here in case something else fails first.
      +#
      +redundant_stop_daemon () {
     -+	git fsmonitor--daemon stop
     -+	return 0
     ++	test_might_fail git fsmonitor--daemon stop
      +}
      +
      +test_expect_success 'update-index implicitly starts daemon' '
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +
      +	test_must_fail git fsmonitor--daemon status &&
      +
     -+	GIT_TRACE2_EVENT="$(pwd)/.git/trace_implicit_1" \
     ++	GIT_TRACE2_EVENT="$PWD/.git/trace_implicit_1" \
      +		git update-index --fsmonitor &&
      +
      +	git fsmonitor--daemon status &&
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +
      +	test_must_fail git fsmonitor--daemon status &&
      +
     -+	GIT_TRACE2_EVENT="$(pwd)/.git/trace_implicit_2" \
     ++	GIT_TRACE2_EVENT="$PWD/.git/trace_implicit_2" \
      +		git status >actual &&
      +
      +	git fsmonitor--daemon status &&
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +'
      +
      +edit_files () {
     -+	echo 1 >modified
     -+	echo 2 >dir1/modified
     -+	echo 3 >dir2/modified
     ++	echo 1 >modified &&
     ++	echo 2 >dir1/modified &&
     ++	echo 3 >dir2/modified &&
      +	>dir1/untracked
      +}
      +
      +delete_files () {
     -+	rm -f delete
     -+	rm -f dir1/delete
     ++	rm -f delete &&
     ++	rm -f dir1/delete &&
      +	rm -f dir2/delete
      +}
      +
      +create_files () {
     -+	echo 1 >new
     -+	echo 2 >dir1/new
     ++	echo 1 >new &&
     ++	echo 2 >dir1/new &&
      +	echo 3 >dir2/new
      +}
      +
      +rename_files () {
     -+	mv rename renamed
     -+	mv dir1/rename dir1/renamed
     ++	mv rename renamed &&
     ++	mv dir1/rename dir1/renamed &&
      +	mv dir2/rename dir2/renamed
      +}
      +
      +file_to_directory () {
     -+	rm -f delete
     -+	mkdir delete
     ++	rm -f delete &&
     ++	mkdir delete &&
      +	echo 1 >delete/new
      +}
      +
      +directory_to_file () {
     -+	rm -rf dir1
     ++	rm -rf dir1 &&
      +	echo 1 >dir1
      +}
      +
     -+verify_status () {
     -+	git status >actual &&
     -+	GIT_INDEX_FILE=.git/fresh-index git read-tree master &&
     -+	GIT_INDEX_FILE=.git/fresh-index git -c core.fsmonitor=false status >expect &&
     -+	test_cmp expect actual &&
     -+	echo HELLO AFTER &&
     -+	cat .git/trace &&
     -+	echo HELLO AFTER
     -+}
     -+
      +# The next few test cases confirm that our fsmonitor daemon sees each type
      +# of OS filesystem notification that we care about.  At this layer we just
      +# ensure we are getting the OS notifications and do not try to confirm what
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +# daemon) because these commands might implicitly restart the daemon.
      +
      +clean_up_repo_and_stop_daemon () {
     -+	git reset --hard HEAD
     -+	git clean -fd
     -+	git fsmonitor--daemon stop
     ++	git reset --hard HEAD &&
     ++	git clean -fd &&
     ++	test_might_fail git fsmonitor--daemon stop &&
      +	rm -f .git/trace
      +}
      +
      +test_expect_success 'edit some files' '
      +	test_when_finished clean_up_repo_and_stop_daemon &&
      +
     -+	(
     -+		GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
     -+		export GIT_TRACE_FSMONITOR &&
     -+
     -+		start_daemon
     -+	) &&
     ++	start_daemon -tf "$PWD/.git/trace" &&
      +
      +	edit_files &&
      +
     -+	test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
     ++	test-tool fsmonitor-client query --token 0 &&
      +
      +	grep "^event: dir1/modified$"  .git/trace &&
      +	grep "^event: dir2/modified$"  .git/trace &&
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +test_expect_success 'create some files' '
      +	test_when_finished clean_up_repo_and_stop_daemon &&
      +
     -+	(
     -+		GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
     -+		export GIT_TRACE_FSMONITOR &&
     -+
     -+		start_daemon
     -+	) &&
     ++	start_daemon -tf "$PWD/.git/trace" &&
      +
      +	create_files &&
      +
     -+	test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
     ++	test-tool fsmonitor-client query --token 0 &&
      +
      +	grep "^event: dir1/new$" .git/trace &&
      +	grep "^event: dir2/new$" .git/trace &&
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +test_expect_success 'delete some files' '
      +	test_when_finished clean_up_repo_and_stop_daemon &&
      +
     -+	(
     -+		GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
     -+		export GIT_TRACE_FSMONITOR &&
     -+
     -+		start_daemon
     -+	) &&
     ++	start_daemon -tf "$PWD/.git/trace" &&
      +
      +	delete_files &&
      +
     -+	test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
     ++	test-tool fsmonitor-client query --token 0 &&
      +
      +	grep "^event: dir1/delete$" .git/trace &&
      +	grep "^event: dir2/delete$" .git/trace &&
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +test_expect_success 'rename some files' '
      +	test_when_finished clean_up_repo_and_stop_daemon &&
      +
     -+	(
     -+		GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
     -+		export GIT_TRACE_FSMONITOR &&
     -+
     -+		start_daemon
     -+	) &&
     ++	start_daemon -tf "$PWD/.git/trace" &&
      +
      +	rename_files &&
      +
     -+	test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
     ++	test-tool fsmonitor-client query --token 0 &&
      +
      +	grep "^event: dir1/rename$"  .git/trace &&
      +	grep "^event: dir2/rename$"  .git/trace &&
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +test_expect_success 'rename directory' '
      +	test_when_finished clean_up_repo_and_stop_daemon &&
      +
     -+	(
     -+		GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
     -+		export GIT_TRACE_FSMONITOR &&
     -+
     -+		start_daemon
     -+	) &&
     ++	start_daemon -tf "$PWD/.git/trace" &&
      +
      +	mv dirtorename dirrenamed &&
      +
     -+	test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
     ++	test-tool fsmonitor-client query --token 0 &&
      +
      +	grep "^event: dirtorename/*$" .git/trace &&
      +	grep "^event: dirrenamed/*$"  .git/trace
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +test_expect_success 'file changes to directory' '
      +	test_when_finished clean_up_repo_and_stop_daemon &&
      +
     -+	(
     -+		GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
     -+		export GIT_TRACE_FSMONITOR &&
     -+
     -+		start_daemon
     -+	) &&
     ++	start_daemon -tf "$PWD/.git/trace" &&
      +
      +	file_to_directory &&
      +
     -+	test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
     ++	test-tool fsmonitor-client query --token 0 &&
      +
      +	grep "^event: delete$"     .git/trace &&
      +	grep "^event: delete/new$" .git/trace
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +test_expect_success 'directory changes to a file' '
      +	test_when_finished clean_up_repo_and_stop_daemon &&
      +
     -+	(
     -+		GIT_TRACE_FSMONITOR="$(pwd)/.git/trace" &&
     -+		export GIT_TRACE_FSMONITOR &&
     -+
     -+		start_daemon
     -+	) &&
     ++	start_daemon -tf "$PWD/.git/trace" &&
      +
      +	directory_to_file &&
      +
     -+	test-tool fsmonitor-client query --token 0 >/dev/null 2>&1 &&
     ++	test-tool fsmonitor-client query --token 0 &&
      +
      +	grep "^event: dir1$" .git/trace
      +'
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +
      +	git init test_flush &&
      +
     -+	(
     -+		GIT_TEST_FSMONITOR_TOKEN=true &&
     -+		export GIT_TEST_FSMONITOR_TOKEN &&
     -+
     -+		GIT_TRACE_FSMONITOR="$(pwd)/.git/trace_daemon" &&
     -+		export GIT_TRACE_FSMONITOR &&
     -+
     -+		start_daemon test_flush
     -+	) &&
     ++	start_daemon -C test_flush -tf "$PWD/.git/trace_daemon" -tk true &&
      +
      +	# The daemon should have an initial token with no events in _0 and
      +	# then a few (probably platform-specific number of) events in _1.
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +	test-tool -C test_flush fsmonitor-client query --token "builtin:test_00000001:0" >actual_0 &&
      +	nul_to_q <actual_0 >actual_q0 &&
      +
     -+	touch test_flush/file_1 &&
     -+	touch test_flush/file_2 &&
     ++	>test_flush/file_1 &&
     ++	>test_flush/file_2 &&
      +
      +	test-tool -C test_flush fsmonitor-client query --token "builtin:test_00000001:0" >actual_1 &&
      +	nul_to_q <actual_1 >actual_q1 &&
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +
      +	grep "^builtin:test_00000002:0Q$" actual_q2 &&
      +
     -+	touch test_flush/file_3 &&
     ++	>test_flush/file_3 &&
      +
      +	test-tool -C test_flush fsmonitor-client query --token "builtin:test_00000002:0" >actual_3 &&
      +	nul_to_q <actual_3 >actual_q3 &&
     @@ t/t7527-builtin-fsmonitor.sh (new)
      +test_expect_success 'worktree with .git file' '
      +	git -C wt-base worktree add ../wt-secondary &&
      +
     -+	(
     -+		GIT_TRACE2_PERF="$(pwd)/trace2_wt_secondary" &&
     -+		export GIT_TRACE2_PERF &&
     -+
     -+		GIT_TRACE_FSMONITOR="$(pwd)/trace_wt_secondary" &&
     -+		export GIT_TRACE_FSMONITOR &&
     -+
     -+		start_daemon wt-secondary
     -+	) &&
     ++	start_daemon -C wt-secondary \
     ++		-tf "$PWD/trace_wt_secondary" \
     ++		-t2 "$PWD/trace2_wt_secondary" &&
      +
      +	git -C wt-secondary fsmonitor--daemon stop &&
      +	test_must_fail git -C wt-secondary fsmonitor--daemon status
 22:  15bd5aaff36 = 22:  c925a9a7459 t/perf: avoid copying builtin fsmonitor files into test repo
 23:  4cb97918d20 = 23:  5b3381c223e t/helper/test-chmtime: skip directories on Windows
 24:  a70748b4640 ! 24:  803a540cc00 t/perf/p7519: speed up test on Windows
     @@ t/perf/p7519-fsmonitor.sh: test_fsmonitor_suite() {
       			head -100000 | \
       			grep -v \" | \
      -			sed '\''s/\(.\)/\\\1/g'\'' | \
     -+			egrep -v " ." | \
     ++			grep -v " ." | \
       			xargs test-tool chmtime -300 &&
       		git status
       	'
 25:  b0c9c9c7a40 ! 25:  d5ca2df31c8 t/perf/p7519: add fsmonitor--daemon test cases
     @@ Commit message
          Signed-off-by: Junio C Hamano <gitster@pobox.com>
      
       ## t/perf/p7519-fsmonitor.sh ##
     +@@ t/perf/p7519-fsmonitor.sh: test_expect_success "one time repo setup" '
     + 	fi
     + '
     + 
     +-setup_for_fsmonitor () {
     ++setup_for_fsmonitor_hook () {
     + 	# set INTEGRATION_SCRIPT depending on the environment
     + 	if test -n "$INTEGRATION_PATH"
     + 	then
      @@ t/perf/p7519-fsmonitor.sh: test_perf_w_drop_caches () {
       }
       
     @@ t/perf/p7519-fsmonitor.sh: test_perf_w_drop_caches () {
      +	if test -n "$USE_FSMONITOR_DAEMON"
      +	then
      +		DESC="builtin fsmonitor--daemon"
     -+	elif test -n "$INTEGRATION_SCRIPT"; then
     ++	elif test -n "$INTEGRATION_SCRIPT"
     ++	then
       		DESC="fsmonitor=$(basename $INTEGRATION_SCRIPT)"
       	else
       		DESC="fsmonitor=disabled"
     +@@ t/perf/p7519-fsmonitor.sh: test_fsmonitor_suite () {
     + trace_start fsmonitor-watchman
     + if test -n "$GIT_PERF_7519_FSMONITOR"; then
     + 	for INTEGRATION_PATH in $GIT_PERF_7519_FSMONITOR; do
     +-		test_expect_success "setup for fsmonitor $INTEGRATION_PATH" 'setup_for_fsmonitor'
     ++		test_expect_success "setup for fsmonitor $INTEGRATION_PATH" 'setup_for_fsmonitor_hook'
     + 		test_fsmonitor_suite
     + 	done
     + else
     +-	test_expect_success "setup for fsmonitor" 'setup_for_fsmonitor'
     ++	test_expect_success "setup for fsmonitor hook" 'setup_for_fsmonitor_hook'
     + 	test_fsmonitor_suite
     + fi
     + 
      @@ t/perf/p7519-fsmonitor.sh: test_expect_success "setup without fsmonitor" '
       test_fsmonitor_suite
       trace_stop
     @@ t/perf/p7519-fsmonitor.sh: test_expect_success "setup without fsmonitor" '
      +then
      +	USE_FSMONITOR_DAEMON=t
      +
     -+	trace_start fsmonitor--daemon--server
     -+	git fsmonitor--daemon start
     ++	test_expect_success "setup for builtin fsmonitor" '
     ++		trace_start fsmonitor--daemon--server &&
     ++		git fsmonitor--daemon start &&
      +
     -+	trace_start fsmonitor--daemon--client
     ++		trace_start fsmonitor--daemon--client &&
      +
     -+	git config core.fsmonitor true
     -+	git update-index --fsmonitor
     ++		git config core.fsmonitor true &&
     ++		git update-index --fsmonitor
     ++	'
      +
      +	test_fsmonitor_suite
      +
 26:  64a5b741670 = 26:  42631259e89 fsmonitor--daemon: periodically truncate list of modified files
 27:  5b06eb5d0e6 ! 27:  f256c3cbe8b fsmonitor--daemon: use a cookie file to sync with file system
     @@ builtin/fsmonitor--daemon.c: static int do_as_client__status(void)
       
      +enum fsmonitor_cookie_item_result {
      +	FCIR_ERROR = -1, /* could not create cookie file ? */
     -+	FCIR_INIT = 0,
     ++	FCIR_INIT,
      +	FCIR_SEEN,
      +	FCIR_ABORT,
      +};
      +
      +struct fsmonitor_cookie_item {
      +	struct hashmap_entry entry;
     -+	const char *name;
     ++	char *name;
      +	enum fsmonitor_cookie_item_result result;
      +};
      +
     @@ builtin/fsmonitor--daemon.c: static int do_as_client__status(void)
      +	 * that the listener thread has seen it.
      +	 */
      +	fd = open(cookie_pathname.buf, O_WRONLY | O_CREAT | O_EXCL, 0600);
     -+	if (fd >= 0) {
     -+		close(fd);
     -+		unlink(cookie_pathname.buf);
     -+
     -+		/*
     -+		 * Technically, this is an infinite wait (well, unless another
     -+		 * thread sends us an abort).  I'd like to change this to
     -+		 * use `pthread_cond_timedwait()` and return an error/timeout
     -+		 * and let the caller do the trivial response thing, but we
     -+		 * don't have that routine in our thread-utils.
     -+		 *
     -+		 * After extensive beta testing I'm not really worried about
     -+		 * this.  Also note that the above open() and unlink() calls
     -+		 * will cause at least two FS events on that path, so the odds
     -+		 * of getting stuck are pretty slim.
     -+		 */
     -+		while (cookie->result == FCIR_INIT)
     -+			pthread_cond_wait(&state->cookies_cond,
     -+					  &state->main_lock);
     -+	} else {
     ++	if (fd < 0) {
      +		error_errno(_("could not create fsmonitor cookie '%s'"),
      +			    cookie->name);
      +
      +		cookie->result = FCIR_ERROR;
     ++		goto done;
      +	}
      +
     ++	/*
     ++	 * Technically, close() and unlink() can fail, but we don't
     ++	 * care here.  We only created the file to trigger a watch
     ++	 * event from the FS to know that when we're up to date.
     ++	 */
     ++	close(fd);
     ++	unlink(cookie_pathname.buf);
     ++
     ++	/*
     ++	 * Technically, this is an infinite wait (well, unless another
     ++	 * thread sends us an abort).  I'd like to change this to
     ++	 * use `pthread_cond_timedwait()` and return an error/timeout
     ++	 * and let the caller do the trivial response thing, but we
     ++	 * don't have that routine in our thread-utils.
     ++	 *
     ++	 * After extensive beta testing I'm not really worried about
     ++	 * this.  Also note that the above open() and unlink() calls
     ++	 * will cause at least two FS events on that path, so the odds
     ++	 * of getting stuck are pretty slim.
     ++	 */
     ++	while (cookie->result == FCIR_INIT)
     ++		pthread_cond_wait(&state->cookies_cond,
     ++				  &state->main_lock);
     ++
     ++done:
      +	hashmap_remove(&state->cookies, &cookie->entry, NULL);
      +
      +	result = cookie->result;
      +
     -+	free((char*)cookie->name);
     ++	free(cookie->name);
      +	free(cookie);
      +	strbuf_release(&cookie_pathname);
      +
 28:  1fd5439de03 = 28:  08af8296f96 fsmonitor: force update index after large responses
 29:  6fc1430285f ! 29:  e6cf84dc8eb t7527: test status with untracked-cache and fsmonitor--daemon
     @@ t/t7527-builtin-fsmonitor.sh: test_expect_success 'cleanup worktrees' '
      +}
      +
      +matrix_try () {
     -+	uc=$1
     -+	fsm=$2
     -+	fn=$3
     ++	uc=$1 &&
     ++	fsm=$2 &&
     ++	fn=$3 &&
      +
      +	test_expect_success "Matrix[uc:$uc][fsm:$fsm] $fn" '
      +		matrix_clean_up_repo &&
 30:  b915b95cc2f <  -:  ----------- update-index: convert fsmonitor warnings to advise

-- 
gitgitgadget

  parent reply	other threads:[~2022-03-22 18:00 UTC|newest]

Thread overview: 298+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-16 19:54 [PATCH 0/5] Builtin FSMonitor Part 2 Jeff Hostetler via GitGitGadget
2021-09-16 19:54 ` [PATCH 1/5] fsmonitor: enhance existing comments Jeff Hostetler via GitGitGadget
2021-09-17  6:31   ` Bagas Sanjaya
2021-09-17  6:44     ` Junio C Hamano
2021-09-23 14:11       ` Jeff Hostetler
2021-09-16 19:54 ` [PATCH 2/5] fsmonitor-ipc: create client routines for git-fsmonitor--daemon Jeff Hostetler via GitGitGadget
2021-09-16 19:54 ` [PATCH 3/5] fsmonitor: config settings are repository-specific Jeff Hostetler via GitGitGadget
2021-09-16 19:54 ` [PATCH 4/5] fsmonitor: use IPC to query the builtin FSMonitor daemon Jeff Hostetler via GitGitGadget
2021-09-16 19:54 ` [PATCH 5/5] fsmonitor: update fsmonitor config documentation Jeff Hostetler via GitGitGadget
2021-10-07 13:52 ` [PATCH v2 0/5] Builtin FSMonitor Part 2 Jeff Hostetler via GitGitGadget
2021-10-07 13:52   ` [PATCH v2 1/5] fsmonitor: enhance existing comments Jeff Hostetler via GitGitGadget
2021-10-07 13:52   ` [PATCH v2 2/5] fsmonitor-ipc: create client routines for git-fsmonitor--daemon Jeff Hostetler via GitGitGadget
2021-10-07 13:52   ` [PATCH v2 3/5] fsmonitor: config settings are repository-specific Jeff Hostetler via GitGitGadget
2021-10-07 16:59     ` Ævar Arnfjörð Bjarmason
2021-10-08 20:36       ` Jeff Hostetler
2021-10-07 13:52   ` [PATCH v2 4/5] fsmonitor: use IPC to query the builtin FSMonitor daemon Jeff Hostetler via GitGitGadget
2021-10-07 13:52   ` [PATCH v2 5/5] fsmonitor: update fsmonitor config documentation Jeff Hostetler via GitGitGadget
2021-10-13 20:31   ` [PATCH v3 0/5] Builtin FSMonitor Part 2 Jeff Hostetler via GitGitGadget
2021-10-13 20:31     ` [PATCH v3 1/5] fsmonitor: enhance existing comments Jeff Hostetler via GitGitGadget
2021-10-13 20:31     ` [PATCH v3 2/5] fsmonitor-ipc: create client routines for git-fsmonitor--daemon Jeff Hostetler via GitGitGadget
2021-10-13 20:31     ` [PATCH v3 3/5] fsmonitor: config settings are repository-specific Jeff Hostetler via GitGitGadget
2021-10-13 20:31     ` [PATCH v3 4/5] fsmonitor: use IPC to query the builtin FSMonitor daemon Jeff Hostetler via GitGitGadget
2021-10-13 20:31     ` [PATCH v3 5/5] fsmonitor: update fsmonitor config documentation Jeff Hostetler via GitGitGadget
2021-10-15 12:03     ` [PATCH v3 0/5] Builtin FSMonitor Part 2 Ævar Arnfjörð Bjarmason
2021-10-20 21:43       ` Jeff Hostetler
2021-10-21 14:24     ` [PATCH v4 00/29] " Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 01/29] fsmonitor: enhance existing comments Jeff Hostetler via GitGitGadget
2021-10-21 20:40         ` Junio C Hamano
2021-10-27 18:46           ` Jeff Hostetler
2021-10-21 14:24       ` [PATCH v4 02/29] fsmonitor-ipc: create client routines for git-fsmonitor--daemon Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 03/29] fsmonitor: config settings are repository-specific Jeff Hostetler via GitGitGadget
2021-10-21 21:05         ` Junio C Hamano
2021-10-21 21:16           ` Junio C Hamano
2021-10-27 19:53             ` Jeff Hostetler
2021-10-27 19:03           ` Jeff Hostetler
2021-10-21 14:24       ` [PATCH v4 04/29] fsmonitor: use IPC to query the builtin FSMonitor daemon Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 05/29] fsmonitor: document builtin fsmonitor Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 06/29] fsmonitor--daemon: add a built-in fsmonitor daemon Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 07/29] fsmonitor--daemon: implement 'stop' and 'status' commands Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 08/29] compat/fsmonitor/fsm-listen-win32: stub in backend for Windows Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 09/29] compat/fsmonitor/fsm-listen-darwin: stub in backend for Darwin Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 10/29] fsmonitor--daemon: implement 'run' command Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 11/29] fsmonitor--daemon: implement 'start' command Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 12/29] fsmonitor--daemon: add pathname classification Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 13/29] fsmonitor--daemon: define token-ids Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 14/29] fsmonitor--daemon: create token-based changed path cache Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 15/29] compat/fsmonitor/fsm-listen-win32: implement FSMonitor backend on Windows Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 16/29] compat/fsmonitor/fsm-listen-darwin: add macos header files for FSEvent Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 17/29] compat/fsmonitor/fsm-listen-darwin: implement FSEvent listener on MacOS Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 18/29] fsmonitor--daemon: implement handle_client callback Jeff Hostetler via GitGitGadget
2021-10-21 14:24       ` [PATCH v4 19/29] help: include fsmonitor--daemon feature flag in version info Jeff Hostetler via GitGitGadget
2021-10-21 14:25       ` [PATCH v4 20/29] t/helper/fsmonitor-client: create IPC client to talk to FSMonitor Daemon Jeff Hostetler via GitGitGadget
2021-10-21 14:25       ` [PATCH v4 21/29] t7527: create test for fsmonitor--daemon Jeff Hostetler via GitGitGadget
2021-12-26  3:59         ` Junio C Hamano
2021-10-21 14:25       ` [PATCH v4 22/29] t/perf: avoid copying builtin fsmonitor files into test repo Jeff Hostetler via GitGitGadget
2021-10-21 14:25       ` [PATCH v4 23/29] t/helper/test-chmtime: skip directories on Windows Jeff Hostetler via GitGitGadget
2021-10-21 14:25       ` [PATCH v4 24/29] t/perf/p7519: speed up test " Jeff Hostetler via GitGitGadget
2021-12-26  4:09         ` Junio C Hamano
2021-10-21 14:25       ` [PATCH v4 25/29] t/perf/p7519: add fsmonitor--daemon test cases Jeff Hostetler via GitGitGadget
2021-10-21 14:25       ` [PATCH v4 26/29] fsmonitor--daemon: periodically truncate list of modified files Jeff Hostetler via GitGitGadget
2021-10-21 14:25       ` [PATCH v4 27/29] fsmonitor--daemon: use a cookie file to sync with file system Jeff Hostetler via GitGitGadget
2021-10-21 14:25       ` [PATCH v4 28/29] fsmonitor: force update index after large responses Jeff Hostetler via GitGitGadget
2021-10-21 14:25       ` [PATCH v4 29/29] t7527: test status with untracked-cache and fsmonitor--daemon Jeff Hostetler via GitGitGadget
2021-10-22  5:23         ` Eric Sunshine
2021-10-27 20:06           ` Jeff Hostetler
2022-02-11 20:55       ` [PATCH v5 00/30] Builtin FSMonitor Part 2 Jeff Hostetler via GitGitGadget
2022-02-11 20:55         ` [PATCH v5 01/30] fsmonitor: enhance existing comments, clarify trivial response handling Jeff Hostetler via GitGitGadget
2022-02-11 20:55         ` [PATCH v5 02/30] fsmonitor-ipc: create client routines for git-fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-02-17 16:13           ` Johannes Schindelin
2022-02-11 20:55         ` [PATCH v5 03/30] fsmonitor: config settings are repository-specific Jeff Hostetler via GitGitGadget
2022-02-17 16:27           ` Johannes Schindelin
2022-02-17 19:21             ` Jeff Hostetler
2022-02-24 15:50               ` Johannes Schindelin
2022-02-11 20:55         ` [PATCH v5 04/30] fsmonitor: use IPC to query the builtin FSMonitor daemon Jeff Hostetler via GitGitGadget
2022-02-11 20:55         ` [PATCH v5 05/30] fsmonitor: document builtin fsmonitor Jeff Hostetler via GitGitGadget
2022-02-11 20:55         ` [PATCH v5 06/30] fsmonitor--daemon: add a built-in fsmonitor daemon Jeff Hostetler via GitGitGadget
2022-02-25 22:46           ` Ævar Arnfjörð Bjarmason
2022-03-01 14:58             ` Jeff Hostetler
2022-03-01 17:37               ` Junio C Hamano
2022-02-11 20:55         ` [PATCH v5 07/30] fsmonitor--daemon: implement 'stop' and 'status' commands Jeff Hostetler via GitGitGadget
2022-02-11 20:55         ` [PATCH v5 08/30] compat/fsmonitor/fsm-listen-win32: stub in backend for Windows Jeff Hostetler via GitGitGadget
2022-02-11 20:55         ` [PATCH v5 09/30] compat/fsmonitor/fsm-listen-darwin: stub in backend for Darwin Jeff Hostetler via GitGitGadget
2022-02-11 20:55         ` [PATCH v5 10/30] fsmonitor--daemon: implement 'run' command Jeff Hostetler via GitGitGadget
2022-02-17 16:46           ` Johannes Schindelin
2022-02-17 19:26             ` Jeff Hostetler
2022-02-24 15:31               ` Johannes Schindelin
2022-02-11 20:56         ` [PATCH v5 11/30] fsmonitor--daemon: implement 'start' command Jeff Hostetler via GitGitGadget
2022-02-17 16:50           ` Johannes Schindelin
2022-02-24 15:30           ` Johannes Schindelin
2022-02-11 20:56         ` [PATCH v5 12/30] fsmonitor--daemon: add pathname classification Jeff Hostetler via GitGitGadget
2022-02-24 14:36           ` Johannes Schindelin
2022-02-11 20:56         ` [PATCH v5 13/30] fsmonitor--daemon: define token-ids Jeff Hostetler via GitGitGadget
2022-02-11 20:56         ` [PATCH v5 14/30] fsmonitor--daemon: create token-based changed path cache Jeff Hostetler via GitGitGadget
2022-02-11 20:56         ` [PATCH v5 15/30] compat/fsmonitor/fsm-listen-win32: implement FSMonitor backend on Windows Jeff Hostetler via GitGitGadget
2022-02-24 15:10           ` Johannes Schindelin
2022-02-11 20:56         ` [PATCH v5 16/30] compat/fsmonitor/fsm-listen-darwin: add macos header files for FSEvent Jeff Hostetler via GitGitGadget
2022-02-24 15:13           ` Johannes Schindelin
2022-02-11 20:56         ` [PATCH v5 17/30] compat/fsmonitor/fsm-listen-darwin: implement FSEvent listener on MacOS Jeff Hostetler via GitGitGadget
2022-02-24 15:21           ` Johannes Schindelin
2022-02-11 20:56         ` [PATCH v5 18/30] fsmonitor--daemon: implement handle_client callback Jeff Hostetler via GitGitGadget
2022-02-11 20:56         ` [PATCH v5 19/30] help: include fsmonitor--daemon feature flag in version info Jeff Hostetler via GitGitGadget
2022-02-24 15:39           ` Johannes Schindelin
2022-02-11 20:56         ` [PATCH v5 20/30] t/helper/fsmonitor-client: create IPC client to talk to FSMonitor Daemon Jeff Hostetler via GitGitGadget
2022-02-11 20:56         ` [PATCH v5 21/30] t7527: create test for fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-02-11 20:56         ` [PATCH v5 22/30] t/perf: avoid copying builtin fsmonitor files into test repo Jeff Hostetler via GitGitGadget
2022-02-11 20:56         ` [PATCH v5 23/30] t/helper/test-chmtime: skip directories on Windows Jeff Hostetler via GitGitGadget
2022-02-28  9:43           ` Tao Klerks
2022-02-28 17:49             ` Jeff Hostetler
2022-02-28 18:39               ` Junio C Hamano
2022-02-11 20:56         ` [PATCH v5 24/30] t/perf/p7519: speed up test " Jeff Hostetler via GitGitGadget
2022-02-17  1:15           ` Junio C Hamano
2022-02-17 19:03             ` Jeff Hostetler
2022-02-11 20:56         ` [PATCH v5 25/30] t/perf/p7519: add fsmonitor--daemon test cases Jeff Hostetler via GitGitGadget
2022-02-11 20:56         ` [PATCH v5 26/30] fsmonitor--daemon: periodically truncate list of modified files Jeff Hostetler via GitGitGadget
2022-02-24 16:38           ` Johannes Schindelin
2022-02-11 20:56         ` [PATCH v5 27/30] fsmonitor--daemon: use a cookie file to sync with file system Jeff Hostetler via GitGitGadget
2022-02-24 16:45           ` Johannes Schindelin
2022-02-11 20:56         ` [PATCH v5 28/30] fsmonitor: force update index after large responses Jeff Hostetler via GitGitGadget
2022-02-24 16:51           ` Johannes Schindelin
2022-02-11 20:56         ` [PATCH v5 29/30] t7527: test status with untracked-cache and fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-02-11 20:56         ` [PATCH v5 30/30] update-index: convert fsmonitor warnings to advise Jeff Hostetler via GitGitGadget
2022-02-17 16:06         ` [PATCH v5 00/30] Builtin FSMonitor Part 2 Johannes Schindelin
2022-02-17 19:36           ` Junio C Hamano
2022-02-24 15:47             ` Johannes Schindelin
2022-02-24 17:16               ` Junio C Hamano
2022-02-22 18:53           ` Jeff Hostetler
2022-02-24 16:22             ` Johannes Schindelin
2022-02-24 18:13               ` Jeff Hostetler
2022-02-24 19:16                 ` Johannes Schindelin
2022-03-01 18:43         ` [PATCH v6 " Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 01/30] fsmonitor: enhance existing comments, clarify trivial response handling Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 02/30] fsmonitor-ipc: create client routines for git-fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 03/30] fsmonitor: config settings are repository-specific Jeff Hostetler via GitGitGadget
2022-03-11  1:47             ` Ævar Arnfjörð Bjarmason
2022-03-11 14:07               ` Jeff Hostetler
2022-03-01 18:43           ` [PATCH v6 04/30] fsmonitor: use IPC to query the builtin FSMonitor daemon Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 05/30] fsmonitor: document builtin fsmonitor Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 06/30] fsmonitor--daemon: add a built-in fsmonitor daemon Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 07/30] fsmonitor--daemon: implement 'stop' and 'status' commands Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 08/30] compat/fsmonitor/fsm-listen-win32: stub in backend for Windows Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 09/30] compat/fsmonitor/fsm-listen-darwin: stub in backend for Darwin Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 10/30] fsmonitor--daemon: implement 'run' command Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 11/30] fsmonitor--daemon: implement 'start' command Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 12/30] fsmonitor--daemon: add pathname classification Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 13/30] fsmonitor--daemon: define token-ids Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 14/30] fsmonitor--daemon: create token-based changed path cache Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 15/30] compat/fsmonitor/fsm-listen-win32: implement FSMonitor backend on Windows Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 16/30] compat/fsmonitor/fsm-listen-darwin: add MacOS header files for FSEvent Jeff Hostetler via GitGitGadget
2022-03-07 10:37             ` Ævar Arnfjörð Bjarmason
2022-03-08 20:26               ` Jeff Hostetler
2022-03-09 13:52                 ` Ævar Arnfjörð Bjarmason
2022-03-08 21:09               ` Jeff Hostetler
2022-03-09 14:14                 ` Ævar Arnfjörð Bjarmason
2022-03-10 14:32                   ` Johannes Schindelin
2022-03-10 14:42                     ` Ævar Arnfjörð Bjarmason
2022-03-10 15:42                       ` Jeff Hostetler
2022-03-09 13:37               ` Jeff Hostetler
2022-03-09 18:57                 ` Junio C Hamano
2022-03-09 19:37                   ` Ævar Arnfjörð Bjarmason
2022-03-11 21:01                   ` Jeff Hostetler
2022-03-01 18:43           ` [PATCH v6 17/30] compat/fsmonitor/fsm-listen-darwin: implement FSEvent listener on MacOS Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 18/30] fsmonitor--daemon: implement handle_client callback Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 19/30] help: include fsmonitor--daemon feature flag in version info Jeff Hostetler via GitGitGadget
2022-03-07 10:51             ` Ævar Arnfjörð Bjarmason
2022-03-08 21:19               ` Jeff Hostetler
2022-03-01 18:43           ` [PATCH v6 20/30] t/helper/fsmonitor-client: create IPC client to talk to FSMonitor Daemon Jeff Hostetler via GitGitGadget
2022-03-07 10:53             ` Ævar Arnfjörð Bjarmason
2022-03-01 18:43           ` [PATCH v6 21/30] t7527: create test for fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-03-07 10:58             ` Ævar Arnfjörð Bjarmason
2022-03-01 18:43           ` [PATCH v6 22/30] t/perf: avoid copying builtin fsmonitor files into test repo Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 23/30] t/helper/test-chmtime: skip directories on Windows Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 24/30] t/perf/p7519: speed up test " Jeff Hostetler via GitGitGadget
2022-03-07 11:09             ` Ævar Arnfjörð Bjarmason
2022-03-01 18:43           ` [PATCH v6 25/30] t/perf/p7519: add fsmonitor--daemon test cases Jeff Hostetler via GitGitGadget
2022-03-07 11:12             ` Ævar Arnfjörð Bjarmason
2022-03-01 18:43           ` [PATCH v6 26/30] fsmonitor--daemon: periodically truncate list of modified files Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 27/30] fsmonitor--daemon: use a cookie file to sync with file system Jeff Hostetler via GitGitGadget
2022-03-07 11:15             ` Ævar Arnfjörð Bjarmason
2022-03-01 18:43           ` [PATCH v6 28/30] fsmonitor: force update index after large responses Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 29/30] t7527: test status with untracked-cache and fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-03-01 18:43           ` [PATCH v6 30/30] update-index: convert fsmonitor warnings to advise Jeff Hostetler via GitGitGadget
2022-03-07 11:29             ` Ævar Arnfjörð Bjarmason
2022-03-01 19:05           ` [PATCH v6 00/30] Builtin FSMonitor Part 2 Junio C Hamano
2022-03-01 19:20           ` Johannes Schindelin
2022-03-22 17:59           ` Jeff Hostetler via GitGitGadget [this message]
2022-03-22 17:59             ` [PATCH v7 01/29] fsmonitor: enhance existing comments, clarify trivial response handling Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 02/29] fsmonitor-ipc: create client routines for git-fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 03/29] fsmonitor: config settings are repository-specific Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 04/29] fsmonitor: use IPC to query the builtin FSMonitor daemon Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 05/29] fsmonitor: document builtin fsmonitor Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 06/29] fsmonitor--daemon: add a built-in fsmonitor daemon Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 07/29] fsmonitor--daemon: implement 'stop' and 'status' commands Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 08/29] compat/fsmonitor/fsm-listen-win32: stub in backend for Windows Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 09/29] compat/fsmonitor/fsm-listen-darwin: stub in backend for Darwin Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 10/29] fsmonitor--daemon: implement 'run' command Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 11/29] fsmonitor--daemon: implement 'start' command Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 12/29] fsmonitor--daemon: add pathname classification Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 13/29] fsmonitor--daemon: define token-ids Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 14/29] fsmonitor--daemon: create token-based changed path cache Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 15/29] compat/fsmonitor/fsm-listen-win32: implement FSMonitor backend on Windows Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 16/29] compat/fsmonitor/fsm-listen-darwin: add MacOS header files for FSEvent Jeff Hostetler via GitGitGadget
2022-03-22 18:19               ` Ævar Arnfjörð Bjarmason
2022-03-23 14:32                 ` Jeff Hostetler
2022-03-22 17:59             ` [PATCH v7 17/29] compat/fsmonitor/fsm-listen-darwin: implement FSEvent listener on MacOS Jeff Hostetler via GitGitGadget
2022-03-22 17:59             ` [PATCH v7 18/29] fsmonitor--daemon: implement handle_client callback Jeff Hostetler via GitGitGadget
2022-03-22 18:30               ` Ævar Arnfjörð Bjarmason
2022-03-23 14:45                 ` Jeff Hostetler
2022-03-22 18:00             ` [PATCH v7 19/29] help: include fsmonitor--daemon feature flag in version info Jeff Hostetler via GitGitGadget
2022-03-22 18:00             ` [PATCH v7 20/29] t/helper/fsmonitor-client: create IPC client to talk to FSMonitor Daemon Jeff Hostetler via GitGitGadget
2022-03-22 18:00             ` [PATCH v7 21/29] t7527: create test for fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-03-22 18:35               ` Ævar Arnfjörð Bjarmason
2022-03-23 16:22                 ` Jeff Hostetler
2022-03-22 18:00             ` [PATCH v7 22/29] t/perf: avoid copying builtin fsmonitor files into test repo Jeff Hostetler via GitGitGadget
2022-03-22 18:00             ` [PATCH v7 23/29] t/helper/test-chmtime: skip directories on Windows Jeff Hostetler via GitGitGadget
2022-03-22 18:00             ` [PATCH v7 24/29] t/perf/p7519: speed up test " Jeff Hostetler via GitGitGadget
2022-03-22 18:43               ` Ævar Arnfjörð Bjarmason
2022-03-23 16:33                 ` Jeff Hostetler
2022-03-22 18:00             ` [PATCH v7 25/29] t/perf/p7519: add fsmonitor--daemon test cases Jeff Hostetler via GitGitGadget
2022-03-22 18:00             ` [PATCH v7 26/29] fsmonitor--daemon: periodically truncate list of modified files Jeff Hostetler via GitGitGadget
2022-03-22 18:00             ` [PATCH v7 27/29] fsmonitor--daemon: use a cookie file to sync with file system Jeff Hostetler via GitGitGadget
2022-03-22 18:00             ` [PATCH v7 28/29] fsmonitor: force update index after large responses Jeff Hostetler via GitGitGadget
2022-03-22 18:00             ` [PATCH v7 29/29] t7527: test status with untracked-cache and fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-03-24 16:49             ` [PATCH v8 00/30] Builtin FSMonitor Part 2 Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 01/30] fsmonitor: enhance existing comments, clarify trivial response handling Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 02/30] fsmonitor-ipc: create client routines for git-fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 03/30] fsmonitor: config settings are repository-specific Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 04/30] fsmonitor: use IPC to query the builtin FSMonitor daemon Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 05/30] fsmonitor: document builtin fsmonitor Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 06/30] fsmonitor--daemon: add a built-in fsmonitor daemon Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 07/30] fsmonitor--daemon: implement 'stop' and 'status' commands Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 08/30] compat/fsmonitor/fsm-listen-win32: stub in backend for Windows Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 09/30] compat/fsmonitor/fsm-listen-darwin: stub in backend for Darwin Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 10/30] fsmonitor--daemon: implement 'run' command Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 11/30] fsmonitor--daemon: implement 'start' command Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 12/30] fsmonitor--daemon: add pathname classification Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 13/30] fsmonitor--daemon: define token-ids Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 14/30] fsmonitor--daemon: create token-based changed path cache Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 15/30] compat/fsmonitor/fsm-listen-win32: implement FSMonitor backend on Windows Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 16/30] compat/fsmonitor/fsm-listen-darwin: add MacOS header files for FSEvent Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 17/30] compat/fsmonitor/fsm-listen-darwin: implement FSEvent listener on MacOS Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 18/30] fsmonitor--daemon: implement handle_client callback Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 19/30] help: include fsmonitor--daemon feature flag in version info Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 20/30] t/helper/fsmonitor-client: create IPC client to talk to FSMonitor Daemon Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 21/30] t7527: create test for fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-03-24 18:59                 ` Junio C Hamano
2022-03-24 19:05                   ` rsbecker
2022-03-24 20:27                     ` Jeff Hostetler
2022-03-24 20:36                       ` rsbecker
2022-03-24 20:42                         ` Jeff Hostetler
2022-03-24 20:46                           ` rsbecker
2022-03-24 20:51                             ` Jeff Hostetler
2022-03-24 20:45                   ` Jeff Hostetler
2022-03-24 16:49               ` [PATCH v8 22/30] t/perf: avoid copying builtin fsmonitor files into test repo Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 23/30] t/helper/test-chmtime: skip directories on Windows Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 24/30] t/perf/p7519: fix coding style Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 25/30] t/perf/p7519: speed up test on Windows Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 26/30] t/perf/p7519: add fsmonitor--daemon test cases Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 27/30] fsmonitor--daemon: periodically truncate list of modified files Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 28/30] fsmonitor--daemon: use a cookie file to sync with file system Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 29/30] fsmonitor: force update index after large responses Jeff Hostetler via GitGitGadget
2022-03-24 16:49               ` [PATCH v8 30/30] t7527: test status with untracked-cache and fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-03-25 18:02               ` [PATCH v9 00/30] Builtin FSMonitor Part 2 Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 01/30] fsmonitor: enhance existing comments, clarify trivial response handling Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 02/30] fsmonitor-ipc: create client routines for git-fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 03/30] fsmonitor: config settings are repository-specific Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 04/30] fsmonitor: use IPC to query the builtin FSMonitor daemon Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 05/30] fsmonitor: document builtin fsmonitor Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 06/30] fsmonitor--daemon: add a built-in fsmonitor daemon Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 07/30] fsmonitor--daemon: implement 'stop' and 'status' commands Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 08/30] compat/fsmonitor/fsm-listen-win32: stub in backend for Windows Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 09/30] compat/fsmonitor/fsm-listen-darwin: stub in backend for Darwin Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 10/30] fsmonitor--daemon: implement 'run' command Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 11/30] fsmonitor--daemon: implement 'start' command Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 12/30] fsmonitor--daemon: add pathname classification Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 13/30] fsmonitor--daemon: define token-ids Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 14/30] fsmonitor--daemon: create token-based changed path cache Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 15/30] compat/fsmonitor/fsm-listen-win32: implement FSMonitor backend on Windows Jeff Hostetler via GitGitGadget
2022-03-25 18:02                 ` [PATCH v9 16/30] compat/fsmonitor/fsm-listen-darwin: add MacOS header files for FSEvent Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 17/30] compat/fsmonitor/fsm-listen-darwin: implement FSEvent listener on MacOS Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 18/30] fsmonitor--daemon: implement handle_client callback Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 19/30] help: include fsmonitor--daemon feature flag in version info Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 20/30] t/helper/fsmonitor-client: create IPC client to talk to FSMonitor Daemon Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 21/30] t7527: create test for fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 22/30] t/perf: avoid copying builtin fsmonitor files into test repo Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 23/30] t/helper/test-chmtime: skip directories on Windows Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 24/30] t/perf/p7519: fix coding style Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 25/30] t/perf/p7519: speed up test on Windows Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 26/30] t/perf/p7519: add fsmonitor--daemon test cases Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 27/30] fsmonitor--daemon: periodically truncate list of modified files Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 28/30] fsmonitor--daemon: use a cookie file to sync with file system Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 29/30] fsmonitor: force update index after large responses Jeff Hostetler via GitGitGadget
2022-03-25 18:03                 ` [PATCH v9 30/30] t7527: test status with untracked-cache and fsmonitor--daemon Jeff Hostetler via GitGitGadget
2022-03-25 19:02                 ` [PATCH v9 00/30] Builtin FSMonitor Part 2 rsbecker
2022-03-25 20:12                   ` Jeff Hostetler
2022-03-26  0:48                     ` Ævar Arnfjörð Bjarmason
2022-03-28 16:27                       ` Jeff Hostetler
2022-03-25 23:09                 ` Junio C Hamano
2022-03-28 15:17                   ` Jeff Hostetler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=pull.1041.v7.git.1647972010.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=avarab@gmail.com \
    --cc=bagasdotme@gmail.com \
    --cc=git@jeffhostetler.com \
    --cc=git@vger.kernel.org \
    --cc=jeffhost@microsoft.com \
    --cc=sunshine@sunshineco.com \
    --cc=tao@klerks.biz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.