Merge branch 'tb/push-to-cygwin-unc-path'
authorJunio C Hamano <gitster@pobox.com>
Tue, 18 Jul 2017 19:48:09 +0000 (12:48 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 18 Jul 2017 19:48:09 +0000 (12:48 -0700)
On Cygwin, similar to Windows, "git push //server/share/repository"
ought to mean a repository on a network share that can be accessed
locally, but this did not work correctly due to stripping the double
slashes at the beginning.

This may need to be heavily tested before it gets unleashed to the
wild, as the change is at a fairly low-level code and would affect
not just the code to decide if the push destination is local. There
may be unexpected fallouts in the path normalization.

* tb/push-to-cygwin-unc-path:
cygwin: allow pushing to UNC paths

compat/cygwin.c [new file with mode: 0644]
compat/cygwin.h [new file with mode: 0644]
config.mak.uname
git-compat-util.h
t/t0060-path-utils.sh
diff --git a/compat/cygwin.c b/compat/cygwin.c
new file mode 100644 (file)
index 0000000..b9862d6
--- /dev/null
@@ -0,0 +1,19 @@
+#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;
+}
diff --git a/compat/cygwin.h b/compat/cygwin.h
new file mode 100644 (file)
index 0000000..8e52de4
--- /dev/null
@@ -0,0 +1,2 @@
+int cygwin_offset_1st_component(const char *path);
+#define offset_1st_component cygwin_offset_1st_component
index adfb90b6018a87a6fb3455635590aec374fd170b..551e465a78242d15ddc472e28351df705f706d88 100644 (file)
@@ -184,6 +184,7 @@ ifeq ($(uname_O),Cygwin)
        UNRELIABLE_FSTAT = UnfortunatelyYes
        SPARSE_FLAGS = -isystem /usr/include/w32api -Wno-one-bit-signed-bitfield
        OBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo
+       COMPAT_OBJS += compat/cygwin.o
 endif
 ifeq ($(uname_S),FreeBSD)
        NEEDS_LIBICONV = YesPlease
index 047172d173c495d7e723a00db5d563113978f917..db9c22de7693af4e905fdeb0a1766ba4469eda94 100644 (file)
 #include <sys/sysctl.h>
 #endif
 
+#if defined(__CYGWIN__)
+#include "compat/cygwin.h"
+#endif
 #if defined(__MINGW32__)
 /* pull in Windows compatibility stuff */
 #include "compat/mingw.h"
index 444b5a4df801975cf4f96f8193cb04ac91af3e4d..7ea2bb515bd80cc026a18dbfdf4a66cb77d27f20 100755 (executable)
@@ -70,6 +70,8 @@ ancestor() {
 case $(uname -s) in
 *MINGW*)
        ;;
+*CYGWIN*)
+       ;;
 *)
        test_set_prereq POSIX
        ;;