Commit cb2ace69f453c598e97697fda449e8ce75fd5c0a

Jameson Miller 2012-12-13T12:51:23

Transport resolution on Win32 should handle absolute local paths

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;