git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 00/27] Builtin FSMonitor Part 3

From
JGJeff Hostetler via GitGitGadget <gitgitgadget@gmail.com>
Date
Mar 22, 2022, 18:22 UTC
Message-ID
<pull.1143.v3.git.1647973380.gitgitgadget@gmail.com>
In-Reply-To
<pull.1143.v2.git.1646777727.gitgitgadget@gmail.com>
Here is V3 of Part 3 of my builtin FSMonitor series.

I have addressed all of the feedback from Part 3 V2 and the mess that was Part 2.5 (now obsolete). This version builds upon the new V7 of Part 2 (which includes 2.5).

This version includes: (1) fixup a few more "_()" calls in die() and error() messages. (2) refactor how fsmonitor incompatibility error messages are formatted (3) make use of new "start_daemon()" function t7527 to reduce duplicated code. (4) improve documentation around Unicode/UTF8 testing on MacOS.

Here is the range-diff from V2 to V3:
 1:  34619e0652 !  1:  779a15b38e fsm-listen-win32: handle shortnames
    @@ compat/fsmonitor/fsm-listen-win32.c: static int normalize_path_in_utf8(FILE_NOTI
     @@ compat/fsmonitor/fsm-listen-win32.c: static int normalize_path_in_utf8(FILE_NOTIFY_INFORMATION *info,
                  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);
    @@ t/t7527-builtin-fsmonitor.sh: test_expect_success 'implicit daemon stop (rename
     +
     +    git init test_implicit_1s &&
     +
    -+    start_daemon test_implicit_1s &&
    ++    start_daemon -C test_implicit_1s &&
     +
     +    # renaming the .git directory will implicitly stop the daemon.
     +    # this moves {.git, GIT~1} to {.gitxyz, GITXYZ~1}.
    @@ t/t7527-builtin-fsmonitor.sh: test_expect_success 'implicit daemon stop (rename
     +    test_path_is_file test_implicit_1s2/GIT~1 &&
     +    test_path_is_dir  test_implicit_1s2/GIT~2 &&
     +
    -+    start_daemon test_implicit_1s2 &&
    ++    start_daemon -C test_implicit_1s2 &&
     +
     +    # renaming the .git directory will implicitly stop the daemon.
     +    # the rename-from FS Event will contain the shortname.
 2:  3a0f30b849 !  2:  11d4a17b69 t7527: test FSMonitor on repos with Unicode root paths
    @@ t/t7527-builtin-fsmonitor.sh: do
     +        git -C "$u" add file1 &&
     +        git -C "$u" config core.fsmonitor true &&
     +
    -+        start_daemon "$u" &&
    ++        start_daemon -C "$u" &&
     +        git -C "$u" status >actual &&
     +        grep "new file:   file1" actual
     +    '
 3:  87d1c0b6f2 !  3:  901fa32f6e t/helper/fsmonitor-client: create stress test
    @@ t/helper/test-fsmonitor-client.c: static int do_send_flush(void)
     +    int nr_requests = 1;
      
          const char * const fsmonitor_client_usage[] = {
    -         N_("test-helper fsmonitor-client query [<token>]"),
    -         N_("test-helper fsmonitor-client flush"),
    -+        N_("test-helper fsmonitor-client hammer [<token>] [<threads>] [<requests>]"),
    +         "test-tool fsmonitor-client query [<token>]",
    +         "test-tool fsmonitor-client flush",
    ++        "test-tool fsmonitor-client hammer [<token>] [<threads>] [<requests>]",
              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_INTEGER(0, "threads", &nr_threads, N_("number of client threads")),
    -+        OPT_INTEGER(0, "requests", &nr_requests, N_("number of requests per thread")),
    ++        OPT_INTEGER(0, "threads", &nr_threads, "number of client threads"),
    ++        OPT_INTEGER(0, "requests", &nr_requests, "number of requests per thread"),
     +
              OPT_END()
          };
 4:  8c4f90ae4f !  4:  a8f0b2a525 fsmonitor-settings: bare repos are incompatible with FSMonitor
    @@ builtin/fsmonitor--daemon.c: int cmd_fsmonitor__daemon(int argc, const char **ar
     +    prepare_repo_settings(the_repository);
     +    fsm_settings__set_ipc(the_repository);
     +
    -+    if (fsm_settings__get_mode(the_repository) == FSMONITOR_MODE_INCOMPATIBLE) {
    -+        const char *msg = fsm_settings__get_reason_msg(the_repository);
    -+
    -+        return error("%s '%s'", msg ? msg : "???", xgetcwd());
    -+    }
    ++    if (fsm_settings__error_if_incompatible(the_repository))
    ++        return 1;
     +
          if (!strcmp(subcmd, "start"))
              return !!try_to_start_background_daemon();
    @@ builtin/update-index.c: int cmd_update_index(int argc, const char **argv, const
          if (fsmonitor > 0) {
              enum fsmonitor_mode fsm_mode = fsm_settings__get_mode(r);
     +
    -+        if (fsm_mode == FSMONITOR_MODE_INCOMPATIBLE) {
    -+            const char *msg = fsm_settings__get_reason_msg(r);
    -+
    -+            return error("%s '%s'", msg ? msg : "???", xgetcwd());
    -+        }
    ++        if (fsm_settings__error_if_incompatible(the_repository))
    ++            return 1;
     +
              if (fsm_mode == FSMONITOR_MODE_DISABLED) {
    -             advise(_("core.fsmonitor is unset; "
    -                  "set it if you really want to "
    +             warning(_("core.fsmonitor is unset; "
    +                 "set it if you really want to "
     
      ## fsmonitor-settings.c ##
     @@
    @@ fsmonitor-settings.c
      static void lookup_fsmonitor_settings(struct repository *r)
      {
          struct fsmonitor_settings *s;
    +@@ fsmonitor-settings.c: static void lookup_fsmonitor_settings(struct repository *r)
    + 
    +     CALLOC_ARRAY(s, 1);
    +     s->mode = FSMONITOR_MODE_DISABLED;
    ++    s->reason = FSMONITOR_REASON_OK;
    + 
    +     r->settings.fsmonitor = s;
    + 
     @@ fsmonitor-settings.c: void fsm_settings__set_ipc(struct repository *r)
      
          lookup_fsmonitor_settings(r);
    @@ fsmonitor-settings.c: void fsm_settings__set_disabled(struct repository *r)
     +    return r->settings.fsmonitor->reason;
     +}
     +
    -+const char *fsm_settings__get_reason_msg(struct repository *r)
    ++int fsm_settings__error_if_incompatible(struct repository *r)
     +{
     +    enum fsmonitor_reason reason = fsm_settings__get_reason(r);
     +
     +    switch (reason) {
     +    case FSMONITOR_REASON_OK:
    -+        return NULL;
    ++        return 0;
     +
     +    case FSMONITOR_REASON_BARE:
    -+        return _("bare repos are incompatible with fsmonitor");
    ++        error(_("bare repository '%s' is incompatible with fsmonitor"),
    ++              xgetcwd());
    ++        return 1;
     +    }
     +
    -+    BUG("Unhandled case in fsm_settings__get_reason_msg '%d'",
    ++    BUG("Unhandled case in fsm_settings__error_if_incompatible: '%d'",
     +        reason);
     +}
     
    @@ fsmonitor-settings.h: void fsm_settings__set_disabled(struct repository *r);
      const char *fsm_settings__get_hook_path(struct repository *r);
      
     +enum fsmonitor_reason fsm_settings__get_reason(struct repository *r);
    -+const char *fsm_settings__get_reason_msg(struct repository *r);
    ++int fsm_settings__error_if_incompatible(struct repository *r);
     +
      struct fsmonitor_settings;
      
    @@ t/t7519-status-fsmonitor.sh: test_lazy_prereq UNTRACKED_CACHE '
     +    test_must_fail \
     +        git -C ./bare-clone -c core.fsmonitor=foo \
     +            update-index --fsmonitor 2>actual &&
    -+    grep "bare repos are incompatible with fsmonitor" actual &&
    ++    grep "bare repository .* is incompatible with fsmonitor" actual &&
     +
     +    test_must_fail \
     +        git -C ./bare-clone -c core.fsmonitor=true \
     +            update-index --fsmonitor 2>actual &&
    -+    grep "bare repos are incompatible with fsmonitor" actual
    ++    grep "bare repository .* is incompatible with fsmonitor" actual
     +'
     +
     +test_expect_success FSMONITOR_DAEMON 'run fsmonitor-daemon in bare repo' '
     +    test_when_finished "rm -rf ./bare-clone actual" &&
     +    git init --bare bare-clone &&
     +    test_must_fail git -C ./bare-clone fsmonitor--daemon run 2>actual &&
    -+    grep "bare repos are incompatible with fsmonitor" actual
    ++    grep "bare repository .* is incompatible with fsmonitor" actual
     +'
     +
      test_expect_success 'setup' '
 5:  6329328d18 !  5:  e32a8a7ea7 fsmonitor-settings: stub in platform-specific incompatibility checking
    @@ Metadata
     Author: Jeff Hostetler <jeffhost@microsoft.com>
     
      ## Commit message ##
    -    fsmonitor-settings: stub in platform-specific incompatibility checking
    +    fsmonitor-settings: stub in Win32-specific incompatibility checking
     
         Extend generic incompatibility checkout with platform-specific
         mechanism.  Stub in Win32 version.
    @@ fsmonitor-settings.c: static int check_for_incompatible(struct repository *r)
      
     
      ## fsmonitor-settings.h ##
    -@@ fsmonitor-settings.h: const char *fsm_settings__get_reason_msg(struct repository *r);
    +@@ fsmonitor-settings.h: int fsm_settings__error_if_incompatible(struct repository *r);
      
      struct fsmonitor_settings;
      
 6:  fa9e86e7de !  6:  5546339d96 fsmonitor-settings: VFS for Git virtual repos are incompatible
    @@ compat/fsmonitor/fsm-settings-win32.c
      }
     
      ## fsmonitor-settings.c ##
    -@@ fsmonitor-settings.c: const char *fsm_settings__get_reason_msg(struct repository *r)
    - 
    -     case FSMONITOR_REASON_BARE:
    -         return _("bare repos are incompatible with fsmonitor");
    +@@ fsmonitor-settings.c: int fsm_settings__error_if_incompatible(struct repository *r)
    +         error(_("bare repository '%s' is incompatible with fsmonitor"),
    +               xgetcwd());
    +         return 1;
     +
     +    case FSMONITOR_REASON_VFS4GIT:
    -+        return _("virtual repos are incompatible with fsmonitor");
    ++        error(_("virtual repository '%s' is incompatible with fsmonitor"),
    ++              r->worktree);
    ++        return 1;
          }
      
    -     BUG("Unhandled case in fsm_settings__get_reason_msg '%d'",
    +     BUG("Unhandled case in fsm_settings__error_if_incompatible: '%d'",
     
      ## fsmonitor-settings.h ##
     @@ fsmonitor-settings.h: enum fsmonitor_mode {
    @@ fsmonitor-settings.h: enum fsmonitor_mode {
     
      ## t/t7519-status-fsmonitor.sh ##
     @@ t/t7519-status-fsmonitor.sh: test_expect_success FSMONITOR_DAEMON 'run fsmonitor-daemon in bare repo' '
    -     grep "bare repos are incompatible with fsmonitor" actual
    +     grep "bare repository .* is incompatible with fsmonitor" actual
      '
      
     +test_expect_success MINGW,FSMONITOR_DAEMON 'run fsmonitor-daemon in virtual repo' '
    @@ t/t7519-status-fsmonitor.sh: test_expect_success FSMONITOR_DAEMON 'run fsmonitor
     +    test_must_fail git -C ./fake-virtual-clone \
     +               -c core.virtualfilesystem=true \
     +               fsmonitor--daemon run 2>actual &&
    -+    grep "virtual repos are incompatible with fsmonitor" actual
    ++    grep "virtual repository .* is incompatible with fsmonitor" actual
     +'
     +
      test_expect_success 'setup' '
 7:  c180241041 =  7:  1d2877efda fsmonitor-settings: stub in macOS-specific incompatibility checking
 8:  e3bfa0bd69 !  8:  06d7f18676 fsmonitor-settings: remote repos on macOS are incompatible
    @@ compat/fsmonitor/fsm-settings-darwin.c
      }
     
      ## fsmonitor-settings.c ##
    -@@ fsmonitor-settings.c: const char *fsm_settings__get_reason_msg(struct repository *r)
    -     case FSMONITOR_REASON_BARE:
    -         return _("bare repos are incompatible with fsmonitor");
    +@@ fsmonitor-settings.c: int fsm_settings__error_if_incompatible(struct repository *r)
    +               xgetcwd());
    +         return 1;
      
     +    case FSMONITOR_REASON_ERROR:
    -+        return _("repo incompatible with fsmonitor due to errors");
    ++        error(_("repository '%s' is incompatible with fsmonitor due to errors"),
    ++              r->worktree);
    ++        return 1;
     +
     +    case FSMONITOR_REASON_REMOTE:
    -+        return _("remote repos are incompatible with fsmonitor");
    ++        error(_("remote repository '%s' is incompatible with fsmonitor"),
    ++              r->worktree);
    ++        return 1;
     +
          case FSMONITOR_REASON_VFS4GIT:
    -         return _("virtual repos are incompatible with fsmonitor");
    -     }
    +         error(_("virtual repository '%s' is incompatible with fsmonitor"),
    +               r->worktree);
     
      ## fsmonitor-settings.h ##
     @@ fsmonitor-settings.h: enum fsmonitor_mode {
 9:  e32da3118f =  9:  5ca97f482d fsmonitor-settings: remote repos on Windows are incompatible
27:  e3e01677d9 ! 10:  6715143724 fsmonitor-settings: NTFS and FAT32 on MacOS are incompatible
    @@ compat/fsmonitor/fsm-settings-darwin.c: enum fsmonitor_reason fsm_os__incompatib
      
     
      ## fsmonitor-settings.c ##
    -@@ fsmonitor-settings.c: const char *fsm_settings__get_reason_msg(struct repository *r)
    - 
    -     case FSMONITOR_REASON_VFS4GIT:
    -         return _("virtual repos are incompatible with fsmonitor");
    +@@ fsmonitor-settings.c: int fsm_settings__error_if_incompatible(struct repository *r)
    +         error(_("virtual repository '%s' is incompatible with fsmonitor"),
    +               r->worktree);
    +         return 1;
     +
     +    case FSMONITOR_REASON_NOSOCKETS:
    -+        return _("repo filesystem does not support Unix sockets");
    ++        error(_("repository '%s' is incompatible with fsmonitor due to lack of Unix sockets"),
    ++              r->worktree);
    ++        return 1;
          }
      
    -     BUG("Unhandled case in fsm_settings__get_reason_msg '%d'",
    +     BUG("Unhandled case in fsm_settings__error_if_incompatible: '%d'",
     
      ## fsmonitor-settings.h ##
     @@ fsmonitor-settings.h: enum fsmonitor_reason {
10:  f63de4eda3 = 11:  ed1f723130 unpack-trees: initialize fsmonitor_has_run_once in o->result
11:  fe305f5f28 = 12:  35c77b854b fsm-listen-darwin: ignore FSEvents caused by xattr changes on macOS
12:  c8f3e251b1 ! 13:  a5affb359c fsmonitor--daemon: cd out of worktree root
    @@ builtin/fsmonitor--daemon.c: static int fsmonitor_run_daemon(void)
     +     */
     +    home = getenv("HOME");
     +    if (home && *home && chdir(home))
    -+        die_errno("could not cd home '%s'", home);
    ++        die_errno(_("could not cd home '%s'"), home);
     +
          err = fsmonitor_run_daemon_1(&state);
      
    @@ compat/fsmonitor/fsm-listen-win32.c: static int recv_rdcw_watch(struct one_watch
     +     * Shutdown if we get any error.
           */
      
    -     error("GetOverlappedResult failed on '%s' [GLE %ld]",
    +     error(_("GetOverlappedResult failed on '%s' [GLE %ld]"),
     
      ## fsmonitor--daemon.h ##
     @@ fsmonitor--daemon.h: struct fsmonitor_daemon_state {
13:  71673be2da = 14:  087af5dfb6 fsmonitor--daemon: prepare for adding health thread
14:  5387baaf5d ! 15:  e78eb20c1b fsmonitor--daemon: rename listener thread related variables
    @@ builtin/fsmonitor--daemon.c: static int fsmonitor_run_daemon(void)
          /* Prepare to (recursively) watch the <worktree-root> directory. */
     
      ## compat/fsmonitor/fsm-listen-darwin.c ##
    -@@ compat/fsmonitor/fsm-listen-darwin.c: void FSEventStreamRelease(FSEventStreamRef stream);
    +@@
      #include "fsm-listen.h"
      #include "fsmonitor--daemon.h"
      
    @@ compat/fsmonitor/fsm-listen-darwin.c: int fsm_listen__ctor(struct fsmonitor_daem
              NULL, state->path_worktree_watch.buf, kCFStringEncodingUTF8);
     @@ compat/fsmonitor/fsm-listen-darwin.c: int fsm_listen__ctor(struct fsmonitor_daemon_state *state)
      failed:
    -     error("Unable to create FSEventStream.");
    +     error(_("Unable to create FSEventStream."));
      
     -    FREE_AND_NULL(state->backend_data);
     +    FREE_AND_NULL(state->listen_data);
15:  f78e4ad87c = 16:  301fff5296 fsmonitor--daemon: stub in health thread
16:  bb72f911a0 = 17:  c6b5bdd25e fsm-health-win32: add polling framework to monitor daemon health
17:  baf8c031a9 ! 18:  13d11713a8 fsm-health-win32: force shutdown daemon if worktree root moves
    @@ compat/fsmonitor/fsm-health-win32.c: struct fsm_health_data
     +        return 0;
     +
     +    default:
    -+        die("unhandled case in 'has_worktree_moved': %d",
    ++        die(_("unhandled case in 'has_worktree_moved': %d"),
     +            (int)ctx);
     +    }
     +
18:  796b659139 = 19:  01c1a38c46 fsm-listen-darwin: shutdown daemon if worktree root is moved/renamed
19:  2459192087 = 20:  0f0a5b5ca1 fsmonitor: optimize processing of directory events
20:  06a3241385 ! 21:  d8218d197a t7527: FSMonitor tests for directory moves
    @@ t/t7527-builtin-fsmonitor.sh: test_expect_success 'setup' '
          git -c core.fsmonitor=false add . &&
          test_tick &&
          git -c core.fsmonitor=false commit -m initial &&
    -@@ t/t7527-builtin-fsmonitor.sh: verify_status () {
    -     echo HELLO AFTER
    +@@ t/t7527-builtin-fsmonitor.sh: directory_to_file () {
    +     echo 1 >dir1
      }
      
     +move_directory_contents_deeper() {
    -+    mkdir T1/_new_
    ++    mkdir T1/_new_ &&
     +    mv T1/[A-Z]* T1/_new_
     +}
     +
21:  4b59013cad = 22:  79da369dcc t/perf/p7527: add perf test for builtin FSMonitor
22:  524d449ed6 ! 23:  4ab4306ada fsmonitor: never set CE_FSMONITOR_VALID on submodules
    @@ t/t7527-builtin-fsmonitor.sh: do
     +    git -C super submodule add ../sub ./dir_1/dir_2/sub &&
     +    git -C super commit -m "add sub" &&
     +
    -+    start_daemon super &&
    ++    start_daemon -C super &&
     +    git -C super config core.fsmonitor true &&
     +    git -C super update-index --fsmonitor &&
     +    git -C super status &&
23:  c7264decaf ! 24:  5d0fa19929 t7527: test FSMonitor on case insensitive+preserving file system
    @@ t/t7527-builtin-fsmonitor.sh: test_expect_success "Submodule" '
     +#    test_when_finished "stop_daemon_delete_repo test_insensitive" &&
     +
     +    git init test_insensitive &&
    -+    (
    -+        GIT_TRACE_FSMONITOR="$(pwd)/insensitive.trace" &&
    -+        export GIT_TRACE_FSMONITOR &&
     +
    -+        start_daemon test_insensitive
    -+    ) &&
    ++    start_daemon -C test_insensitive -tf "$PWD/insensitive.trace" &&
     +
     +    mkdir -p test_insensitive/abc/def &&
     +    echo xyz >test_insensitive/ABC/DEF/xyz &&
24:  95b9d4210d = 25:  264397e8bd fsmonitor: on macOS also emit NFC spelling for NFD pathname
25:  5a0c1b7a28 ! 26:  e6b621fb76 t/lib-unicode-nfc-nfd: helper prereqs for testing unicode nfc/nfd
    @@ t/lib-unicode-nfc-nfd.sh (new)
     +    ls | od -t x1 | grep "64 *5f *cf *89 *cc *94 *cd *82"
     +'
     +
    -+if test $unicode_debug = 1
    ++# The following is for debugging. I found it useful when
    ++# trying to understand the various (OS, FS) quirks WRT
    ++# Unicode and how composition/decomposition is handled.
    ++# For example, when trying to understand how (macOS, APFS)
    ++# and (macOS, HFS) and (macOS, FAT32) compare.
    ++#
    ++# It is rather noisy, so it is disabled by default.
    ++#
    ++if test "$unicode_debug" = "true"
     +then
     +    if test_have_prereq UNICODE_COMPOSITION_SENSITIVE
     +    then
26:  a45c1fd300 ! 27:  aa96a849ce t7527: test Unicode NFC/NFD handling on MacOS
    @@ t/t7527-builtin-fsmonitor.sh: test_expect_success CASE_INSENSITIVE_FS 'case inse
          egrep "^event: abc/def/xyz$" ./insensitive.trace
      '
      
    -+unicode_debug=0
    ++# The variable "unicode_debug" is defined in the following library
    ++# script to dump information about how the (OS, FS) handles Unicode
    ++# composition.  Uncomment the following line if you want to enable it.
    ++#
    ++# unicode_debug=true
    ++
     +. "$TEST_DIRECTORY/lib-unicode-nfc-nfd.sh"
     +
     +# See if the OS or filesystem does NFC/NFD aliasing/munging.
    @@ t/t7527-builtin-fsmonitor.sh: test_expect_success CASE_INSENSITIVE_FS 'case inse
     +    test_when_finished "stop_daemon_delete_repo test_unicode" &&
     +
     +    git init test_unicode &&
    -+    (
    -+        GIT_TRACE_FSMONITOR="$(pwd)/unicode.trace" &&
    -+        export GIT_TRACE_FSMONITOR &&
     +
    -+        start_daemon test_unicode
    -+    ) &&
    ++    start_daemon -C test_unicode -tf "$PWD/unicode.trace" &&
     +
     +    # Create a directory using an NFC spelling.
     +    #
Jeff Hostetler (27):
  fsm-listen-win32: handle shortnames
  t7527: test FSMonitor on repos with Unicode root paths
  t/helper/fsmonitor-client: create stress test
  fsmonitor-settings: bare repos are incompatible with FSMonitor
  fsmonitor-settings: stub in Win32-specific incompatibility checking
  fsmonitor-settings: VFS for Git virtual repos are incompatible
  fsmonitor-settings: stub in macOS-specific incompatibility checking
  fsmonitor-settings: remote repos on macOS are incompatible
  fsmonitor-settings: remote repos on Windows are incompatible
  fsmonitor-settings: NTFS and FAT32 on MacOS are incompatible
  unpack-trees: initialize fsmonitor_has_run_once in o->result
  fsm-listen-darwin: ignore FSEvents caused by xattr changes on macOS
  fsmonitor--daemon: cd out of worktree root
  fsmonitor--daemon: prepare for adding health thread
  fsmonitor--daemon: rename listener thread related variables
  fsmonitor--daemon: stub in health thread
  fsm-health-win32: add polling framework to monitor daemon health
  fsm-health-win32: force shutdown daemon if worktree root moves
  fsm-listen-darwin: shutdown daemon if worktree root is moved/renamed
  fsmonitor: optimize processing of directory events
  t7527: FSMonitor tests for directory moves
  t/perf/p7527: add perf test for builtin FSMonitor
  fsmonitor: never set CE_FSMONITOR_VALID on submodules
  t7527: test FSMonitor on case insensitive+preserving file system
  fsmonitor: on macOS also emit NFC spelling for NFD pathname
  t/lib-unicode-nfc-nfd: helper prereqs for testing unicode nfc/nfd
  t7527: test Unicode NFC/NFD handling on MacOS
 Makefile                               |  19 +-
 builtin/fsmonitor--daemon.c            | 104 ++++++-
 builtin/update-index.c                 |   4 +
 compat/fsmonitor/fsm-health-darwin.c   |  24 ++
 compat/fsmonitor/fsm-health-win32.c    | 278 +++++++++++++++++
 compat/fsmonitor/fsm-health.h          |  47 +++
 compat/fsmonitor/fsm-listen-darwin.c   | 122 ++++++--
 compat/fsmonitor/fsm-listen-win32.c    | 413 ++++++++++++++++++++-----
 compat/fsmonitor/fsm-listen.h          |   2 +-
 compat/fsmonitor/fsm-settings-darwin.c |  89 ++++++
 compat/fsmonitor/fsm-settings-win32.c  | 137 ++++++++
 config.mak.uname                       |   5 +
 contrib/buildsystems/CMakeLists.txt    |   8 +
 fsmonitor--daemon.h                    |  11 +-
 fsmonitor-settings.c                   |  92 ++++++
 fsmonitor-settings.h                   |  29 ++
 fsmonitor.c                            |  73 ++++-
 fsmonitor.h                            |  11 +
 t/helper/test-fsmonitor-client.c       | 106 +++++++
 t/lib-unicode-nfc-nfd.sh               | 167 ++++++++++
 t/perf/p7527-builtin-fsmonitor.sh      | 257 +++++++++++++++
 t/t7519-status-fsmonitor.sh            |  32 ++
 t/t7527-builtin-fsmonitor.sh           | 311 +++++++++++++++++++
 unpack-trees.c                         |   1 +
 24 files changed, 2218 insertions(+), 124 deletions(-)
 create mode 100644 compat/fsmonitor/fsm-health-darwin.c
 create mode 100644 compat/fsmonitor/fsm-health-win32.c
 create mode 100644 compat/fsmonitor/fsm-health.h
 create mode 100644 compat/fsmonitor/fsm-settings-darwin.c
 create mode 100644 compat/fsmonitor/fsm-settings-win32.c
 create mode 100755 t/lib-unicode-nfc-nfd.sh
 create mode 100755 t/perf/p7527-builtin-fsmonitor.sh
base-commit: e6cf84dc8eb4933220187849b84e5cb96cda185f
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1143%2Fjeffhostetler%2Fbuiltin-fsmonitor-part3-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1143/jeffhostetler/builtin-fsmonitor-part3-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/1143
Range-diff vs v2:
  1:  34619e0652b !  1:  779a15b38e8 fsm-listen-win32: handle shortnames
     @@ compat/fsmonitor/fsm-listen-win32.c: static int normalize_path_in_utf8(FILE_NOTI
      @@ compat/fsmonitor/fsm-listen-win32.c: static int normalize_path_in_utf8(FILE_NOTIFY_INFORMATION *info,
       			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);
     @@ t/t7527-builtin-fsmonitor.sh: test_expect_success 'implicit daemon stop (rename
      +
      +	git init test_implicit_1s &&
      +
     -+	start_daemon test_implicit_1s &&
     ++	start_daemon -C test_implicit_1s &&
      +
      +	# renaming the .git directory will implicitly stop the daemon.
      +	# this moves {.git, GIT~1} to {.gitxyz, GITXYZ~1}.
     @@ t/t7527-builtin-fsmonitor.sh: test_expect_success 'implicit daemon stop (rename
      +	test_path_is_file test_implicit_1s2/GIT~1 &&
      +	test_path_is_dir  test_implicit_1s2/GIT~2 &&
      +
     -+	start_daemon test_implicit_1s2 &&
     ++	start_daemon -C test_implicit_1s2 &&
      +
      +	# renaming the .git directory will implicitly stop the daemon.
      +	# the rename-from FS Event will contain the shortname.
  2:  3a0f30b849a !  2:  11d4a17b692 t7527: test FSMonitor on repos with Unicode root paths
     @@ t/t7527-builtin-fsmonitor.sh: do
      +		git -C "$u" add file1 &&
      +		git -C "$u" config core.fsmonitor true &&
      +
     -+		start_daemon "$u" &&
     ++		start_daemon -C "$u" &&
      +		git -C "$u" status >actual &&
      +		grep "new file:   file1" actual
      +	'
  3:  87d1c0b6f2a !  3:  901fa32f6ea t/helper/fsmonitor-client: create stress test
     @@ t/helper/test-fsmonitor-client.c: static int do_send_flush(void)
      +	int nr_requests = 1;
       
       	const char * const fsmonitor_client_usage[] = {
     - 		N_("test-helper fsmonitor-client query [<token>]"),
     - 		N_("test-helper fsmonitor-client flush"),
     -+		N_("test-helper fsmonitor-client hammer [<token>] [<threads>] [<requests>]"),
     + 		"test-tool fsmonitor-client query [<token>]",
     + 		"test-tool fsmonitor-client flush",
     ++		"test-tool fsmonitor-client hammer [<token>] [<threads>] [<requests>]",
       		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_INTEGER(0, "threads", &nr_threads, N_("number of client threads")),
     -+		OPT_INTEGER(0, "requests", &nr_requests, N_("number of requests per thread")),
     ++		OPT_INTEGER(0, "threads", &nr_threads, "number of client threads"),
     ++		OPT_INTEGER(0, "requests", &nr_requests, "number of requests per thread"),
      +
       		OPT_END()
       	};
  4:  8c4f90ae4fd !  4:  a8f0b2a5256 fsmonitor-settings: bare repos are incompatible with FSMonitor
     @@ builtin/fsmonitor--daemon.c: int cmd_fsmonitor__daemon(int argc, const char **ar
      +	prepare_repo_settings(the_repository);
      +	fsm_settings__set_ipc(the_repository);
      +
     -+	if (fsm_settings__get_mode(the_repository) == FSMONITOR_MODE_INCOMPATIBLE) {
     -+		const char *msg = fsm_settings__get_reason_msg(the_repository);
     -+
     -+		return error("%s '%s'", msg ? msg : "???", xgetcwd());
     -+	}
     ++	if (fsm_settings__error_if_incompatible(the_repository))
     ++		return 1;
      +
       	if (!strcmp(subcmd, "start"))
       		return !!try_to_start_background_daemon();
     @@ builtin/update-index.c: int cmd_update_index(int argc, const char **argv, const
       	if (fsmonitor > 0) {
       		enum fsmonitor_mode fsm_mode = fsm_settings__get_mode(r);
      +
     -+		if (fsm_mode == FSMONITOR_MODE_INCOMPATIBLE) {
     -+			const char *msg = fsm_settings__get_reason_msg(r);
     -+
     -+			return error("%s '%s'", msg ? msg : "???", xgetcwd());
     -+		}
     ++		if (fsm_settings__error_if_incompatible(the_repository))
     ++			return 1;
      +
       		if (fsm_mode == FSMONITOR_MODE_DISABLED) {
     - 			advise(_("core.fsmonitor is unset; "
     - 				 "set it if you really want to "
     + 			warning(_("core.fsmonitor is unset; "
     + 				"set it if you really want to "
      
       ## fsmonitor-settings.c ##
      @@
     @@ fsmonitor-settings.c
       static void lookup_fsmonitor_settings(struct repository *r)
       {
       	struct fsmonitor_settings *s;
     +@@ fsmonitor-settings.c: static void lookup_fsmonitor_settings(struct repository *r)
     + 
     + 	CALLOC_ARRAY(s, 1);
     + 	s->mode = FSMONITOR_MODE_DISABLED;
     ++	s->reason = FSMONITOR_REASON_OK;
     + 
     + 	r->settings.fsmonitor = s;
     + 
      @@ fsmonitor-settings.c: void fsm_settings__set_ipc(struct repository *r)
       
       	lookup_fsmonitor_settings(r);
     @@ fsmonitor-settings.c: void fsm_settings__set_disabled(struct repository *r)
      +	return r->settings.fsmonitor->reason;
      +}
      +
     -+const char *fsm_settings__get_reason_msg(struct repository *r)
     ++int fsm_settings__error_if_incompatible(struct repository *r)
      +{
      +	enum fsmonitor_reason reason = fsm_settings__get_reason(r);
      +
      +	switch (reason) {
      +	case FSMONITOR_REASON_OK:
     -+		return NULL;
     ++		return 0;
      +
      +	case FSMONITOR_REASON_BARE:
     -+		return _("bare repos are incompatible with fsmonitor");
     ++		error(_("bare repository '%s' is incompatible with fsmonitor"),
     ++		      xgetcwd());
     ++		return 1;
      +	}
      +
     -+	BUG("Unhandled case in fsm_settings__get_reason_msg '%d'",
     ++	BUG("Unhandled case in fsm_settings__error_if_incompatible: '%d'",
      +	    reason);
      +}
      
     @@ fsmonitor-settings.h: void fsm_settings__set_disabled(struct repository *r);
       const char *fsm_settings__get_hook_path(struct repository *r);
       
      +enum fsmonitor_reason fsm_settings__get_reason(struct repository *r);
     -+const char *fsm_settings__get_reason_msg(struct repository *r);
     ++int fsm_settings__error_if_incompatible(struct repository *r);
      +
       struct fsmonitor_settings;
       
     @@ t/t7519-status-fsmonitor.sh: test_lazy_prereq UNTRACKED_CACHE '
      +	test_must_fail \
      +		git -C ./bare-clone -c core.fsmonitor=foo \
      +			update-index --fsmonitor 2>actual &&
     -+	grep "bare repos are incompatible with fsmonitor" actual &&
     ++	grep "bare repository .* is incompatible with fsmonitor" actual &&
      +
      +	test_must_fail \
      +		git -C ./bare-clone -c core.fsmonitor=true \
      +			update-index --fsmonitor 2>actual &&
     -+	grep "bare repos are incompatible with fsmonitor" actual
     ++	grep "bare repository .* is incompatible with fsmonitor" actual
      +'
      +
      +test_expect_success FSMONITOR_DAEMON 'run fsmonitor-daemon in bare repo' '
      +	test_when_finished "rm -rf ./bare-clone actual" &&
      +	git init --bare bare-clone &&
      +	test_must_fail git -C ./bare-clone fsmonitor--daemon run 2>actual &&
     -+	grep "bare repos are incompatible with fsmonitor" actual
     ++	grep "bare repository .* is incompatible with fsmonitor" actual
      +'
      +
       test_expect_success 'setup' '
  5:  6329328d185 !  5:  e32a8a7ea7a fsmonitor-settings: stub in platform-specific incompatibility checking
     @@ Metadata
      Author: Jeff Hostetler <jeffhost@microsoft.com>
      
       ## Commit message ##
     -    fsmonitor-settings: stub in platform-specific incompatibility checking
     +    fsmonitor-settings: stub in Win32-specific incompatibility checking
      
          Extend generic incompatibility checkout with platform-specific
          mechanism.  Stub in Win32 version.
     @@ fsmonitor-settings.c: static int check_for_incompatible(struct repository *r)
       
      
       ## fsmonitor-settings.h ##
     -@@ fsmonitor-settings.h: const char *fsm_settings__get_reason_msg(struct repository *r);
     +@@ fsmonitor-settings.h: int fsm_settings__error_if_incompatible(struct repository *r);
       
       struct fsmonitor_settings;
       
  6:  fa9e86e7de7 !  6:  5546339d963 fsmonitor-settings: VFS for Git virtual repos are incompatible
     @@ compat/fsmonitor/fsm-settings-win32.c
       }
      
       ## fsmonitor-settings.c ##
     -@@ fsmonitor-settings.c: const char *fsm_settings__get_reason_msg(struct repository *r)
     - 
     - 	case FSMONITOR_REASON_BARE:
     - 		return _("bare repos are incompatible with fsmonitor");
     +@@ fsmonitor-settings.c: int fsm_settings__error_if_incompatible(struct repository *r)
     + 		error(_("bare repository '%s' is incompatible with fsmonitor"),
     + 		      xgetcwd());
     + 		return 1;
      +
      +	case FSMONITOR_REASON_VFS4GIT:
     -+		return _("virtual repos are incompatible with fsmonitor");
     ++		error(_("virtual repository '%s' is incompatible with fsmonitor"),
     ++		      r->worktree);
     ++		return 1;
       	}
       
     - 	BUG("Unhandled case in fsm_settings__get_reason_msg '%d'",
     + 	BUG("Unhandled case in fsm_settings__error_if_incompatible: '%d'",
      
       ## fsmonitor-settings.h ##
      @@ fsmonitor-settings.h: enum fsmonitor_mode {
     @@ fsmonitor-settings.h: enum fsmonitor_mode {
      
       ## t/t7519-status-fsmonitor.sh ##
      @@ t/t7519-status-fsmonitor.sh: test_expect_success FSMONITOR_DAEMON 'run fsmonitor-daemon in bare repo' '
     - 	grep "bare repos are incompatible with fsmonitor" actual
     + 	grep "bare repository .* is incompatible with fsmonitor" actual
       '
       
      +test_expect_success MINGW,FSMONITOR_DAEMON 'run fsmonitor-daemon in virtual repo' '
     @@ t/t7519-status-fsmonitor.sh: test_expect_success FSMONITOR_DAEMON 'run fsmonitor
      +	test_must_fail git -C ./fake-virtual-clone \
      +			   -c core.virtualfilesystem=true \
      +			   fsmonitor--daemon run 2>actual &&
     -+	grep "virtual repos are incompatible with fsmonitor" actual
     ++	grep "virtual repository .* is incompatible with fsmonitor" actual
      +'
      +
       test_expect_success 'setup' '
  7:  c1802410410 =  7:  1d2877efda0 fsmonitor-settings: stub in macOS-specific incompatibility checking
  8:  e3bfa0bd69d !  8:  06d7f18676d fsmonitor-settings: remote repos on macOS are incompatible
     @@ compat/fsmonitor/fsm-settings-darwin.c
       }
      
       ## fsmonitor-settings.c ##
     -@@ fsmonitor-settings.c: const char *fsm_settings__get_reason_msg(struct repository *r)
     - 	case FSMONITOR_REASON_BARE:
     - 		return _("bare repos are incompatible with fsmonitor");
     +@@ fsmonitor-settings.c: int fsm_settings__error_if_incompatible(struct repository *r)
     + 		      xgetcwd());
     + 		return 1;
       
      +	case FSMONITOR_REASON_ERROR:
     -+		return _("repo incompatible with fsmonitor due to errors");
     ++		error(_("repository '%s' is incompatible with fsmonitor due to errors"),
     ++		      r->worktree);
     ++		return 1;
      +
      +	case FSMONITOR_REASON_REMOTE:
     -+		return _("remote repos are incompatible with fsmonitor");
     ++		error(_("remote repository '%s' is incompatible with fsmonitor"),
     ++		      r->worktree);
     ++		return 1;
      +
       	case FSMONITOR_REASON_VFS4GIT:
     - 		return _("virtual repos are incompatible with fsmonitor");
     - 	}
     + 		error(_("virtual repository '%s' is incompatible with fsmonitor"),
     + 		      r->worktree);
      
       ## fsmonitor-settings.h ##
      @@ fsmonitor-settings.h: enum fsmonitor_mode {
  9:  e32da3118fb =  9:  5ca97f482d0 fsmonitor-settings: remote repos on Windows are incompatible
 27:  e3e01677d93 ! 10:  67151437245 fsmonitor-settings: NTFS and FAT32 on MacOS are incompatible
     @@ compat/fsmonitor/fsm-settings-darwin.c: enum fsmonitor_reason fsm_os__incompatib
       
      
       ## fsmonitor-settings.c ##
     -@@ fsmonitor-settings.c: const char *fsm_settings__get_reason_msg(struct repository *r)
     - 
     - 	case FSMONITOR_REASON_VFS4GIT:
     - 		return _("virtual repos are incompatible with fsmonitor");
     +@@ fsmonitor-settings.c: int fsm_settings__error_if_incompatible(struct repository *r)
     + 		error(_("virtual repository '%s' is incompatible with fsmonitor"),
     + 		      r->worktree);
     + 		return 1;
      +
      +	case FSMONITOR_REASON_NOSOCKETS:
     -+		return _("repo filesystem does not support Unix sockets");
     ++		error(_("repository '%s' is incompatible with fsmonitor due to lack of Unix sockets"),
     ++		      r->worktree);
     ++		return 1;
       	}
       
     - 	BUG("Unhandled case in fsm_settings__get_reason_msg '%d'",
     + 	BUG("Unhandled case in fsm_settings__error_if_incompatible: '%d'",
      
       ## fsmonitor-settings.h ##
      @@ fsmonitor-settings.h: enum fsmonitor_reason {
 10:  f63de4eda31 = 11:  ed1f7231309 unpack-trees: initialize fsmonitor_has_run_once in o->result
 11:  fe305f5f287 = 12:  35c77b854bd fsm-listen-darwin: ignore FSEvents caused by xattr changes on macOS
 12:  c8f3e251b1f ! 13:  a5affb359c4 fsmonitor--daemon: cd out of worktree root
     @@ builtin/fsmonitor--daemon.c: static int fsmonitor_run_daemon(void)
      +	 */
      +	home = getenv("HOME");
      +	if (home && *home && chdir(home))
     -+		die_errno("could not cd home '%s'", home);
     ++		die_errno(_("could not cd home '%s'"), home);
      +
       	err = fsmonitor_run_daemon_1(&state);
       
     @@ compat/fsmonitor/fsm-listen-win32.c: static int recv_rdcw_watch(struct one_watch
      +	 * Shutdown if we get any error.
       	 */
       
     - 	error("GetOverlappedResult failed on '%s' [GLE %ld]",
     + 	error(_("GetOverlappedResult failed on '%s' [GLE %ld]"),
      
       ## fsmonitor--daemon.h ##
      @@ fsmonitor--daemon.h: struct fsmonitor_daemon_state {
 13:  71673be2da5 = 14:  087af5dfb63 fsmonitor--daemon: prepare for adding health thread
 14:  5387baaf5d7 ! 15:  e78eb20c1bf fsmonitor--daemon: rename listener thread related variables
     @@ builtin/fsmonitor--daemon.c: static int fsmonitor_run_daemon(void)
       	/* Prepare to (recursively) watch the <worktree-root> directory. */
      
       ## compat/fsmonitor/fsm-listen-darwin.c ##
     -@@ compat/fsmonitor/fsm-listen-darwin.c: void FSEventStreamRelease(FSEventStreamRef stream);
     +@@
       #include "fsm-listen.h"
       #include "fsmonitor--daemon.h"
       
     @@ compat/fsmonitor/fsm-listen-darwin.c: int fsm_listen__ctor(struct fsmonitor_daem
       		NULL, state->path_worktree_watch.buf, kCFStringEncodingUTF8);
      @@ compat/fsmonitor/fsm-listen-darwin.c: int fsm_listen__ctor(struct fsmonitor_daemon_state *state)
       failed:
     - 	error("Unable to create FSEventStream.");
     + 	error(_("Unable to create FSEventStream."));
       
      -	FREE_AND_NULL(state->backend_data);
      +	FREE_AND_NULL(state->listen_data);
 15:  f78e4ad87c0 = 16:  301fff5296a fsmonitor--daemon: stub in health thread
 16:  bb72f911a05 = 17:  c6b5bdd25e4 fsm-health-win32: add polling framework to monitor daemon health
 17:  baf8c031a97 ! 18:  13d11713a86 fsm-health-win32: force shutdown daemon if worktree root moves
     @@ compat/fsmonitor/fsm-health-win32.c: struct fsm_health_data
      +		return 0;
      +
      +	default:
     -+		die("unhandled case in 'has_worktree_moved': %d",
     ++		die(_("unhandled case in 'has_worktree_moved': %d"),
      +		    (int)ctx);
      +	}
      +
 18:  796b6591393 = 19:  01c1a38c462 fsm-listen-darwin: shutdown daemon if worktree root is moved/renamed
 19:  24591920878 = 20:  0f0a5b5ca16 fsmonitor: optimize processing of directory events
 20:  06a32413854 ! 21:  d8218d197ad t7527: FSMonitor tests for directory moves
     @@ t/t7527-builtin-fsmonitor.sh: test_expect_success 'setup' '
       	git -c core.fsmonitor=false add . &&
       	test_tick &&
       	git -c core.fsmonitor=false commit -m initial &&
     -@@ t/t7527-builtin-fsmonitor.sh: verify_status () {
     - 	echo HELLO AFTER
     +@@ t/t7527-builtin-fsmonitor.sh: directory_to_file () {
     + 	echo 1 >dir1
       }
       
      +move_directory_contents_deeper() {
     -+	mkdir T1/_new_
     ++	mkdir T1/_new_ &&
      +	mv T1/[A-Z]* T1/_new_
      +}
      +
 21:  4b59013cadd = 22:  79da369dcce t/perf/p7527: add perf test for builtin FSMonitor
 22:  524d449ed64 ! 23:  4ab4306adab fsmonitor: never set CE_FSMONITOR_VALID on submodules
     @@ t/t7527-builtin-fsmonitor.sh: do
      +	git -C super submodule add ../sub ./dir_1/dir_2/sub &&
      +	git -C super commit -m "add sub" &&
      +
     -+	start_daemon super &&
     ++	start_daemon -C super &&
      +	git -C super config core.fsmonitor true &&
      +	git -C super update-index --fsmonitor &&
      +	git -C super status &&
 23:  c7264decaf6 ! 24:  5d0fa19929d t7527: test FSMonitor on case insensitive+preserving file system
     @@ t/t7527-builtin-fsmonitor.sh: test_expect_success "Submodule" '
      +#	test_when_finished "stop_daemon_delete_repo test_insensitive" &&
      +
      +	git init test_insensitive &&
     -+	(
     -+		GIT_TRACE_FSMONITOR="$(pwd)/insensitive.trace" &&
     -+		export GIT_TRACE_FSMONITOR &&
      +
     -+		start_daemon test_insensitive
     -+	) &&
     ++	start_daemon -C test_insensitive -tf "$PWD/insensitive.trace" &&
      +
      +	mkdir -p test_insensitive/abc/def &&
      +	echo xyz >test_insensitive/ABC/DEF/xyz &&
 24:  95b9d4210d2 = 25:  264397e8bd4 fsmonitor: on macOS also emit NFC spelling for NFD pathname
 25:  5a0c1b7a287 ! 26:  e6b621fb766 t/lib-unicode-nfc-nfd: helper prereqs for testing unicode nfc/nfd
     @@ t/lib-unicode-nfc-nfd.sh (new)
      +	ls | od -t x1 | grep "64 *5f *cf *89 *cc *94 *cd *82"
      +'
      +
     -+if test $unicode_debug = 1
     ++# The following is for debugging. I found it useful when
     ++# trying to understand the various (OS, FS) quirks WRT
     ++# Unicode and how composition/decomposition is handled.
     ++# For example, when trying to understand how (macOS, APFS)
     ++# and (macOS, HFS) and (macOS, FAT32) compare.
     ++#
     ++# It is rather noisy, so it is disabled by default.
     ++#
     ++if test "$unicode_debug" = "true"
      +then
      +	if test_have_prereq UNICODE_COMPOSITION_SENSITIVE
      +	then
 26:  a45c1fd3000 ! 27:  aa96a849ce4 t7527: test Unicode NFC/NFD handling on MacOS
     @@ t/t7527-builtin-fsmonitor.sh: test_expect_success CASE_INSENSITIVE_FS 'case inse
       	egrep "^event: abc/def/xyz$" ./insensitive.trace
       '
       
     -+unicode_debug=0
     ++# The variable "unicode_debug" is defined in the following library
     ++# script to dump information about how the (OS, FS) handles Unicode
     ++# composition.  Uncomment the following line if you want to enable it.
     ++#
     ++# unicode_debug=true
     ++
      +. "$TEST_DIRECTORY/lib-unicode-nfc-nfd.sh"
      +
      +# See if the OS or filesystem does NFC/NFD aliasing/munging.
     @@ t/t7527-builtin-fsmonitor.sh: test_expect_success CASE_INSENSITIVE_FS 'case inse
      +	test_when_finished "stop_daemon_delete_repo test_unicode" &&
      +
      +	git init test_unicode &&
     -+	(
     -+		GIT_TRACE_FSMONITOR="$(pwd)/unicode.trace" &&
     -+		export GIT_TRACE_FSMONITOR &&
      +
     -+		start_daemon test_unicode
     -+	) &&
     ++	start_daemon -C test_unicode -tf "$PWD/unicode.trace" &&
      +
      +	# Create a directory using an NFC spelling.
      +	#
-- 
gitgitgadget
Previous: Jeff HostetlerNext: Jeff Hostetler via GitGitGadget
Message 100 of 345 in “Builtin FSMonitor Part 3”
  1. 00/23 Builtin FSMonitor Part 3Jeff Hostetler via GitGitGadget, Feb 15, 2022
  2. 02/23 t7527: test FS event reporing on macOS WRT case and UnicodeJeff Hostetler via GitGitGadget, Feb 15, 2022
  3. Derrick StoleeFeb 24, 2022
  4. Torsten B��gershausenFeb 24, 2022
  5. Jeff HostetlerMar 4, 2022
  6. Torsten B��gershausenMar 5, 2022
  7. Jeff HostetlerMar 7, 2022
  8. Jeff HostetlerMar 4, 2022
  9. 01/23 fsm-listen-win32: handle shortnamesJeff Hostetler via GitGitGadget, Feb 15, 2022
  10. Derrick StoleeFeb 24, 2022
  11. 03/23 t7527: test builtin FSMonitor watching repos with unicode pathsJeff Hostetler via GitGitGadget, Feb 15, 2022
  12. 04/23 t/helper/fsmonitor-client: create stress testJeff Hostetler via GitGitGadget, Feb 15, 2022
  13. Derrick StoleeFeb 24, 2022
  14. Jeff HostetlerMar 1, 2022
  15. 07/23 fsmonitor-settings: virtual repos are incompatible with FSMonitorJeff Hostetler via GitGitGadget, Feb 15, 2022
  16. Derrick StoleeFeb 24, 2022
  17. Jeff HostetlerMar 1, 2022
  18. 06/23 fsmonitor-settings: stub in platform-specific incompatibility checkingJeff Hostetler via GitGitGadget, Feb 15, 2022
  19. Derrick StoleeFeb 24, 2022
  20. 05/23 fsmonitor-settings: bare repos are incompatible with FSMonitorJeff Hostetler via GitGitGadget, Feb 15, 2022
  21. Ævar Arnfjörð BjarmasonFeb 25, 2022
  22. Jeff HostetlerMar 2, 2022
  23. 08/23 fsmonitor-settings: stub in macOS-specific incompatibility checkingJeff Hostetler via GitGitGadget, Feb 15, 2022
  24. 09/23 fsmonitor-settings: remote repos on macOS are incompatible with FSMonitorJeff Hostetler via GitGitGadget, Feb 15, 2022
  25. Derrick StoleeFeb 24, 2022
  26. Jeff HostetlerMar 1, 2022
  27. 10/23 fsmonitor-settings: remote repos on Windows are incompatible with FSMonitorJeff Hostetler via GitGitGadget, Feb 15, 2022
  28. Derrick StoleeFeb 24, 2022
  29. 12/23 fsm-listen-darwin: ignore FSEvents caused by xattr changes on macOSJeff Hostetler via GitGitGadget, Feb 15, 2022
  30. 11/23 unpack-trees: initialize fsmonitor_has_run_once in o->resultJeff Hostetler via GitGitGadget, Feb 15, 2022
  31. 13/23 fsmonitor--daemon: print start message only if fsmonitor.announceStartupJeff Hostetler via GitGitGadget, Feb 15, 2022
  32. 14/23 fsmonitor--daemon: cd out of worktree rootJeff Hostetler via GitGitGadget, Feb 15, 2022
  33. 15/23 fsmonitor--daemon: prepare for adding health threadJeff Hostetler via GitGitGadget, Feb 15, 2022
  34. 16/23 fsmonitor--daemon: rename listener thread related variablesJeff Hostetler via GitGitGadget, Feb 15, 2022
  35. 19/23 fsm-health-win32: force shutdown daemon if worktree root movesJeff Hostetler via GitGitGadget, Feb 15, 2022
  36. Derrick StoleeFeb 24, 2022
  37. Jeff HostetlerMar 3, 2022
  38. 22/23 t7527: FSMonitor tests for directory movesJeff Hostetler via GitGitGadget, Feb 15, 2022
  39. 20/23 fsm-listen-darwin: shutdown daemon if worktree root is moved/renamedJeff Hostetler via GitGitGadget, Feb 15, 2022
  40. Derrick StoleeFeb 24, 2022
  41. 23/23 t/perf/p7527: add perf test for builtin FSMonitorJeff Hostetler via GitGitGadget, Feb 15, 2022
  42. 21/23 fsmonitor: optimize processing of directory eventsJeff Hostetler via GitGitGadget, Feb 15, 2022
  43. Derrick StoleeFeb 24, 2022
  44. 17/23 fsmonitor--daemon: stub in health threadJeff Hostetler via GitGitGadget, Feb 15, 2022
  45. Derrick StoleeFeb 24, 2022
  46. Derrick StoleeFeb 24, 2022
  47. Jeff HostetlerMar 3, 2022
  48. Jeff HostetlerMar 3, 2022
  49. Jeff HostetlerMar 3, 2022
  50. 18/23 fsm-health-win32: add framework to monitor daemon healthJeff Hostetler via GitGitGadget, Feb 15, 2022
  51. Derrick StoleeFeb 24, 2022
  52. Junio C HamanoFeb 16, 2022
  53. Jeff HostetlerFeb 16, 2022
  54. Derrick StoleeFeb 24, 2022
  55. Jeff HostetlerMar 7, 2022
  56. Derrick StoleeMar 9, 2022
  57. 00/27 Builtin FSMonitor Part 3Jeff Hostetler via GitGitGadget, Mar 8, 2022
  58. 01/27 fsm-listen-win32: handle shortnamesJeff Hostetler via GitGitGadget, Mar 8, 2022
  59. 02/27 t7527: test FSMonitor on repos with Unicode root pathsJeff Hostetler via GitGitGadget, Mar 8, 2022
  60. 03/27 t/helper/fsmonitor-client: create stress testJeff Hostetler via GitGitGadget, Mar 8, 2022
  61. 04/27 fsmonitor-settings: bare repos are incompatible with FSMonitorJeff Hostetler via GitGitGadget, Mar 8, 2022
  62. Ævar Arnfjörð BjarmasonMar 11, 2022
  63. Jeff HostetlerMar 11, 2022
  64. 05/27 fsmonitor-settings: stub in platform-specific incompatibility checkingJeff Hostetler via GitGitGadget, Mar 8, 2022
  65. 07/27 fsmonitor-settings: stub in macOS-specific incompatibility checkingJeff Hostetler via GitGitGadget, Mar 8, 2022
  66. 06/27 fsmonitor-settings: VFS for Git virtual repos are incompatibleJeff Hostetler via GitGitGadget, Mar 8, 2022
  67. 08/27 fsmonitor-settings: remote repos on macOS are incompatibleJeff Hostetler via GitGitGadget, Mar 8, 2022
  68. 11/27 fsm-listen-darwin: ignore FSEvents caused by xattr changes on macOSJeff Hostetler via GitGitGadget, Mar 8, 2022
  69. 09/27 fsmonitor-settings: remote repos on Windows are incompatibleJeff Hostetler via GitGitGadget, Mar 8, 2022
  70. 12/27 fsmonitor--daemon: cd out of worktree rootJeff Hostetler via GitGitGadget, Mar 8, 2022
  71. 10/27 unpack-trees: initialize fsmonitor_has_run_once in o->resultJeff Hostetler via GitGitGadget, Mar 8, 2022
  72. 14/27 fsmonitor--daemon: rename listener thread related variablesJeff Hostetler via GitGitGadget, Mar 8, 2022
  73. 15/27 fsmonitor--daemon: stub in health threadJeff Hostetler via GitGitGadget, Mar 8, 2022
  74. 17/27 fsm-health-win32: force shutdown daemon if worktree root movesJeff Hostetler via GitGitGadget, Mar 8, 2022
  75. 19/27 fsmonitor: optimize processing of directory eventsJeff Hostetler via GitGitGadget, Mar 8, 2022
  76. 18/27 fsm-listen-darwin: shutdown daemon if worktree root is moved/renamedJeff Hostetler via GitGitGadget, Mar 8, 2022
  77. 22/27 fsmonitor: never set CE_FSMONITOR_VALID on submodulesJeff Hostetler via GitGitGadget, Mar 8, 2022
  78. 21/27 t/perf/p7527: add perf test for builtin FSMonitorJeff Hostetler via GitGitGadget, Mar 8, 2022
  79. 24/27 fsmonitor: on macOS also emit NFC spelling for NFD pathnameJeff Hostetler via GitGitGadget, Mar 8, 2022
  80. 20/27 t7527: FSMonitor tests for directory movesJeff Hostetler via GitGitGadget, Mar 8, 2022
  81. 16/27 fsm-health-win32: add polling framework to monitor daemon healthJeff Hostetler via GitGitGadget, Mar 8, 2022
  82. 13/27 fsmonitor--daemon: prepare for adding health threadJeff Hostetler via GitGitGadget, Mar 8, 2022
  83. 23/27 t7527: test FSMonitor on case insensitive+preserving file systemJeff Hostetler via GitGitGadget, Mar 8, 2022
  84. 25/27 t/lib-unicode-nfc-nfd: helper prereqs for testing unicode nfc/nfdJeff Hostetler via GitGitGadget, Mar 8, 2022
  85. Derrick StoleeMar 9, 2022
  86. Derrick StoleeMar 9, 2022
  87. Jeff HostetlerMar 10, 2022
  88. Jeff HostetlerMar 10, 2022
  89. 27/27 fsmonitor-settings: NTFS and FAT32 on MacOS are incompatibleJeff Hostetler via GitGitGadget, Mar 8, 2022
  90. 26/27 t7527: test Unicode NFC/NFD handling on MacOSJeff Hostetler via GitGitGadget, Mar 8, 2022
  91. Derrick StoleeMar 9, 2022
  92. Torsten B��gershausenMar 10, 2022
  93. Torsten BögershausenMar 13, 2022
  94. Jeff HostetlerMar 21, 2022
  95. rsbecker@nexbridge.comMar 21, 2022
  96. Jeff HostetlerMar 22, 2022
  97. rsbecker@nexbridge.comMar 22, 2022
  98. Jeff HostetlerMar 22, 2022
  99. Jeff HostetlerMar 21, 2022
  100. 00/27 Builtin FSMonitor Part 3Jeff Hostetler via GitGitGadget, Mar 22, 2022
  101. 01/27 fsm-listen-win32: handle shortnamesJeff Hostetler via GitGitGadget, Mar 22, 2022
  102. 02/27 t7527: test FSMonitor on repos with Unicode root pathsJeff Hostetler via GitGitGadget, Mar 22, 2022
  103. 03/27 t/helper/fsmonitor-client: create stress testJeff Hostetler via GitGitGadget, Mar 22, 2022
  104. 04/27 fsmonitor-settings: bare repos are incompatible with FSMonitorJeff Hostetler via GitGitGadget, Mar 22, 2022
  105. 05/27 fsmonitor-settings: stub in Win32-specific incompatibility checkingJeff Hostetler via GitGitGadget, Mar 22, 2022
  106. 06/27 fsmonitor-settings: VFS for Git virtual repos are incompatibleJeff Hostetler via GitGitGadget, Mar 22, 2022
  107. 07/27 fsmonitor-settings: stub in macOS-specific incompatibility checkingJeff Hostetler via GitGitGadget, Mar 22, 2022
  108. 09/27 fsmonitor-settings: remote repos on Windows are incompatibleJeff Hostetler via GitGitGadget, Mar 22, 2022
  109. 16/27 fsmonitor--daemon: stub in health threadJeff Hostetler via GitGitGadget, Mar 22, 2022
  110. 17/27 fsm-health-win32: add polling framework to monitor daemon healthJeff Hostetler via GitGitGadget, Mar 22, 2022
  111. 19/27 fsm-listen-darwin: shutdown daemon if worktree root is moved/renamedJeff Hostetler via GitGitGadget, Mar 22, 2022
  112. 20/27 fsmonitor: optimize processing of directory eventsJeff Hostetler via GitGitGadget, Mar 22, 2022
  113. 18/27 fsm-health-win32: force shutdown daemon if worktree root movesJeff Hostetler via GitGitGadget, Mar 22, 2022
  114. 15/27 fsmonitor--daemon: rename listener thread related variablesJeff Hostetler via GitGitGadget, Mar 22, 2022
  115. 14/27 fsmonitor--daemon: prepare for adding health threadJeff Hostetler via GitGitGadget, Mar 22, 2022
  116. 10/27 fsmonitor-settings: NTFS and FAT32 on MacOS are incompatibleJeff Hostetler via GitGitGadget, Mar 22, 2022
  117. 08/27 fsmonitor-settings: remote repos on macOS are incompatibleJeff Hostetler via GitGitGadget, Mar 22, 2022
  118. 12/27 fsm-listen-darwin: ignore FSEvents caused by xattr changes on macOSJeff Hostetler via GitGitGadget, Mar 22, 2022
  119. 11/27 unpack-trees: initialize fsmonitor_has_run_once in o->resultJeff Hostetler via GitGitGadget, Mar 22, 2022
  120. 13/27 fsmonitor--daemon: cd out of worktree rootJeff Hostetler via GitGitGadget, Mar 22, 2022
  121. 21/27 t7527: FSMonitor tests for directory movesJeff Hostetler via GitGitGadget, Mar 22, 2022
  122. 22/27 t/perf/p7527: add perf test for builtin FSMonitorJeff Hostetler via GitGitGadget, Mar 22, 2022
  123. 23/27 fsmonitor: never set CE_FSMONITOR_VALID on submodulesJeff Hostetler via GitGitGadget, Mar 22, 2022
  124. 24/27 t7527: test FSMonitor on case insensitive+preserving file systemJeff Hostetler via GitGitGadget, Mar 22, 2022
  125. 25/27 fsmonitor: on macOS also emit NFC spelling for NFD pathnameJeff Hostetler via GitGitGadget, Mar 22, 2022
  126. 26/27 t/lib-unicode-nfc-nfd: helper prereqs for testing unicode nfc/nfdJeff Hostetler via GitGitGadget, Mar 22, 2022
  127. 27/27 t7527: test Unicode NFC/NFD handling on MacOSJeff Hostetler via GitGitGadget, Mar 22, 2022
  128. 00/27 Builtin FSMonitor Part 3Jeff Hostetler via GitGitGadget, Mar 24, 2022
  129. 01/27 fsm-listen-win32: handle shortnamesJeff Hostetler via GitGitGadget, Mar 24, 2022
  130. 13/27 fsmonitor--daemon: cd out of worktree rootJeff Hostetler via GitGitGadget, Mar 24, 2022
  131. 14/27 fsmonitor--daemon: prepare for adding health threadJeff Hostetler via GitGitGadget, Mar 24, 2022
  132. 11/27 unpack-trees: initialize fsmonitor_has_run_once in o->resultJeff Hostetler via GitGitGadget, Mar 24, 2022
  133. 15/27 fsmonitor--daemon: rename listener thread related variablesJeff Hostetler via GitGitGadget, Mar 24, 2022
  134. 06/27 fsmonitor-settings: VFS for Git virtual repos are incompatibleJeff Hostetler via GitGitGadget, Mar 24, 2022
  135. 16/27 fsmonitor--daemon: stub in health threadJeff Hostetler via GitGitGadget, Mar 24, 2022
  136. 17/27 fsm-health-win32: add polling framework to monitor daemon healthJeff Hostetler via GitGitGadget, Mar 24, 2022
  137. 18/27 fsm-health-win32: force shutdown daemon if worktree root movesJeff Hostetler via GitGitGadget, Mar 24, 2022
  138. 19/27 fsm-listen-darwin: shutdown daemon if worktree root is moved/renamedJeff Hostetler via GitGitGadget, Mar 24, 2022
  139. 20/27 fsmonitor: optimize processing of directory eventsJeff Hostetler via GitGitGadget, Mar 24, 2022
  140. 22/27 t/perf/p7527: add perf test for builtin FSMonitorJeff Hostetler via GitGitGadget, Mar 24, 2022
  141. 23/27 fsmonitor: never set CE_FSMONITOR_VALID on submodulesJeff Hostetler via GitGitGadget, Mar 24, 2022
  142. 21/27 t7527: FSMonitor tests for directory movesJeff Hostetler via GitGitGadget, Mar 24, 2022
  143. 10/27 fsmonitor-settings: NTFS and FAT32 on MacOS are incompatibleJeff Hostetler via GitGitGadget, Mar 24, 2022
  144. 09/27 fsmonitor-settings: remote repos on Windows are incompatibleJeff Hostetler via GitGitGadget, Mar 24, 2022
  145. 08/27 fsmonitor-settings: remote repos on macOS are incompatibleJeff Hostetler via GitGitGadget, Mar 24, 2022
  146. 07/27 fsmonitor-settings: stub in macOS-specific incompatibility checkingJeff Hostetler via GitGitGadget, Mar 24, 2022
  147. 04/27 fsmonitor-settings: bare repos are incompatible with FSMonitorJeff Hostetler via GitGitGadget, Mar 24, 2022
  148. Ævar Arnfjörð BjarmasonApr 19, 2022
  149. Jeff HostetlerApr 22, 2022
  150. 05/27 fsmonitor-settings: stub in Win32-specific incompatibility checkingJeff Hostetler via GitGitGadget, Mar 24, 2022
  151. 03/27 t/helper/fsmonitor-client: create stress testJeff Hostetler via GitGitGadget, Mar 24, 2022
  152. 02/27 t7527: test FSMonitor on repos with Unicode root pathsJeff Hostetler via GitGitGadget, Mar 24, 2022
  153. 12/27 fsm-listen-darwin: ignore FSEvents caused by xattr changes on macOSJeff Hostetler via GitGitGadget, Mar 24, 2022
  154. 24/27 t7527: test FSMonitor on case insensitive+preserving file systemJeff Hostetler via GitGitGadget, Mar 24, 2022
  155. 25/27 fsmonitor: on macOS also emit NFC spelling for NFD pathnameJeff Hostetler via GitGitGadget, Mar 24, 2022
  156. 26/27 t/lib-unicode-nfc-nfd: helper prereqs for testing unicode nfc/nfdJeff Hostetler via GitGitGadget, Mar 24, 2022
  157. Bagas SanjayaMar 25, 2022
  158. Derrick StoleeMar 25, 2022
  159. Jeff HostetlerMar 25, 2022
  160. 27/27 t7527: test Unicode NFC/NFD handling on MacOSJeff Hostetler via GitGitGadget, Mar 24, 2022
  161. Junio C HamanoMar 24, 2022
  162. 00/28 Builtin FSMonitor Part 3Jeff Hostetler via GitGitGadget, Apr 20, 2022
  163. 01/28 fsm-listen-win32: handle shortnamesJeff Hostetler via GitGitGadget, Apr 20, 2022
  164. 02/28 t7527: test FSMonitor on repos with Unicode root pathsJeff Hostetler via GitGitGadget, Apr 20, 2022
  165. 03/28 t/helper/fsmonitor-client: create stress testJeff Hostetler via GitGitGadget, Apr 20, 2022
  166. 04/28 fsmonitor-settings: bare repos are incompatible with FSMonitorJeff Hostetler via GitGitGadget, Apr 20, 2022
  167. 05/28 fsmonitor-settings: stub in Win32-specific incompatibility checkingJeff Hostetler via GitGitGadget, Apr 20, 2022
  168. 07/28 fsmonitor-settings: stub in macOS-specific incompatibility checkingJeff Hostetler via GitGitGadget, Apr 20, 2022
  169. 06/28 fsmonitor-settings: VFS for Git virtual repos are incompatibleJeff Hostetler via GitGitGadget, Apr 20, 2022
  170. 08/28 fsmonitor-settings: remote repos on macOS are incompatibleJeff Hostetler via GitGitGadget, Apr 20, 2022
  171. 09/28 fsmonitor-settings: remote repos on Windows are incompatibleJeff Hostetler via GitGitGadget, Apr 20, 2022
  172. 10/28 fsmonitor-settings: NTFS and FAT32 on MacOS are incompatibleJeff Hostetler via GitGitGadget, Apr 20, 2022
  173. 11/28 unpack-trees: initialize fsmonitor_has_run_once in o->resultJeff Hostetler via GitGitGadget, Apr 20, 2022
  174. 12/28 fsm-listen-darwin: ignore FSEvents caused by xattr changes on macOSJeff Hostetler via GitGitGadget, Apr 20, 2022
  175. 13/28 fsmonitor--daemon: cd out of worktree rootJeff Hostetler via GitGitGadget, Apr 20, 2022
  176. 14/28 fsmonitor--daemon: prepare for adding health threadJeff Hostetler via GitGitGadget, Apr 20, 2022
  177. 15/28 fsmonitor--daemon: rename listener thread related variablesJeff Hostetler via GitGitGadget, Apr 20, 2022
  178. 16/28 fsmonitor--daemon: stub in health threadJeff Hostetler via GitGitGadget, Apr 20, 2022
  179. 17/28 fsm-health-win32: add polling framework to monitor daemon healthJeff Hostetler via GitGitGadget, Apr 20, 2022
  180. 19/28 fsm-listen-darwin: shutdown daemon if worktree root is moved/renamedJeff Hostetler via GitGitGadget, Apr 20, 2022
  181. 23/28 fsmonitor: never set CE_FSMONITOR_VALID on submodulesJeff Hostetler via GitGitGadget, Apr 20, 2022
  182. Junio C HamanoApr 20, 2022
  183. Jeff HostetlerApr 22, 2022
  184. 22/28 t/perf/p7527: add perf test for builtin FSMonitorJeff Hostetler via GitGitGadget, Apr 20, 2022
  185. 26/28 t/lib-unicode-nfc-nfd: helper prereqs for testing unicode nfc/nfdJeff Hostetler via GitGitGadget, Apr 20, 2022
  186. 25/28 fsmonitor: on macOS also emit NFC spelling for NFD pathnameJeff Hostetler via GitGitGadget, Apr 20, 2022
  187. 27/28 t7527: test Unicode NFC/NFD handling on MacOSJeff Hostetler via GitGitGadget, Apr 20, 2022
  188. 20/28 fsmonitor: optimize processing of directory eventsJeff Hostetler via GitGitGadget, Apr 20, 2022
  189. 24/28 t7527: test FSMonitor on case insensitive+preserving file systemJeff Hostetler via GitGitGadget, Apr 20, 2022
  190. 21/28 t7527: FSMonitor tests for directory movesJeff Hostetler via GitGitGadget, Apr 20, 2022
  191. 18/28 fsm-health-win32: force shutdown daemon if worktree root movesJeff Hostetler via GitGitGadget, Apr 20, 2022
  192. 28/28 fsmonitor--daemon: allow --super-prefix argumentJeff Hostetler via GitGitGadget, Apr 20, 2022
  193. Junio C HamanoApr 21, 2022
  194. 00/28 Builtin FSMonitor Part 3Jeff Hostetler via GitGitGadget, Apr 22, 2022
  195. 03/28 t/helper/fsmonitor-client: create stress testJeff Hostetler via GitGitGadget, Apr 22, 2022
  196. 10/28 fsmonitor-settings: NTFS and FAT32 on MacOS are incompatibleJeff Hostetler via GitGitGadget, Apr 22, 2022
  197. 02/28 t7527: test FSMonitor on repos with Unicode root pathsJeff Hostetler via GitGitGadget, Apr 22, 2022
  198. 09/28 fsmonitor-settings: remote repos on Windows are incompatibleJeff Hostetler via GitGitGadget, Apr 22, 2022
  199. 05/28 fsmonitor-settings: stub in Win32-specific incompatibility checkingJeff Hostetler via GitGitGadget, Apr 22, 2022
  200. 12/28 fsm-listen-darwin: ignore FSEvents caused by xattr changes on macOSJeff Hostetler via GitGitGadget, Apr 22, 2022
  201. 08/28 fsmonitor-settings: remote repos on macOS are incompatibleJeff Hostetler via GitGitGadget, Apr 22, 2022
  202. 13/28 fsmonitor--daemon: cd out of worktree rootJeff Hostetler via GitGitGadget, Apr 22, 2022
  203. 16/28 fsmonitor--daemon: stub in health threadJeff Hostetler via GitGitGadget, Apr 22, 2022
  204. Johannes SchindelinMay 12, 2022
  205. Jeff HostetlerMay 17, 2022
  206. Johannes SchindelinMay 24, 2022
  207. 01/28 fsm-listen-win32: handle shortnamesJeff Hostetler via GitGitGadget, Apr 22, 2022
  208. Johannes SchindelinMay 12, 2022
  209. Jeff HostetlerMay 17, 2022
  210. 07/28 fsmonitor-settings: stub in macOS-specific incompatibility checkingJeff Hostetler via GitGitGadget, Apr 22, 2022
  211. 11/28 unpack-trees: initialize fsmonitor_has_run_once in o->resultJeff Hostetler via GitGitGadget, Apr 22, 2022
  212. 15/28 fsmonitor--daemon: rename listener thread related variablesJeff Hostetler via GitGitGadget, Apr 22, 2022
  213. 17/28 fsm-health-win32: add polling framework to monitor daemon healthJeff Hostetler via GitGitGadget, Apr 22, 2022
  214. 06/28 fsmonitor-settings: VFS for Git virtual repos are incompatibleJeff Hostetler via GitGitGadget, Apr 22, 2022
  215. 04/28 fsmonitor-settings: bare repos are incompatible with FSMonitorJeff Hostetler via GitGitGadget, Apr 22, 2022
  216. Johannes SchindelinMay 12, 2022
  217. 14/28 fsmonitor--daemon: prepare for adding health threadJeff Hostetler via GitGitGadget, Apr 22, 2022
  218. 28/28 fsmonitor--daemon: allow --super-prefix argumentJeff Hostetler via GitGitGadget, Apr 22, 2022
  219. 27/28 t7527: test Unicode NFC/NFD handling on MacOSJeff Hostetler via GitGitGadget, Apr 22, 2022
  220. 26/28 t/lib-unicode-nfc-nfd: helper prereqs for testing unicode nfc/nfdJeff Hostetler via GitGitGadget, Apr 22, 2022
  221. Johannes SchindelinMay 12, 2022
  222. Jeff HostetlerMay 17, 2022
  223. 25/28 fsmonitor: on macOS also emit NFC spelling for NFD pathnameJeff Hostetler via GitGitGadget, Apr 22, 2022
  224. 24/28 t7527: test FSMonitor on case insensitive+preserving file systemJeff Hostetler via GitGitGadget, Apr 22, 2022
  225. 23/28 fsmonitor: never set CE_FSMONITOR_VALID on submodulesJeff Hostetler via GitGitGadget, Apr 22, 2022
  226. Johannes SchindelinMay 12, 2022
  227. 22/28 t/perf/p7527: add perf test for builtin FSMonitorJeff Hostetler via GitGitGadget, Apr 22, 2022
  228. 21/28 t7527: FSMonitor tests for directory movesJeff Hostetler via GitGitGadget, Apr 22, 2022
  229. 20/28 fsmonitor: optimize processing of directory eventsJeff Hostetler via GitGitGadget, Apr 22, 2022
  230. Johannes SchindelinMay 12, 2022
  231. Jeff HostetlerMay 17, 2022
  232. Johannes SchindelinMay 24, 2022
  233. 19/28 fsm-listen-darwin: shutdown daemon if worktree root is moved/renamedJeff Hostetler via GitGitGadget, Apr 22, 2022
  234. 18/28 fsm-health-win32: force shutdown daemon if worktree root movesJeff Hostetler via GitGitGadget, Apr 22, 2022
  235. Johannes SchindelinMay 12, 2022
  236. 00/30 Builtin FSMonitor Part 3Jeff Hostetler via GitGitGadget, May 23, 2022
  237. 02/30 t7527: test FSMonitor on repos with Unicode root pathsJeff Hostetler via GitGitGadget, May 23, 2022
  238. 01/30 fsm-listen-win32: handle shortnamesJeff Hostetler via GitGitGadget, May 23, 2022
  239. 03/30 t/helper/fsmonitor-client: create stress testJeff Hostetler via GitGitGadget, May 23, 2022
  240. 04/30 fsmonitor-settings: bare repos are incompatible with FSMonitorJeff Hostetler via GitGitGadget, May 23, 2022
  241. 05/30 fsmonitor-settings: stub in Win32-specific incompatibility checkingJeff Hostetler via GitGitGadget, May 23, 2022
  242. 06/30 fsmonitor-settings: VFS for Git virtual repos are incompatibleJeff Hostetler via GitGitGadget, May 23, 2022
  243. 08/30 fsmonitor-settings: remote repos on macOS are incompatibleJeff Hostetler via GitGitGadget, May 23, 2022
  244. 09/30 fsmonitor-settings: remote repos on Windows are incompatibleJeff Hostetler via GitGitGadget, May 23, 2022
  245. 07/30 fsmonitor-settings: stub in macOS-specific incompatibility checkingJeff Hostetler via GitGitGadget, May 23, 2022
  246. 11/30 unpack-trees: initialize fsmonitor_has_run_once in o->resultJeff Hostetler via GitGitGadget, May 23, 2022
  247. 12/30 fsm-listen-darwin: ignore FSEvents caused by xattr changes on macOSJeff Hostetler via GitGitGadget, May 23, 2022
  248. 15/30 fsmonitor--daemon: rename listener thread related variablesJeff Hostetler via GitGitGadget, May 23, 2022
  249. 16/30 fsmonitor--daemon: stub in health threadJeff Hostetler via GitGitGadget, May 23, 2022
  250. 17/30 fsm-health-win32: add polling framework to monitor daemon healthJeff Hostetler via GitGitGadget, May 23, 2022
  251. 14/30 fsmonitor--daemon: prepare for adding health threadJeff Hostetler via GitGitGadget, May 23, 2022
  252. 13/30 fsmonitor--daemon: cd out of worktree rootJeff Hostetler via GitGitGadget, May 23, 2022
  253. 10/30 fsmonitor-settings: NTFS and FAT32 on MacOS are incompatibleJeff Hostetler via GitGitGadget, May 23, 2022
  254. 18/30 fsm-health-win32: force shutdown daemon if worktree root movesJeff Hostetler via GitGitGadget, May 23, 2022
  255. 21/30 t7527: FSMonitor tests for directory movesJeff Hostetler via GitGitGadget, May 23, 2022
  256. 22/30 t/perf/p7527: add perf test for builtin FSMonitorJeff Hostetler via GitGitGadget, May 23, 2022
  257. 24/30 t7527: test FSMonitor on case insensitive+preserving file systemJeff Hostetler via GitGitGadget, May 23, 2022
  258. 28/30 t7527: test Unicode NFC/NFD handling on MacOSJeff Hostetler via GitGitGadget, May 23, 2022
  259. 20/30 fsmonitor: optimize processing of directory eventsJeff Hostetler via GitGitGadget, May 23, 2022
  260. 26/30 t/helper/hexdump: add helper to print hexdump of stdinJeff Hostetler via GitGitGadget, May 23, 2022
  261. Junio C HamanoMay 23, 2022
  262. Johannes SchindelinMay 24, 2022
  263. Junio C HamanoMay 24, 2022
  264. Johannes SchindelinMay 25, 2022
  265. Jeff HostetlerMay 24, 2022
  266. Junio C HamanoMay 24, 2022
  267. Jeff HostetlerMay 25, 2022
  268. 19/30 fsm-listen-darwin: shutdown daemon if worktree root is moved/renamedJeff Hostetler via GitGitGadget, May 23, 2022
  269. 23/30 fsmonitor: never set CE_FSMONITOR_VALID on submodulesJeff Hostetler via GitGitGadget, May 23, 2022
  270. 29/30 fsmonitor--daemon: allow --super-prefix argumentJeff Hostetler via GitGitGadget, May 23, 2022
  271. 25/30 fsmonitor: on macOS also emit NFC spelling for NFD pathnameJeff Hostetler via GitGitGadget, May 23, 2022
  272. 27/30 t/lib-unicode-nfc-nfd: helper prereqs for testing unicode nfc/nfdJeff Hostetler via GitGitGadget, May 23, 2022
  273. Junio C HamanoMay 23, 2022
  274. Johannes SchindelinMay 24, 2022
  275. Jeff HostetlerMay 24, 2022
  276. 30/30 t7527: improve implicit shutdown testing in fsmonitor--daemonJeff Hostetler via GitGitGadget, May 23, 2022
  277. Johannes SchindelinMay 24, 2022
  278. Jeff HostetlerMay 24, 2022
  279. Johannes SchindelinMay 25, 2022
  280. 00/30 Builtin FSMonitor Part 3Jeff Hostetler via GitGitGadget, May 25, 2022
  281. 01/30 fsm-listen-win32: handle shortnamesJeff Hostetler via GitGitGadget, May 25, 2022
  282. 02/30 t7527: test FSMonitor on repos with Unicode root pathsJeff Hostetler via GitGitGadget, May 25, 2022
  283. 03/30 t/helper/fsmonitor-client: create stress testJeff Hostetler via GitGitGadget, May 25, 2022
  284. 04/30 fsmonitor-settings: bare repos are incompatible with FSMonitorJeff Hostetler via GitGitGadget, May 25, 2022
  285. 05/30 fsmonitor-settings: stub in Win32-specific incompatibility checkingJeff Hostetler via GitGitGadget, May 25, 2022
  286. 06/30 fsmonitor-settings: VFS for Git virtual repos are incompatibleJeff Hostetler via GitGitGadget, May 25, 2022
  287. 09/30 fsmonitor-settings: remote repos on Windows are incompatibleJeff Hostetler via GitGitGadget, May 25, 2022
  288. 08/30 fsmonitor-settings: remote repos on macOS are incompatibleJeff Hostetler via GitGitGadget, May 25, 2022
  289. 11/30 unpack-trees: initialize fsmonitor_has_run_once in o->resultJeff Hostetler via GitGitGadget, May 25, 2022
  290. 10/30 fsmonitor-settings: NTFS and FAT32 on MacOS are incompatibleJeff Hostetler via GitGitGadget, May 25, 2022
  291. 12/30 fsm-listen-darwin: ignore FSEvents caused by xattr changes on macOSJeff Hostetler via GitGitGadget, May 25, 2022
  292. 16/30 fsmonitor--daemon: stub in health threadJeff Hostetler via GitGitGadget, May 25, 2022
  293. 17/30 fsm-health-win32: add polling framework to monitor daemon healthJeff Hostetler via GitGitGadget, May 25, 2022
  294. 14/30 fsmonitor--daemon: prepare for adding health threadJeff Hostetler via GitGitGadget, May 25, 2022
  295. 15/30 fsmonitor--daemon: rename listener thread related variablesJeff Hostetler via GitGitGadget, May 25, 2022
  296. 13/30 fsmonitor--daemon: cd out of worktree rootJeff Hostetler via GitGitGadget, May 25, 2022
  297. 07/30 fsmonitor-settings: stub in macOS-specific incompatibility checkingJeff Hostetler via GitGitGadget, May 25, 2022
  298. 18/30 fsm-health-win32: force shutdown daemon if worktree root movesJeff Hostetler via GitGitGadget, May 25, 2022
  299. 21/30 t7527: FSMonitor tests for directory movesJeff Hostetler via GitGitGadget, May 25, 2022
  300. 20/30 fsmonitor: optimize processing of directory eventsJeff Hostetler via GitGitGadget, May 25, 2022
  301. 19/30 fsm-listen-darwin: shutdown daemon if worktree root is moved/renamedJeff Hostetler via GitGitGadget, May 25, 2022
  302. 22/30 t/perf/p7527: add perf test for builtin FSMonitorJeff Hostetler via GitGitGadget, May 25, 2022
  303. 23/30 fsmonitor: never set CE_FSMONITOR_VALID on submodulesJeff Hostetler via GitGitGadget, May 25, 2022
  304. 25/30 fsmonitor: on macOS also emit NFC spelling for NFD pathnameJeff Hostetler via GitGitGadget, May 25, 2022
  305. 24/30 t7527: test FSMonitor on case insensitive+preserving file systemJeff Hostetler via GitGitGadget, May 25, 2022
  306. 27/30 t/lib-unicode-nfc-nfd: helper prereqs for testing unicode nfc/nfdJeff Hostetler via GitGitGadget, May 25, 2022
  307. 26/30 t/helper/hexdump: add helper to print hexdump of stdinJeff Hostetler via GitGitGadget, May 25, 2022
  308. 28/30 t7527: test Unicode NFC/NFD handling on MacOSJeff Hostetler via GitGitGadget, May 25, 2022
  309. 30/30 t7527: improve implicit shutdown testing in fsmonitor--daemonJeff Hostetler via GitGitGadget, May 25, 2022
  310. 29/30 fsmonitor--daemon: allow --super-prefix argumentJeff Hostetler via GitGitGadget, May 25, 2022
  311. Junio C HamanoMay 25, 2022
  312. Jeff HostetlerMay 25, 2022
  313. 00/30 Builtin FSMonitor Part 3Jeff Hostetler via GitGitGadget, May 26, 2022
  314. 01/30 fsm-listen-win32: handle shortnamesJeff Hostetler via GitGitGadget, May 26, 2022
  315. 06/30 fsmonitor-settings: VFS for Git virtual repos are incompatibleJeff Hostetler via GitGitGadget, May 26, 2022
  316. 03/30 t/helper/fsmonitor-client: create stress testJeff Hostetler via GitGitGadget, May 26, 2022
  317. 02/30 t7527: test FSMonitor on repos with Unicode root pathsJeff Hostetler via GitGitGadget, May 26, 2022
  318. 04/30 fsmonitor-settings: bare repos are incompatible with FSMonitorJeff Hostetler via GitGitGadget, May 26, 2022
  319. 05/30 fsmonitor-settings: stub in Win32-specific incompatibility checkingJeff Hostetler via GitGitGadget, May 26, 2022
  320. 07/30 fsmonitor-settings: stub in macOS-specific incompatibility checkingJeff Hostetler via GitGitGadget, May 26, 2022
  321. 08/30 fsmonitor-settings: remote repos on macOS are incompatibleJeff Hostetler via GitGitGadget, May 26, 2022
  322. 09/30 fsmonitor-settings: remote repos on Windows are incompatibleJeff Hostetler via GitGitGadget, May 26, 2022
  323. 10/30 fsmonitor-settings: NTFS and FAT32 on MacOS are incompatibleJeff Hostetler via GitGitGadget, May 26, 2022
  324. 13/30 fsmonitor--daemon: cd out of worktree rootJeff Hostetler via GitGitGadget, May 26, 2022
  325. 11/30 unpack-trees: initialize fsmonitor_has_run_once in o->resultJeff Hostetler via GitGitGadget, May 26, 2022
  326. 12/30 fsm-listen-darwin: ignore FSEvents caused by xattr changes on macOSJeff Hostetler via GitGitGadget, May 26, 2022
  327. 15/30 fsmonitor--daemon: rename listener thread related variablesJeff Hostetler via GitGitGadget, May 26, 2022
  328. 14/30 fsmonitor--daemon: prepare for adding health threadJeff Hostetler via GitGitGadget, May 26, 2022
  329. 17/30 fsm-health-win32: add polling framework to monitor daemon healthJeff Hostetler via GitGitGadget, May 26, 2022
  330. 21/30 t7527: FSMonitor tests for directory movesJeff Hostetler via GitGitGadget, May 26, 2022
  331. 20/30 fsmonitor: optimize processing of directory eventsJeff Hostetler via GitGitGadget, May 26, 2022
  332. 16/30 fsmonitor--daemon: stub in health threadJeff Hostetler via GitGitGadget, May 26, 2022
  333. 22/30 t/perf/p7527: add perf test for builtin FSMonitorJeff Hostetler via GitGitGadget, May 26, 2022
  334. 23/30 fsmonitor: never set CE_FSMONITOR_VALID on submodulesJeff Hostetler via GitGitGadget, May 26, 2022
  335. 24/30 t7527: test FSMonitor on case insensitive+preserving file systemJeff Hostetler via GitGitGadget, May 26, 2022
  336. 19/30 fsm-listen-darwin: shutdown daemon if worktree root is moved/renamedJeff Hostetler via GitGitGadget, May 26, 2022
  337. 18/30 fsm-health-win32: force shutdown daemon if worktree root movesJeff Hostetler via GitGitGadget, May 26, 2022
  338. 25/30 fsmonitor: on macOS also emit NFC spelling for NFD pathnameJeff Hostetler via GitGitGadget, May 26, 2022
  339. 26/30 t/helper/hexdump: add helper to print hexdump of stdinJeff Hostetler via GitGitGadget, May 26, 2022
  340. 30/30 t7527: improve implicit shutdown testing in fsmonitor--daemonJeff Hostetler via GitGitGadget, May 26, 2022
  341. 28/30 t7527: test Unicode NFC/NFD handling on MacOSJeff Hostetler via GitGitGadget, May 26, 2022
  342. 29/30 fsmonitor--daemon: allow --super-prefix argumentJeff Hostetler via GitGitGadget, May 26, 2022
  343. 27/30 t/lib-unicode-nfc-nfd: helper prereqs for testing unicode nfc/nfdJeff Hostetler via GitGitGadget, May 26, 2022
  344. Johannes SchindelinJun 2, 2022
  345. Torsten B��gershausenMar 28, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.