
A regression for cygwin users was introduced with commit 05b458c, "real_path: resolve symlinks by hand". In the the commit message we read: The current implementation of real_path uses chdir() in order to resolve symlinks. Unfortunately this isn't thread-safe as chdir() affects a process as a whole... The old (and non-thread-save) OS calls chdir()/pwd() had been replaced by a string operation. The cygwin layer "knows" that "C:\cygwin" is an absolute path, but the new string operation does not. "git clone <url> C:\cygwin\home\USER\repo" fails like this: fatal: Invalid path '/home/USER/repo/C:\cygwin\home\USER\repo' The solution is to implement has_dos_drive_prefix(), skip_dos_drive_prefix() is_dir_sep(), offset_1st_component() and convert_slashes() for cygwin in the same way as it is done in 'Git for Windows' in compat/mingw.[ch] Extract the needed code into compat/win32/path-utils.[ch] and use it for cygwin as well. Reported-by: Steven Penny <svnpenn@gmail.com> Helped-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Torsten Bögershausen <tboegi@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 lines
627 B
C
21 lines
627 B
C
#define has_dos_drive_prefix(path) \
|
|
(isalpha(*(path)) && (path)[1] == ':' ? 2 : 0)
|
|
int win32_skip_dos_drive_prefix(char **path);
|
|
#define skip_dos_drive_prefix win32_skip_dos_drive_prefix
|
|
static inline int win32_is_dir_sep(int c)
|
|
{
|
|
return c == '/' || c == '\\';
|
|
}
|
|
#define is_dir_sep win32_is_dir_sep
|
|
static inline char *win32_find_last_dir_sep(const char *path)
|
|
{
|
|
char *ret = NULL;
|
|
for (; *path; ++path)
|
|
if (is_dir_sep(*path))
|
|
ret = (char *)path;
|
|
return ret;
|
|
}
|
|
#define find_last_dir_sep win32_find_last_dir_sep
|
|
int win32_offset_1st_component(const char *path);
|
|
#define offset_1st_component win32_offset_1st_component
|