From cb2ace69f453c598e97697fda449e8ce75fd5c0a Mon Sep 17 00:00:00 2001 From: Jameson Miller Date: Thu, 13 Dec 2012 12:51:23 -0500 Subject: [PATCH 1/3] 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; From 8a8820d89fce2831e4a3efffcd9b75cbc479152a Mon Sep 17 00:00:00 2001 From: Jameson Miller Date: Thu, 13 Dec 2012 17:58:12 -0500 Subject: [PATCH 2/3] Add test to clone with absolute path --- tests-clar/clone/nonetwork.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests-clar/clone/nonetwork.c b/tests-clar/clone/nonetwork.c index fbebe5460..84327081e 100644 --- a/tests-clar/clone/nonetwork.c +++ b/tests-clar/clone/nonetwork.c @@ -39,6 +39,14 @@ void test_clone_nonetwork__local(void) cl_git_pass(git_clone(&g_repo, src, "./local", NULL, NULL, NULL)); } +void test_clone_nonetwork__local_absolute_path(void) +{ + const char *src = cl_fixture("testrepo.git"); + cl_set_cleanup(&cleanup_repository, "./local"); + + cl_git_pass(git_clone(&g_repo, src, "./local", NULL, NULL, NULL)); +} + void test_clone_nonetwork__local_bare(void) { const char *src = cl_git_fixture_url("testrepo.git"); From f0a2def5e4f0d8e91bf6fca66ac64d8a8c893c84 Mon Sep 17 00:00:00 2001 From: Jameson Miller Date: Thu, 13 Dec 2012 18:08:45 -0500 Subject: [PATCH 3/3] Fix comment so it doesn't go over 100 chars --- src/transport.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/transport.c b/src/transport.c index 1c4f3301b..b69072f94 100644 --- a/src/transport.c +++ b/src/transport.c @@ -62,16 +62,18 @@ static int transport_find_fn(const char *url, git_transport_cb *callback, void * 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 : */ + /* It could be a SSH remote path. Check to see if there's a : + * SSH is an unsupported transport mechanism in this version of libgit2 */ if (!definition && strrchr(url, ':')) - definition = &dummy_transport_definition; /* SSH is an unsupported transport mechanism in this version of libgit2 */ + definition = &dummy_transport_definition; #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 : */ + /* It could be a SSH remote path. Check to see if there's a : + * SSH is an unsupported transport mechanism in this version of libgit2 */ if (!definition && strrchr(url, ':')) - definition = &dummy_transport_definition; /* SSH is an unsupported transport mechanism in this version of libgit2 */ + definition = &dummy_transport_definition; /* 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))