diff options
author | Torsten Bögershausen <tboegi@web.de> | 2018-12-15 04:33:30 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-12-26 23:26:17 (GMT) |
commit | 1cadad6f658bfb3ab54b25dd04bac372253473b6 (patch) | |
tree | 78a76cdc3a651aeef35138b750c43beea1f8154a /compat/cygwin.c | |
parent | 98cdfbb84ad2ed6a2eb43dafa357a70a4b0a0fad (diff) | |
download | git-1cadad6f658bfb3ab54b25dd04bac372253473b6.zip git-1cadad6f658bfb3ab54b25dd04bac372253473b6.tar.gz git-1cadad6f658bfb3ab54b25dd04bac372253473b6.tar.bz2 |
git clone <url> C:\cygwin\home\USER\repo' is working (again)
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>
Diffstat (limited to 'compat/cygwin.c')
-rw-r--r-- | compat/cygwin.c | 19 |
1 files changed, 0 insertions, 19 deletions
diff --git a/compat/cygwin.c b/compat/cygwin.c deleted file mode 100644 index b9862d6..0000000 --- a/compat/cygwin.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "../git-compat-util.h" -#include "../cache.h" - -int cygwin_offset_1st_component(const char *path) -{ - const char *pos = path; - /* unc paths */ - if (is_dir_sep(pos[0]) && is_dir_sep(pos[1])) { - /* skip server name */ - pos = strchr(pos + 2, '/'); - if (!pos) - return 0; /* Error: malformed unc path */ - - do { - pos++; - } while (*pos && pos[0] != '/'); - } - return pos + is_dir_sep(*pos) - path; -} |