From cb2ace69f453c598e97697fda449e8ce75fd5c0a Mon Sep 17 00:00:00 2001 From: Jameson Miller Date: Thu, 13 Dec 2012 12:51:23 -0500 Subject: [PATCH] Transport resolution on Win32 should handle absolute local paths --- src/transport.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/transport.c b/src/transport.c index 9c88d983e..1c4f3301b 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; +#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 */ - /* 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 */ - } + /* 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;