diff options
author | Vicent Marti <tanoku@gmail.com> | 2012-12-14 00:16:03 +0100 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2012-12-14 00:16:03 +0100 |
commit | 44f5f777aeca736a3ccbd2e099a608cc2687b508 (patch) | |
tree | d7be41efb913387577f01903dacfcebb8e869951 | |
parent | ae0ddc6f024c52d8a4144b31ff122b922d72aeb4 (diff) | |
parent | f0a2def5e4f0d8e91bf6fca66ac64d8a8c893c84 (diff) | |
download | libgit2-44f5f777aeca736a3ccbd2e099a608cc2687b508.tar.gz |
Merge remote-tracking branch 'jamill/transport_localpaths' into development
-rw-r--r-- | src/transport.c | 35 | ||||
-rw-r--r-- | tests-clar/clone/nonetwork.c | 8 |
2 files changed, 34 insertions, 9 deletions
diff --git a/src/transport.c b/src/transport.c index 9c88d983e..b69072f94 100644 --- a/src/transport.c +++ b/src/transport.c @@ -53,15 +53,32 @@ 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 : + * SSH is an unsupported transport mechanism in this version of libgit2 */ + if (!definition && strrchr(url, ':')) + 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 : + * SSH is an unsupported transport mechanism in this version of libgit2 */ + if (!definition && strrchr(url, ':')) + 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)) + definition = &local_transport_definition; +#endif if (!definition) return -1; 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"); |