Commit eff5b4992731cd01f1bc6a457e8d2f86428a8b55

Sascha Cunz 2012-07-25T02:34:12

Remotes: Use correct url in git_remote_connect

diff --git a/src/remote.c b/src/remote.c
index bee1ab6..b4a21a6 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -356,13 +356,32 @@ const git_refspec *git_remote_pushspec(git_remote *remote)
 	return &remote->push;
 }
 
+const char* git_remote__urlfordirection(git_remote *remote, int direction)
+{
+	assert(remote);
+
+	if (direction == GIT_DIR_FETCH) {
+		return remote->url;
+	}
+
+	if (direction == GIT_DIR_PUSH) {
+		return remote->pushurl ? remote->pushurl : remote->url;
+	}
+
+	return NULL;
+}
+
 int git_remote_connect(git_remote *remote, int direction)
 {
 	git_transport *t;
 
 	assert(remote);
 
-	if (git_transport_new(&t, remote->url) < 0)
+	const char* url = git_remote__urlfordirection(remote, direction);
+	if (url == NULL )
+		return -1;
+
+	if (git_transport_new(&t, url) < 0)
 		return -1;
 
 	t->check_cert = remote->check_cert;
diff --git a/src/remote.h b/src/remote.h
index abdaa57..623d40c 100644
--- a/src/remote.h
+++ b/src/remote.h
@@ -24,4 +24,6 @@ struct git_remote {
 		check_cert;
 };
 
+const char* git_remote__urlfordirection(struct git_remote *remote, int direction);
+
 #endif
diff --git a/tests-clar/network/remotes.c b/tests-clar/network/remotes.c
index 3d989c1..f1d6f47 100644
--- a/tests-clar/network/remotes.c
+++ b/tests-clar/network/remotes.c
@@ -2,6 +2,7 @@
 #include "buffer.h"
 #include "refspec.h"
 #include "transport.h"
+#include "remote.h"
 
 static git_remote *_remote;
 static git_repository *_repo;
@@ -33,10 +34,21 @@ void test_network_remotes__parsing(void)
 	cl_assert_equal_s(git_remote_url(_remote), "git://github.com/libgit2/libgit2");
 	cl_assert(git_remote_pushurl(_remote) == NULL);
 
+	cl_assert_equal_s(git_remote__urlfordirection(_remote, GIT_DIR_FETCH),
+					  "git://github.com/libgit2/libgit2");
+	cl_assert_equal_s(git_remote__urlfordirection(_remote, GIT_DIR_PUSH),
+					  "git://github.com/libgit2/libgit2");
+
 	cl_git_pass(git_remote_load(&_remote2, _repo, "test_with_pushurl"));
 	cl_assert_equal_s(git_remote_name(_remote2), "test_with_pushurl");
 	cl_assert_equal_s(git_remote_url(_remote2), "git://github.com/libgit2/fetchlibgit2");
 	cl_assert_equal_s(git_remote_pushurl(_remote2), "git://github.com/libgit2/pushlibgit2");
+
+	cl_assert_equal_s(git_remote__urlfordirection(_remote2, GIT_DIR_FETCH),
+					  "git://github.com/libgit2/fetchlibgit2");
+	cl_assert_equal_s(git_remote__urlfordirection(_remote2, GIT_DIR_PUSH),
+					  "git://github.com/libgit2/pushlibgit2");
+
 	git_remote_free(_remote2);
 }