summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2012-12-14 00:16:03 +0100
committerVicent Marti <tanoku@gmail.com>2012-12-14 00:16:03 +0100
commit44f5f777aeca736a3ccbd2e099a608cc2687b508 (patch)
treed7be41efb913387577f01903dacfcebb8e869951
parentae0ddc6f024c52d8a4144b31ff122b922d72aeb4 (diff)
parentf0a2def5e4f0d8e91bf6fca66ac64d8a8c893c84 (diff)
downloadlibgit2-44f5f777aeca736a3ccbd2e099a608cc2687b508.tar.gz
Merge remote-tracking branch 'jamill/transport_localpaths' into development
-rw-r--r--src/transport.c35
-rw-r--r--tests-clar/clone/nonetwork.c8
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");