Merge pull request #2802 from calavera/remote_create_prune_config Load prune configuration when a remote is created.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
diff --git a/src/remote.c b/src/remote.c
index bc6f10b..c79e58a 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -21,6 +21,7 @@
#include "push.h"
static int dwim_refspecs(git_vector *out, git_vector *refspecs, git_vector *refs);
+static int lookup_remote_prune_config(git_remote *remote, git_config *config, const char *name);
static int add_refspec_to(git_vector *vector, const char *string, bool is_fetch)
{
@@ -138,6 +139,7 @@ static int canonicalize_url(git_buf *out, const char *in)
static int create_internal(git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch)
{
git_remote *remote;
+ git_config *config;
git_buf canonical_url = GIT_BUF_INIT, fetchbuf = GIT_BUF_INIT;
int error = -1;
@@ -165,6 +167,12 @@ static int create_internal(git_remote **out, git_repository *repo, const char *n
if (add_refspec(remote, fetch, true) < 0)
goto on_error;
+ if ((error = git_repository_config_snapshot(&config, repo)) < 0)
+ goto on_error;
+
+ if (lookup_remote_prune_config(remote, config, name) < 0)
+ goto on_error;
+
/* Move the data over to where the matching functions can find them */
if (dwim_refspecs(&remote->active_refspecs, &remote->refspecs, &remote->refs) < 0)
goto on_error;
@@ -181,6 +189,7 @@ static int create_internal(git_remote **out, git_repository *repo, const char *n
on_error:
git_remote_free(remote);
+ git_config_free(config);
git_buf_free(&fetchbuf);
git_buf_free(&canonical_url);
return error;
@@ -444,7 +453,30 @@ int git_remote_lookup(git_remote **out, git_repository *repo, const char *name)
if (download_tags_value(remote, config) < 0)
goto cleanup;
- git_buf_clear(&buf);
+ if ((error = lookup_remote_prune_config(remote, config, name)) < 0)
+ goto cleanup;
+
+ /* Move the data over to where the matching functions can find them */
+ if (dwim_refspecs(&remote->active_refspecs, &remote->refspecs, &remote->refs) < 0)
+ goto cleanup;
+
+ *out = remote;
+
+cleanup:
+ git_config_free(config);
+ git_buf_free(&buf);
+
+ if (error < 0)
+ git_remote_free(remote);
+
+ return error;
+}
+
+static int lookup_remote_prune_config(git_remote *remote, git_config *config, const char *name)
+{
+ git_buf buf = GIT_BUF_INIT;
+ int error = 0;
+
git_buf_printf(&buf, "remote.%s.prune", name);
if ((error = git_config_get_bool(&remote->prune_refs, config, git_buf_cstr(&buf))) < 0) {
@@ -460,19 +492,7 @@ int git_remote_lookup(git_remote **out, git_repository *repo, const char *name)
}
}
- /* Move the data over to where the matching functions can find them */
- if (dwim_refspecs(&remote->active_refspecs, &remote->refspecs, &remote->refs) < 0)
- goto cleanup;
-
- *out = remote;
-
-cleanup:
- git_config_free(config);
git_buf_free(&buf);
-
- if (error < 0)
- git_remote_free(remote);
-
return error;
}
diff --git a/tests/network/fetchlocal.c b/tests/network/fetchlocal.c
index effdc05..af19226 100644
--- a/tests/network/fetchlocal.c
+++ b/tests/network/fetchlocal.c
@@ -481,3 +481,47 @@ void test_network_fetchlocal__call_progress(void)
git_remote_free(remote);
git_repository_free(repo);
}
+
+void test_network_fetchlocal__prune_load_remote_prune_config(void)
+{
+ git_repository *repo;
+ git_remote *origin;
+ git_config *config;
+ git_repository *remote_repo = cl_git_sandbox_init("testrepo.git");
+ const char *url = cl_git_path_url(git_repository_path(remote_repo));
+
+ cl_set_cleanup(&cleanup_local_repo, "foo");
+ cl_git_pass(git_repository_init(&repo, "foo", true));
+
+ cl_git_pass(git_repository_config(&config, repo));
+ cl_git_pass(git_config_set_bool(config, "remote.origin.prune", 1));
+
+ cl_git_pass(git_remote_create(&origin, repo, GIT_REMOTE_ORIGIN, url));
+ cl_assert_equal_i(1, git_remote_prune_refs(origin));
+
+ git_config_free(config);
+ git_remote_free(origin);
+ git_repository_free(repo);
+}
+
+void test_network_fetchlocal__prune_load_fetch_prune_config(void)
+{
+ git_repository *repo;
+ git_remote *origin;
+ git_config *config;
+ git_repository *remote_repo = cl_git_sandbox_init("testrepo.git");
+ const char *url = cl_git_path_url(git_repository_path(remote_repo));
+
+ cl_set_cleanup(&cleanup_local_repo, "foo");
+ cl_git_pass(git_repository_init(&repo, "foo", true));
+
+ cl_git_pass(git_repository_config(&config, repo));
+ cl_git_pass(git_config_set_bool(config, "fetch.prune", 1));
+
+ cl_git_pass(git_remote_create(&origin, repo, GIT_REMOTE_ORIGIN, url));
+ cl_assert_equal_i(1, git_remote_prune_refs(origin));
+
+ git_config_free(config);
+ git_remote_free(origin);
+ git_repository_free(repo);
+}