]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fsmonitor: use IPC to query the builtin FSMonitor daemon
authorJeff Hostetler <jeffhost@microsoft.com>
Fri, 25 Mar 2022 18:02:47 +0000 (18:02 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 25 Mar 2022 23:04:15 +0000 (16:04 -0700)
Use simple IPC to directly communicate with the new builtin file
system monitor daemon when `core.fsmonitor` is set to true.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
fsmonitor.c

index 0e961b74d82684b551a84f93e9354d422342b2b7..a38b5710eb3687360b742d32deb301e17c5f2857 100644 (file)
@@ -241,8 +241,41 @@ void refresh_fsmonitor(struct index_state *istate)
        trace_printf_key(&trace_fsmonitor, "refresh fsmonitor");
 
        if (fsm_mode == FSMONITOR_MODE_IPC) {
-               /* TODO */
-               return;
+               query_success = !fsmonitor_ipc__send_query(
+                       istate->fsmonitor_last_update ?
+                       istate->fsmonitor_last_update : "builtin:fake",
+                       &query_result);
+               if (query_success) {
+                       /*
+                        * The response contains a series of nul terminated
+                        * strings.  The first is the new token.
+                        *
+                        * Use `char *buf` as an interlude to trick the CI
+                        * static analysis to let us use `strbuf_addstr()`
+                        * here (and only copy the token) rather than
+                        * `strbuf_addbuf()`.
+                        */
+                       buf = query_result.buf;
+                       strbuf_addstr(&last_update_token, buf);
+                       bol = last_update_token.len + 1;
+                       is_trivial = query_result.buf[bol] == '/';
+                       if (is_trivial)
+                               trace2_data_intmax("fsm_client", NULL,
+                                                  "query/trivial-response", 1);
+               } else {
+                       /*
+                        * The builtin daemon is not available on this
+                        * platform -OR- we failed to get a response.
+                        *
+                        * Generate a fake token (rather than a V1
+                        * timestamp) for the index extension.  (If
+                        * they switch back to the hook API, we don't
+                        * want ambiguous state.)
+                        */
+                       strbuf_addstr(&last_update_token, "builtin:fake");
+               }
+
+               goto apply_results;
        }
 
        assert(fsm_mode == FSMONITOR_MODE_HOOK);
@@ -315,6 +348,7 @@ void refresh_fsmonitor(struct index_state *istate)
                                 query_success ? "success" : "failure");
        }
 
+apply_results:
        /*
         * The response from FSMonitor (excluding the header token) is
         * either: