Commit 0644c2e8c54784800f27ee7b389eccaff6745755

Edward Thomson 2021-09-20T08:39:46

Merge pull request #6058 from mathworks/proxy_config_with_detached_remote Allow proxy options when connecting with a detached remote.

diff --git a/src/remote.c b/src/remote.c
index 154300b..56d7e42 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -884,15 +884,22 @@ static void url_config_trim(git_net_url *url)
 
 static int http_proxy_config(char **out, git_remote *remote, git_net_url *url)
 {
-	git_config *cfg;
+	git_config *cfg = NULL;
 	git_buf buf = GIT_BUF_INIT;
 	git_net_url lookup_url = GIT_NET_URL_INIT;
 	int error;
 
-	if ((error = git_net_url_dup(&lookup_url, url)) < 0 ||
-	    (error = git_repository_config__weakptr(&cfg, remote->repo)) < 0)
+	if ((error = git_net_url_dup(&lookup_url, url)) < 0)
 		goto done;
 
+	if (remote->repo) {
+		if ((error = git_repository_config(&cfg, remote->repo)) < 0)
+			goto done;
+	} else {
+		if ((error = git_config_open_default(&cfg)) < 0)
+			goto done;
+	}
+
 	/* remote.<name>.proxy config setting */
 	if (remote->name && remote->name[0]) {
 		git_buf_clear(&buf);
@@ -922,6 +929,7 @@ static int http_proxy_config(char **out, git_remote *remote, git_net_url *url)
 	error = lookup_config(out, cfg, "http.proxy");
 
 done:
+	git_config_free(cfg);
 	git_buf_dispose(&buf);
 	git_net_url_dispose(&lookup_url);
 	return error;
@@ -971,7 +979,6 @@ int git_remote__http_proxy(char **out, git_remote *remote, git_net_url *url)
 
 	GIT_ASSERT_ARG(out);
 	GIT_ASSERT_ARG(remote);
-	GIT_ASSERT_ARG(remote->repo);
 
 	*out = NULL;
 
diff --git a/tests/remote/httpproxy.c b/tests/remote/httpproxy.c
index 097db4c..182ea24 100644
--- a/tests/remote/httpproxy.c
+++ b/tests/remote/httpproxy.c
@@ -1,6 +1,7 @@
 #include "clar_libgit2.h"
-#include "remote.h"
+#include "futils.h"
 #include "net.h"
+#include "remote.h"
 
 static git_repository *repo;
 static git_net_url url = GIT_NET_URL_INIT;
@@ -105,6 +106,45 @@ void test_remote_httpproxy__config_empty_overrides(void)
 	assert_config_match("remote.lg2.proxy", "");
 }
 
+void assert_global_config_match(const char *config, const char *expected)
+{
+	git_remote *remote;
+	char *proxy;
+	git_config* cfg;
+
+	if (config) {
+		cl_git_pass(git_config_open_default(&cfg));
+		git_config_set_string(cfg, config, expected);
+		git_config_free(cfg);
+	}
+
+	cl_git_pass(git_remote_create_detached(&remote, "https://github.com/libgit2/libgit2"));
+	cl_git_pass(git_remote__http_proxy(&proxy, remote, &url));
+
+	if (expected)
+		cl_assert_equal_s(proxy, expected);
+	else
+		cl_assert_equal_p(proxy, expected);
+
+	git_remote_free(remote);
+	git__free(proxy);
+}
+
+void test_remote_httpproxy__config_overrides_detached_remote(void)
+{
+	cl_fake_home();
+
+	assert_global_config_match(NULL, NULL);
+	assert_global_config_match("http.proxy", "http://localhost:1/");
+	assert_global_config_match("http.https://github.com.proxy", "http://localhost:2/");
+	assert_global_config_match("http.https://github.com/.proxy", "http://localhost:3/");
+	assert_global_config_match("http.https://github.com/libgit2.proxy", "http://localhost:4/");
+	assert_global_config_match("http.https://github.com/libgit2/.proxy", "http://localhost:5/");
+	assert_global_config_match("http.https://github.com/libgit2/libgit2.proxy", "http://localhost:6/");
+
+	cl_git_pass(git_futils_rmdir_r("home", NULL, GIT_RMDIR_REMOVE_FILES));
+}
+
 void test_remote_httpproxy__env(void)
 {
 	orig_http_proxy = cl_getenv("HTTP_PROXY");