Thread (34 messages) flat view 34 messages, 6 authors, 2019-05-02

Re: Cygwin Git with Windows paths

From: Torsten Bögershausen <hidden>
Date: 2018-11-18 15:41:29
Subsystem: the rest · Maintainer: Linus Torvalds

On Sun, Nov 18, 2018 at 07:21:58AM -0800, Steven Penny wrote:
Cygwin programs can handle Unix form paths:

   $ ls /var
   cache  lib  log  run  tmp

and also Windows form paths:

   $ ls 'C:\cygwin64\var'
   cache  lib  log  run  tmp

However current Cygwin Git cannot:

   $ git clone git://github.com/benhoyt/goawk 'C:\cygwin64\tmp\goawk'
   Cloning into 'C:\cygwin64\tmp\goawk'...
   fatal: Invalid path '/home/Steven/C:\cygwin64\tmp\goawk': No such file or
   directory

It seems the problem is that Git thinks the Windows form path is relative
because it does not start with "/". A Git Bisect reveals this:

05b458c104708141d2fad211d79703b3b99cc5a8 is the first bad commit
commit 05b458c104708141d2fad211d79703b3b99cc5a8
Author: Brandon Williams [off-list ref]
Date:   Mon Dec 12 10:16:52 2016 -0800

   real_path: resolve symlinks by hand

   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 and not just an individual thread.  Instead perform
   the symlink resolution by hand so that the calls to chdir() can be
   removed, making real_path one step closer to being reentrant.

   Signed-off-by: Brandon Williams [off-list ref]
   Signed-off-by: Junio C Hamano [off-list ref]

This causes problems for any non-Cygwin tools that might call Git:

http://github.com/golang/go/issues/23155
Thanks for the report
It seams as if "C:" is not recognized as an absolute path under
cygwin.
May be it should ?

Does the following help ? (fully untested)

diff --git a/compat/cygwin.h b/compat/cygwin.h
index 8e52de4644..12814e1edb 100644
--- a/compat/cygwin.h
+++ b/compat/cygwin.h
@@ -1,2 +1,4 @@
 int cygwin_offset_1st_component(const char *path);
 #define offset_1st_component cygwin_offset_1st_component
+#define has_dos_drive_prefix(path) \
+       (isalpha(*(path)) && (path)[1] == ':' ? 2 : 0)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help