@@ -256,8 +256,44 @@ void refresh_fsmonitor(struct index_state *istate)
trace_printf_key(&trace_fsmonitor, "refresh fsmonitor");
if (r->settings.fsmonitor_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;
+ } 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");
+ }
+
+ /*
+ * Regardless of whether we successfully talked to a
+ * fsmonitor daemon or not, we skip over and do not
+ * try to use the hook. The "core.useBuiltinFSMonitor"
+ * config setting ALWAYS overrides the "core.fsmonitor"
+ * hook setting.
+ */
+ goto apply_results;
}
assert(r->settings.fsmonitor_mode == FSMONITOR_MODE_HOOK);
@@ -323,6 +359,7 @@ void refresh_fsmonitor(struct index_state *istate)
query_success ? "success" : "failure");
}
+apply_results:
/* a fsmonitor process can return '/' to indicate all entries are invalid */
if (query_success && query_result.buf[bol] != '/') {
/* Mark all entries returned by the monitor as dirty */