Hi Jeff, merely a comment: On Fri, 11 Feb 2022, Jeff Hostetler via GitGitGadget wrote: > +/* > + * Convert the WCHAR path from the notification into UTF8 and > + * then normalize it. > + */ > +static int normalize_path_in_utf8(FILE_NOTIFY_INFORMATION *info, > + struct strbuf *normalized_path) > +{ > + int reserve; > + int len = 0; > + > + strbuf_reset(normalized_path); > + if (!info->FileNameLength) > + goto normalize; > + > + /* > + * Pre-reserve enough space in the UTF8 buffer for > + * each Unicode WCHAR character to be mapped into a > + * sequence of 2 UTF8 characters. That should let us > + * avoid ERROR_INSUFFICIENT_BUFFER 99.9+% of the time. > + */ > + reserve = info->FileNameLength + 1; > + strbuf_grow(normalized_path, reserve); > + > + for (;;) { > + len = WideCharToMultiByte(CP_UTF8, 0, info->FileName, > + info->FileNameLength / sizeof(WCHAR), > + normalized_path->buf, > + strbuf_avail(normalized_path) - 1, > + NULL, NULL); > + if (len > 0) > + goto normalize; > + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { > + error("[GLE %ld] could not convert path to UTF-8: '%.*ls'", > + GetLastError(), > + (int)(info->FileNameLength / sizeof(WCHAR)), > + info->FileName); > + return -1; > + } > + > + strbuf_grow(normalized_path, > + strbuf_avail(normalized_path) + reserve); > + } > + > +normalize: > + strbuf_setlen(normalized_path, len); > + return strbuf_normalize_path(normalized_path); > +} There are Unicode pages that require quite a few more bytes per wide character (IIRC it can blow up to six bytes), but it should be good enough for now, and we can always revisit this easily enough at a later stage. I really like this patch, as it makes the complexities of handling two watches and the complexities of handling overlapped (and asynchronous) results look easy. Thank you! Dscho