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

Re: [PATCH 02/23] fsmonitor-ipc: create client routines for git-fsmonitor--daemon

From
JHJeff Hostetler <git@jeffhostetler.com>
Date
Apr 28, 2021, 19:26 UTC
Message-ID
<98038a12-4750-456b-6535-8bc59a32693c@jeffhostetler.com>
In-Reply-To
<5b63eb3f-0b87-209b-3943-ced8412abb93@gmail.com>
On 4/26/21 10:31 AM, Derrick Stolee wrote:
Show 22 quoted lines
> On 4/1/21 11:40 AM, Jeff Hostetler via GitGitGadget wrote:
>> +#ifdef HAVE_FSMONITOR_DAEMON_BACKEND
>> +#define FSMONITOR_DAEMON_IS_SUPPORTED 1
>> +#else
>> +#define FSMONITOR_DAEMON_IS_SUPPORTED 0
>> +#endif
>> +
>> +/*
>> + * A trivial function so that this source file always defines at least
>> + * one symbol even when the feature is not supported.  This quiets an
>> + * annoying compiler error.
>> + */
>> +int fsmonitor_ipc__is_supported(void)
>> +{
>> +	return FSMONITOR_DAEMON_IS_SUPPORTED;
>> +}
> 
> I don't see any other use of FSMONITOR_DAEMON_IS_SUPPORTED,
> so I was thinking you could use the #ifdef/#else/#endif
> construct within the implementation of this method instead
> of creating a macro outside. But my suggestion might be an
> anti-pattern, so feel free to ignore me.

I think an earlier draft did more with the macros and wasn't as distilled as it is here. So yes, I could simplify it here.

Show 68 quoted lines
>> +#ifdef HAVE_FSMONITOR_DAEMON_BACKEND
>> +
>> +GIT_PATH_FUNC(fsmonitor_ipc__get_path, "fsmonitor")
>> +
>> +enum ipc_active_state fsmonitor_ipc__get_state(void)
>> +{
>> +	return ipc_get_active_state(fsmonitor_ipc__get_path());
>> +}
>> +
>> +static int spawn_daemon(void)
>> +{
>> +	const char *args[] = { "fsmonitor--daemon", "--start", NULL };
>> +
>> +	return run_command_v_opt_tr2(args, RUN_COMMAND_NO_STDIN | RUN_GIT_CMD,
>> +				    "fsmonitor");
>> +}
>> +
>> +int fsmonitor_ipc__send_query(const char *since_token,
>> +			      struct strbuf *answer)
>> +{
>> +	int ret = -1;
>> +	int tried_to_spawn = 0;
>> +	enum ipc_active_state state = IPC_STATE__OTHER_ERROR;
>> +	struct ipc_client_connection *connection = NULL;
>> +	struct ipc_client_connect_options options
>> +		= IPC_CLIENT_CONNECT_OPTIONS_INIT;
>> +
>> +	options.wait_if_busy = 1;
>> +	options.wait_if_not_found = 0;
>> +
>> +	trace2_region_enter("fsm_client", "query", NULL);
>> +
>> +	trace2_data_string("fsm_client", NULL, "query/command",
>> +			   since_token);
>> +
>> +try_again:
>> +	state = ipc_client_try_connect(fsmonitor_ipc__get_path(), &options,
>> +				       &connection);
>> +
>> +	switch (state) {
>> +	case IPC_STATE__LISTENING:
>> +		ret = ipc_client_send_command_to_connection(
>> +			connection, since_token, answer);
>> +		ipc_client_close_connection(connection);
>> +
>> +		trace2_data_intmax("fsm_client", NULL,
>> +				   "query/response-length", answer->len);
>> +
>> +		if (fsmonitor_is_trivial_response(answer))
>> +			trace2_data_intmax("fsm_client", NULL,
>> +					   "query/trivial-response", 1);
>> +
>> +		goto done;
>> +
>> +	case IPC_STATE__NOT_LISTENING:
>> +		ret = error(_("fsmonitor_ipc__send_query: daemon not available"));
>> +		goto done;
> 
> I'll need to read up on the IPC layer a bit to find out the difference
> between IPC_STATE__NOT_LISTENING and IPC_STATE__PATH_NOT_FOUND. When
> testing on my macOS machine, I got this error. I was expecting the
> daemon to be spawned. After spawning it myself, it started working.
> 
> I expect that there are some cases where the process can fail and the
> named pipe is not cleaned up. Let's investigate that soon. I should
> make it clear that I had tested the builtin FS Monitor on this machine
> a few weeks ago, but hadn't been using it much since. We should auto-
> recover from this situation.

This probably means that you had a left over (dead) unix domain socket in your .git directory from your prior testing. I delete it when the daemon shuts down normally, but if it was killed or crashed, it may have been left behind.

When the client tries to connect (to a socket with no listener) the OS refuses the connection and the IPC layer maps that back to the __NOT_LISTENING error.

(There are other ways to get __NOT_LISTENING error, such as when the client times-out because the daemon is too busy to respond, but I'll ignore that for now.)

The unix daemon startup code tries to gently create the socket (without stealing it from an existing server) and if that fails (because there is no server present), it force creates a new socket and starts listening on it. (There was a large conversation on the Simple IPC patch series about this.) So this is how it fixed itself after you started the daemon.

> But also: what is the cost of treating these two cases the same? Could
> we attempt to "restart" the daemon by spawning a new one? Will the new
> one find a way to kill a stale one?

On Windows, named pipes are magically deleted when the last handle is closed (they are hosted on a special Named Pipe FS rather than NTFS, so they have slightly different semantics). If a named pipe exists, but the connect fails, then a server is present but busy (or wedged). The __NOT_LISTENING error basically means that the connect timed out. So we know that the server is technically present, but it did not respond.

On both platforms, if the socket/pipe is not present then the connect returns __PATH_NOT_FOUND. So we know that no daemon is present and are free to implicitly start one.

The subtle difference in the __NOT_LISTENING case between the platforms is why I hesitated to implicitly start (or restart) the daemon in this case.

I would like to revisit auto-starting the daemon (at least on Unix) when we have a dead socket. I'll review this.

Thanks for the question.
Show 32 quoted lines
> 
> (Reading on.)
> 
>> +	case IPC_STATE__PATH_NOT_FOUND:
>> +		if (tried_to_spawn)
>> +			goto done;
>> +
>> +		tried_to_spawn++;
>> +		if (spawn_daemon())
>> +			goto done;
> 
> This should return zero on success, OK.
> 
>> +		/*
>> +		 * Try again, but this time give the daemon a chance to
>> +		 * actually create the pipe/socket.
>> +		 *
>> +		 * Granted, the daemon just started so it can't possibly have
>> +		 * any FS cached yet, so we'll always get a trivial answer.
>> +		 * BUT the answer should include a new token that can serve
>> +		 * as the basis for subsequent requests.
>> +		 */
>> +		options.wait_if_not_found = 1;
>> +		goto try_again;
> 
> Because of the tried_to_spawn check, we will re-run the request over
> IPC but will not retry the spawn_daemon() request. I'm unsure how
> this could be helpful: is it possible that spawn_daemon() returns a
> non-zero error code after starting the daemon and somehow that
> daemon starts working? Or, is this a race-condition thing with parallel
> processes also starting up the daemon? It could be good to use this
> comment to describe why a retry might be helpful.

I'm trying to be fairly conservative here. If no daemon/socket/pipe is present, we try once to start it and then (with a small delay) try to connect to the new daemon. There is a little race with our process and the new daemon instance, but we have the client spin a little to give the daemon a chance to get started up. Normally, that connect will then succeed.

If that new daemon fails to start or we have some other error, we need to just give up and tell the caller to do the work -- we've already held up the caller long enough IMHO.

The thought here is that if that first daemon failed to start, then subsequent attempts are likely to also fail. And we don't want to cause the client to get stuck trying to repeatedly start the daemon. Better to just give up and go on.

Show 72 quoted lines
> 
>> +
>> +	case IPC_STATE__INVALID_PATH:
>> +		ret = error(_("fsmonitor_ipc__send_query: invalid path '%s'"),
>> +			    fsmonitor_ipc__get_path());
>> +		goto done;
>> +
>> +	case IPC_STATE__OTHER_ERROR:
>> +	default:
>> +		ret = error(_("fsmonitor_ipc__send_query: unspecified error on '%s'"),
>> +			    fsmonitor_ipc__get_path());
>> +		goto done;
>> +	}
>> +
>> +done:
>> +	trace2_region_leave("fsm_client", "query", NULL);
>> +
>> +	return ret;
>> +}
>> +
>> +int fsmonitor_ipc__send_command(const char *command,
>> +				struct strbuf *answer)
>> +{
>> +	struct ipc_client_connection *connection = NULL;
>> +	struct ipc_client_connect_options options
>> +		= IPC_CLIENT_CONNECT_OPTIONS_INIT;
>> +	int ret;
>> +	enum ipc_active_state state;
>> +
>> +	strbuf_reset(answer);
>> +
>> +	options.wait_if_busy = 1;
>> +	options.wait_if_not_found = 0;
>> +
>> +	state = ipc_client_try_connect(fsmonitor_ipc__get_path(), &options,
>> +				       &connection);
>> +	if (state != IPC_STATE__LISTENING) {
>> +		die("fsmonitor--daemon is not running");
>> +		return -1;
>> +	}
>> +
>> +	ret = ipc_client_send_command_to_connection(connection, command, answer);
>> +	ipc_client_close_connection(connection);
>> +
>> +	if (ret == -1) {
>> +		die("could not send '%s' command to fsmonitor--daemon",
>> +		    command);
>> +		return -1;
>> +	}
>> +
>> +	return 0;
>> +}
> 
> I wondier if this ...send_command() method is too generic. It might
> be nice to have more structure to its inputs and outputs to lessen
> the cognitive load when plugging into other portions of the code.
> However, I'll wait to see what those consumers look like in case the
> generality is merited.
>>   struct category_description {
>>   	uint32_t category;
>> @@ -664,6 +665,9 @@ void get_version_info(struct strbuf *buf, int show_build_options)
>>   		strbuf_addf(buf, "sizeof-size_t: %d\n", (int)sizeof(size_t));
>>   		strbuf_addf(buf, "shell-path: %s\n", SHELL_PATH);
>>   		/* NEEDSWORK: also save and output GIT-BUILD_OPTIONS? */
>> +
>> +		if (fsmonitor_ipc__is_supported())
>> +			strbuf_addstr(buf, "feature: fsmonitor--daemon\n");
> 
> This change might deserve its own patch, including some documentation
> about how users can use 'git version --build-options' to determine if
> the builtin FS Monitor feature is available on their platform.
> 
Good point.  Thanks.
> Thanks,
> -Stolee
> 
Previous: Derrick StoleeNext: Johannes Schindelin via GitGitGadget
Message 18 of 237 in “[RFC] Builtin FSMonitor Feature”
  1. 00/23 [RFC] Builtin FSMonitor FeatureJeff Hostetler via GitGitGadget, Apr 1, 2021
  2. 17/23 fsmonitor--daemon: periodically truncate list of modified filesJeff Hostetler via GitGitGadget, Apr 1, 2021
  3. Derrick StoleeApr 27, 2021
  4. 14/23 fsmonitor-fs-listen-macos: add macos header files for FSEventJeff Hostetler via GitGitGadget, Apr 1, 2021
  5. Derrick StoleeApr 27, 2021
  6. 06/23 fsmonitor--daemon: implement client command optionsJeff Hostetler via GitGitGadget, Apr 1, 2021
  7. Derrick StoleeApr 26, 2021
  8. Jeff HostetlerApr 30, 2021
  9. 20/23 fsmonitor: force update index when fsmonitor token advancesJeff Hostetler via GitGitGadget, Apr 1, 2021
  10. Derrick StoleeApr 27, 2021
  11. 19/23 fsmonitor--daemon: use a cookie file to sync with file systemJeff Hostetler via GitGitGadget, Apr 1, 2021
  12. Derrick StoleeApr 27, 2021
  13. Jeff HostetlerMay 3, 2021
  14. 02/23 fsmonitor-ipc: create client routines for git-fsmonitor--daemonJeff Hostetler via GitGitGadget, Apr 1, 2021
  15. Derrick StoleeApr 26, 2021
  16. Eric SunshineApr 26, 2021
  17. Derrick StoleeApr 26, 2021
  18. Jeff HostetlerApr 28, 2021
  19. 04/23 fsmonitor: introduce `core.useBuiltinFSMonitor` to call the daemon via IPCJohannes Schindelin via GitGitGadget, Apr 1, 2021
  20. Derrick StoleeApr 26, 2021
  21. Ævar Arnfjörð BjarmasonApr 27, 2021
  22. Derrick StoleeApr 27, 2021
  23. Ævar Arnfjörð BjarmasonApr 28, 2021
  24. repo-settings.c: simplify the setupÆvar Arnfjörð Bjarmason, Apr 28, 2021
  25. Nesting topics within other threads (was: [PATCH] repo-settings.c: simplify the setup)Derrick Stolee, Apr 28, 2021
  26. Ævar Arnfjörð BjarmasonApr 28, 2021
  27. Johannes SchindelinMay 5, 2021
  28. Junio C HamanoApr 29, 2021
  29. Ævar Arnfjörð BjarmasonApr 29, 2021
  30. Jeff KingApr 29, 2021
  31. Junio C HamanoApr 30, 2021
  32. Jeff HostetlerApr 30, 2021
  33. 15/23 fsmonitor-fs-listen-macos: implement FSEvent listener on MacOSJeff Hostetler via GitGitGadget, Apr 1, 2021
  34. Derrick StoleeApr 27, 2021
  35. Jeff HostetlerApr 30, 2021
  36. 12/23 fsmonitor--daemon: create token-based changed path cacheJeff Hostetler via GitGitGadget, Apr 1, 2021
  37. Derrick StoleeApr 26, 2021
  38. Jeff HostetlerApr 30, 2021
  39. 09/23 fsmonitor--daemon: implement daemon command optionsJeff Hostetler via GitGitGadget, Apr 1, 2021
  40. Derrick StoleeApr 26, 2021
  41. Derrick StoleeApr 26, 2021
  42. Jeff HostetlerApr 30, 2021
  43. Jeff HostetlerApr 30, 2021
  44. 11/23 fsmonitor--daemon: define token-idsJeff Hostetler via GitGitGadget, Apr 1, 2021
  45. Derrick StoleeApr 26, 2021
  46. Eric SunshineApr 26, 2021
  47. Derrick StoleeApr 26, 2021
  48. Jeff HostetlerApr 30, 2021
  49. 23/23 t7527: test status with untracked-cache and fsmonitor--daemonJeff Hostetler via GitGitGadget, Apr 1, 2021
  50. Derrick StoleeApr 27, 2021
  51. 21/23 t7527: create test for fsmonitor--daemonJeff Hostetler via GitGitGadget, Apr 1, 2021
  52. Derrick StoleeApr 27, 2021
  53. 16/23 fsmonitor--daemon: implement handle_client callbackJeff Hostetler via GitGitGadget, Apr 1, 2021
  54. Derrick StoleeApr 26, 2021
  55. Jeff HostetlerMay 3, 2021
  56. Derrick StoleeMay 13, 2021
  57. 05/23 fsmonitor--daemon: add a built-in fsmonitor daemonJeff Hostetler via GitGitGadget, Apr 1, 2021
  58. Derrick StoleeApr 26, 2021
  59. Derrick StoleeApr 26, 2021
  60. Jeff HostetlerApr 30, 2021
  61. 08/23 fsmonitor-fs-listen-macos: stub in backend for MacOSJeff Hostetler via GitGitGadget, Apr 1, 2021
  62. 18/23 fsmonitor--daemon:: introduce client delay for testingJeff Hostetler via GitGitGadget, Apr 1, 2021
  63. Derrick StoleeApr 27, 2021
  64. 13/23 fsmonitor-fs-listen-win32: implement FSMonitor backend on WindowsJeff Hostetler via GitGitGadget, Apr 1, 2021
  65. Derrick StoleeApr 27, 2021
  66. Eric SunshineApr 27, 2021
  67. Jeff HostetlerApr 30, 2021
  68. 22/23 p7519: add fsmonitor--daemonJeff Hostetler via GitGitGadget, Apr 1, 2021
  69. Derrick StoleeApr 27, 2021
  70. 10/23 fsmonitor--daemon: add pathname classificationJeff Hostetler via GitGitGadget, Apr 1, 2021
  71. Derrick StoleeApr 26, 2021
  72. Eric SunshineApr 26, 2021
  73. Derrick StoleeApr 26, 2021
  74. 03/23 config: FSMonitor is repository-specificJohannes Schindelin via GitGitGadget, Apr 1, 2021
  75. 07/23 fsmonitor-fs-listen-win32: stub in backend for WindowsJeff Hostetler via GitGitGadget, Apr 1, 2021
  76. Derrick StoleeApr 26, 2021
  77. 01/23 fsmonitor--daemon: man page and documentationJeff Hostetler via GitGitGadget, Apr 1, 2021
  78. Derrick StoleeApr 26, 2021
  79. Jeff HostetlerApr 28, 2021
  80. Junio C HamanoApr 16, 2021
  81. Johannes SchindelinApr 20, 2021
  82. Jeff HostetlerApr 20, 2021
  83. Derrick StoleeApr 21, 2021
  84. FS Monitor Windows Performance (was [PATCH 00/23] [RFC] Builtin FSMonitor Feature)Derrick Stolee, Apr 27, 2021
  85. FS Monitor macOS Performance (was [PATCH 00/23] [RFC] Builtin FSMonitor Feature)Derrick Stolee, Apr 27, 2021
  86. 00/28 Builtin FSMonitor FeatureJeff Hostetler via GitGitGadget, May 22, 2021
  87. 01/28 simple-ipc: preparations for supporting binary messages.Jeff Hostetler via GitGitGadget, May 22, 2021
  88. 05/28 help: include fsmonitor--daemon feature flag in version infoJeff Hostetler via GitGitGadget, May 22, 2021
  89. 03/28 fsmonitor--daemon: update fsmonitor documentationJeff Hostetler via GitGitGadget, May 22, 2021
  90. 02/28 fsmonitor--daemon: man pageJeff Hostetler via GitGitGadget, May 22, 2021
  91. 04/28 fsmonitor-ipc: create client routines for git-fsmonitor--daemonJeff Hostetler via GitGitGadget, May 22, 2021
  92. Johannes SchindelinJun 2, 2021
  93. Johannes SchindelinJun 14, 2021
  94. 06/28 config: FSMonitor is repository-specificJohannes Schindelin via GitGitGadget, May 22, 2021
  95. 08/28 fsmonitor--daemon: add a built-in fsmonitor daemonJeff Hostetler via GitGitGadget, May 22, 2021
  96. 07/28 fsmonitor: introduce `core.useBuiltinFSMonitor` to call the daemon via IPCJohannes Schindelin via GitGitGadget, May 22, 2021
  97. Johannes SchindelinJun 14, 2021
  98. 09/28 fsmonitor--daemon: implement client command optionsJeff Hostetler via GitGitGadget, May 22, 2021
  99. 10/28 t/helper/fsmonitor-client: create IPC client to talk to FSMonitor DaemonJeff Hostetler via GitGitGadget, May 22, 2021
  100. Junio C HamanoJun 11, 2021
  101. 12/28 fsmonitor-fs-listen-macos: stub in backend for MacOSJeff Hostetler via GitGitGadget, May 22, 2021
  102. 11/28 fsmonitor-fs-listen-win32: stub in backend for WindowsJeff Hostetler via GitGitGadget, May 22, 2021
  103. 13/28 fsmonitor--daemon: implement daemon command optionsJeff Hostetler via GitGitGadget, May 22, 2021
  104. 14/28 fsmonitor--daemon: add pathname classificationJeff Hostetler via GitGitGadget, May 22, 2021
  105. 17/28 fsmonitor-fs-listen-win32: implement FSMonitor backend on WindowsJeff Hostetler via GitGitGadget, May 22, 2021
  106. 16/28 fsmonitor--daemon: create token-based changed path cacheJeff Hostetler via GitGitGadget, May 22, 2021
  107. 15/28 fsmonitor--daemon: define token-idsJeff Hostetler via GitGitGadget, May 22, 2021
  108. 24/28 fsmonitor: force update index after large responsesJeff Hostetler via GitGitGadget, May 22, 2021
  109. 20/28 fsmonitor--daemon: implement handle_client callbackJeff Hostetler via GitGitGadget, May 22, 2021
  110. 21/28 fsmonitor--daemon: periodically truncate list of modified filesJeff Hostetler via GitGitGadget, May 22, 2021
  111. 19/28 fsmonitor-fs-listen-macos: implement FSEvent listener on MacOSJeff Hostetler via GitGitGadget, May 22, 2021
  112. 18/28 fsmonitor-fs-listen-macos: add macos header files for FSEventJeff Hostetler via GitGitGadget, May 22, 2021
  113. 23/28 fsmonitor: enhance existing commentsJeff Hostetler via GitGitGadget, May 22, 2021
  114. 22/28 fsmonitor--daemon: use a cookie file to sync with file systemJeff Hostetler via GitGitGadget, May 22, 2021
  115. Johannes SchindelinJun 14, 2021
  116. 25/28 t7527: create test for fsmonitor--daemonJeff Hostetler via GitGitGadget, May 22, 2021
  117. 26/28 p7519: add fsmonitor--daemonJeff Hostetler via GitGitGadget, May 22, 2021
  118. 27/28 t7527: test status with untracked-cache and fsmonitor--daemonJeff Hostetler via GitGitGadget, May 22, 2021
  119. 28/28 t/perf: avoid copying builtin fsmonitor files into test repoJeff Hostetler via GitGitGadget, May 22, 2021
  120. Junio C HamanoMay 27, 2021
  121. Johannes SchindelinJun 2, 2021
  122. Jeff HostetlerJun 22, 2021
  123. 00/34 Builtin FSMonitor FeatureJeff Hostetler via GitGitGadget, Jul 1, 2021
  124. 02/34 fsmonitor--daemon: man pageJeff Hostetler via GitGitGadget, Jul 1, 2021
  125. Ævar Arnfjörð BjarmasonJul 1, 2021
  126. Johannes SchindelinJul 5, 2021
  127. Jeff HostetlerJul 12, 2021
  128. Ævar Arnfjörð BjarmasonJul 13, 2021
  129. Johannes SchindelinJul 16, 2021
  130. Felipe ContrerasJul 16, 2021
  131. 01/34 simple-ipc: preparations for supporting binary messages.Jeff Hostetler via GitGitGadget, Jul 1, 2021
  132. 04/34 fsmonitor-ipc: create client routines for git-fsmonitor--daemonJeff Hostetler via GitGitGadget, Jul 1, 2021
  133. 05/34 help: include fsmonitor--daemon feature flag in version infoJeff Hostetler via GitGitGadget, Jul 1, 2021
  134. 03/34 fsmonitor--daemon: update fsmonitor documentationJeff Hostetler via GitGitGadget, Jul 1, 2021
  135. Ævar Arnfjörð BjarmasonJul 1, 2021
  136. 07/34 fsmonitor: use IPC to query the builtin FSMonitor daemonJeff Hostetler via GitGitGadget, Jul 1, 2021
  137. 08/34 fsmonitor--daemon: add a built-in fsmonitor daemonJeff Hostetler via GitGitGadget, Jul 1, 2021
  138. Ævar Arnfjörð BjarmasonJul 1, 2021
  139. Jeff HostetlerJul 19, 2021
  140. 06/34 fsmonitor: config settings are repository-specificJeff Hostetler via GitGitGadget, Jul 1, 2021
  141. Ævar Arnfjörð BjarmasonJul 1, 2021
  142. Jeff HostetlerJul 19, 2021
  143. 09/34 fsmonitor--daemon: implement 'stop' and 'status' commandsJeff Hostetler via GitGitGadget, Jul 1, 2021
  144. 11/34 fsmonitor-fs-listen-win32: stub in backend for WindowsJeff Hostetler via GitGitGadget, Jul 1, 2021
  145. Ævar Arnfjörð BjarmasonJul 1, 2021
  146. Johannes SchindelinJul 16, 2021
  147. Ævar Arnfjörð BjarmasonJul 16, 2021
  148. Junio C HamanoJul 17, 2021
  149. Junio C HamanoJul 17, 2021
  150. Ævar Arnfjörð BjarmasonJul 17, 2021
  151. Junio C HamanoJul 19, 2021
  152. Felipe ContrerasJul 16, 2021
  153. Jeff HostetlerJul 19, 2021
  154. Ævar Arnfjörð BjarmasonJul 20, 2021
  155. 13/34 fsmonitor--daemon: implement 'run' commandJeff Hostetler via GitGitGadget, Jul 1, 2021
  156. 10/34 t/helper/fsmonitor-client: create IPC client to talk to FSMonitor DaemonJeff Hostetler via GitGitGadget, Jul 1, 2021
  157. Ævar Arnfjörð BjarmasonJul 1, 2021
  158. 12/34 fsmonitor-fs-listen-macos: stub in backend for MacOSJeff Hostetler via GitGitGadget, Jul 1, 2021
  159. Ævar Arnfjörð BjarmasonJul 1, 2021
  160. Johannes SchindelinJul 16, 2021
  161. Ævar Arnfjörð BjarmasonJul 16, 2021
  162. Johannes SchindelinJul 26, 2021
  163. Junio C HamanoJul 26, 2021
  164. Jeff HostetlerJul 27, 2021
  165. Ævar Arnfjörð BjarmasonJul 27, 2021
  166. Junio C HamanoJul 27, 2021
  167. Felipe ContrerasJul 27, 2021
  168. 14/34 fsmonitor--daemon: implement 'start' commandJeff Hostetler via GitGitGadget, Jul 1, 2021
  169. Ævar Arnfjörð BjarmasonJul 1, 2021
  170. Johannes SchindelinJul 5, 2021
  171. Jeff HostetlerJul 13, 2021
  172. Ævar Arnfjörð BjarmasonJul 13, 2021
  173. Jeff HostetlerJul 13, 2021
  174. Ævar Arnfjörð BjarmasonJul 20, 2021
  175. 15/34 fsmonitor: do not try to operate on bare reposJeff Hostetler via GitGitGadget, Jul 1, 2021
  176. Ævar Arnfjörð BjarmasonJul 1, 2021
  177. 16/34 fsmonitor--daemon: add pathname classificationJeff Hostetler via GitGitGadget, Jul 1, 2021
  178. 18/34 fsmonitor--daemon: create token-based changed path cacheJeff Hostetler via GitGitGadget, Jul 1, 2021
  179. 17/34 fsmonitor--daemon: define token-idsJeff Hostetler via GitGitGadget, Jul 1, 2021
  180. Ævar Arnfjörð BjarmasonJul 1, 2021
  181. Jeff HostetlerJul 13, 2021
  182. Ævar Arnfjörð BjarmasonJul 13, 2021
  183. 20/34 fsmonitor-fs-listen-macos: add macos header files for FSEventJeff Hostetler via GitGitGadget, Jul 1, 2021
  184. 19/34 fsmonitor-fs-listen-win32: implement FSMonitor backend on WindowsJeff Hostetler via GitGitGadget, Jul 1, 2021
  185. Ævar Arnfjörð BjarmasonJul 1, 2021
  186. Jeff HostetlerJul 13, 2021
  187. Ævar Arnfjörð BjarmasonJul 13, 2021
  188. Johannes SchindelinJul 16, 2021
  189. Ævar Arnfjörð BjarmasonJul 16, 2021
  190. Eric WongJul 17, 2021
  191. Jeff HostetlerJul 19, 2021
  192. Felipe ContrerasJul 16, 2021
  193. Johannes SchindelinJul 6, 2021
  194. Jeff HostetlerJul 13, 2021
  195. 23/34 t/helper/test-touch: add helper to touch a series of filesJeff Hostetler via GitGitGadget, Jul 1, 2021
  196. Junio C HamanoJul 1, 2021
  197. Jeff HostetlerJul 13, 2021
  198. 24/34 t/perf/p7519: speed up test using "test-tool touch"Jeff Hostetler via GitGitGadget, Jul 1, 2021
  199. Ævar Arnfjörð BjarmasonJul 1, 2021
  200. Jeff HostetlerJul 13, 2021
  201. Elijah NewrenJul 13, 2021
  202. Junio C HamanoJul 13, 2021
  203. Elijah NewrenJul 13, 2021
  204. Jeff HostetlerJul 13, 2021
  205. Junio C HamanoJul 13, 2021
  206. Jeff HostetlerJul 13, 2021
  207. Ævar Arnfjörð BjarmasonJul 13, 2021
  208. Jeff HostetlerJul 13, 2021
  209. Ævar Arnfjörð BjarmasonJul 20, 2021
  210. Jeff HostetlerJul 13, 2021
  211. 22/34 fsmonitor--daemon: implement handle_client callbackJeff Hostetler via GitGitGadget, Jul 1, 2021
  212. 21/34 fsmonitor-fs-listen-macos: implement FSEvent listener on MacOSJeff Hostetler via GitGitGadget, Jul 1, 2021
  213. 25/34 t/perf: avoid copying builtin fsmonitor files into test repoJeff Hostetler via GitGitGadget, Jul 1, 2021
  214. Ævar Arnfjörð BjarmasonJul 1, 2021
  215. 29/34 fsmonitor--daemon: use a cookie file to sync with file systemJeff Hostetler via GitGitGadget, Jul 1, 2021
  216. Ævar Arnfjörð BjarmasonJul 1, 2021
  217. Jeff HostetlerJul 21, 2021
  218. 27/34 t7527: create test for fsmonitor--daemonJeff Hostetler via GitGitGadget, Jul 1, 2021
  219. Ævar Arnfjörð BjarmasonJul 1, 2021
  220. 26/34 t/perf/p7519: add fsmonitor--daemon test casesJeff Hostetler via GitGitGadget, Jul 1, 2021
  221. 28/34 fsmonitor--daemon: periodically truncate list of modified filesJeff Hostetler via GitGitGadget, Jul 1, 2021
  222. 30/34 fsmonitor: enhance existing commentsJeff Hostetler via GitGitGadget, Jul 1, 2021
  223. 32/34 t7527: test status with untracked-cache and fsmonitor--daemonJeff Hostetler via GitGitGadget, Jul 1, 2021
  224. 31/34 fsmonitor: force update index after large responsesJeff Hostetler via GitGitGadget, Jul 1, 2021
  225. 33/34 fsmonitor: handle shortname for .gitJeff Hostetler via GitGitGadget, Jul 1, 2021
  226. 34/34 t7527: test FS event reporing on MacOS WRT case and UnicodeJeff Hostetler via GitGitGadget, Jul 1, 2021
  227. Ævar Arnfjörð BjarmasonJul 1, 2021
  228. Ævar Arnfjörð BjarmasonJul 1, 2021
  229. Jeff HostetlerJul 1, 2021
  230. Ævar Arnfjörð BjarmasonJul 1, 2021
  231. Jeff HostetlerJul 2, 2021
  232. Ævar Arnfjörð BjarmasonJul 5, 2021
  233. Johannes SchindelinJul 5, 2021
  234. Ævar Arnfjörð BjarmasonJul 5, 2021
  235. Johannes SchindelinJul 6, 2021
  236. Felipe ContrerasJul 7, 2021
  237. Felipe ContrerasJul 7, 2021

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.