compat/mingw: implement a native locate_in_PATH()

since 5e1f28d (bisect--helper: reimplement `bisect_visualize()` shell function in C, 2021-09-13) `git bisect visualize` uses exists_in_PATH() to check wether it should call `gitk`, but exists_in_PATH() relies on locate_in_PATH() which currently only understands POSIX-ish PATH variables (a list of paths, separated by colons) on native Windows executables we encounter Windows PATH variables (a list of paths that often contain drive letters (and thus colons), separated by semicolons). Luckily we do already have a function that can lookup executables on windows PATHs: path_lookup(). Implement a small replacement for the existing locate_in_PATH() based on path_lookup(). Reported-by: Louis Strous <Louis.Strous@intellimagic.com> Signed-off-by: Matthias Aßhauer <mha1993@live.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Matthias Aßhauer committed Aug 4, 2023 at 04:08 UTC 2bf46a9f62159ced3a84ab8bc9ba151778414bd6
2 files changed +8
compat/mingw.c
+5
@@ -1347,6 +1347,11 @@ static char *path_lookup(const char *cmd, int exe_only)
1347 return prog;
1348 }
1349
1350 +char *mingw_locate_in_PATH(const char *cmd)
1351 +{
1352 + return path_lookup(cmd, 0);
1353 +}
1354 +
1355 static const wchar_t *wcschrnul(const wchar_t *s, wchar_t c)
1356 {
1357 while (*s && *s != c)
compat/mingw.h
+3
@@ -175,6 +175,9 @@ pid_t waitpid(pid_t pid, int *status, int options);
175 #define kill mingw_kill
176 int mingw_kill(pid_t pid, int sig);
177
178 +#define locate_in_PATH mingw_locate_in_PATH
179 +char *mingw_locate_in_PATH(const char *cmd);
180 +
181 #ifndef NO_OPENSSL
182 #include <openssl/ssl.h>
183 static inline int mingw_SSL_set_fd(SSL *ssl, int fd)