]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fsm-listen-darwin: shutdown daemon if worktree root is moved/renamed
authorJeff Hostetler <jeffhost@microsoft.com>
Thu, 26 May 2022 21:47:13 +0000 (21:47 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 26 May 2022 22:59:27 +0000 (15:59 -0700)
Teach the listener thread to shutdown the daemon if the spelling of the
worktree root directory changes.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/fsmonitor/fsm-listen-darwin.c

index 07113205a6152b9abf49f9133f8cdb92460c2c3d..83d38e8ac6c83385c5ba14372cb980c729ce0406 100644 (file)
@@ -106,6 +106,11 @@ static void log_flags_set(const char *path, const FSEventStreamEventFlags flag)
        strbuf_release(&msg);
 }
 
+static int ef_is_root_changed(const FSEventStreamEventFlags ef)
+{
+       return (ef & kFSEventStreamEventFlagRootChanged);
+}
+
 static int ef_is_root_delete(const FSEventStreamEventFlags ef)
 {
        return (ef & kFSEventStreamEventFlagItemIsDir &&
@@ -215,6 +220,26 @@ static void fsevent_callback(ConstFSEventStreamRef streamRef,
                        continue;
                }
 
+               if (ef_is_root_changed(event_flags[k])) {
+                       /*
+                        * The spelling of the pathname of the root directory
+                        * has changed.  This includes the name of the root
+                        * directory itself or of any parent directory in the
+                        * path.
+                        *
+                        * (There may be other conditions that throw this,
+                        * but I couldn't find any information on it.)
+                        *
+                        * Force a shutdown now and avoid things getting
+                        * out of sync.  The Unix domain socket is inside
+                        * the .git directory and a spelling change will make
+                        * it hard for clients to rendezvous with us.
+                        */
+                       trace_printf_key(&trace_fsmonitor,
+                                        "event: root changed");
+                       goto force_shutdown;
+               }
+
                if (ef_ignore_xattr(event_flags[k])) {
                        trace_printf_key(&trace_fsmonitor,
                                         "ignore-xattr: '%s', flags=0x%x",