Transport resolution on Win32 should handle absolute local paths
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
diff --git a/src/transport.c b/src/transport.c
index 9c88d98..1c4f330 100644
--- a/src/transport.c
+++ b/src/transport.c
@@ -53,15 +53,30 @@ static int transport_find_fn(const char *url, git_transport_cb *callback, void *
definition = definition_iter;
}
- if (!definition) {
- /* still here? Check to see if the path points to a file on the local file system */
- if ((git_path_exists(url) == 0) && git_path_isdir(url))
- definition = &local_transport_definition;
-
- /* It could be a SSH remote path. Check to see if there's a : */
- if (strrchr(url, ':'))
- definition = &dummy_transport_definition; /* SSH is an unsupported transport mechanism in this version of libgit2 */
- }
+#ifdef GIT_WIN32
+ /* On Windows, it might not be possible to discern between absolute local
+ * and ssh paths - first check if this is a valid local path that points
+ * to a directory and if so assume local path, else assume SSH */
+
+ /* Check to see if the path points to a file on the local file system */
+ if (!definition && git_path_exists(url) && git_path_isdir(url))
+ definition = &local_transport_definition;
+
+ /* It could be a SSH remote path. Check to see if there's a : */
+ if (!definition && strrchr(url, ':'))
+ definition = &dummy_transport_definition; /* SSH is an unsupported transport mechanism in this version of libgit2 */
+#else
+ /* For other systems, perform the SSH check first, to avoid going to the
+ * filesystem if it is not necessary */
+
+ /* It could be a SSH remote path. Check to see if there's a : */
+ if (!definition && strrchr(url, ':'))
+ definition = &dummy_transport_definition; /* SSH is an unsupported transport mechanism in this version of libgit2 */
+
+ /* Check to see if the path points to a file on the local file system */
+ if (!definition && git_path_exists(url) && git_path_isdir(url))
+ definition = &local_transport_definition;
+#endif
if (!definition)
return -1;