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 146 147 148 149 150 151 152
diff --git a/src/remote.c b/src/remote.c
index bc6f10b..1b6a118 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) {
@@ -454,25 +486,13 @@ int git_remote_lookup(git_remote **out, git_repository *repo, const char *name)
if ((error = git_config_get_bool(&remote->prune_refs, config, "fetch.prune")) < 0) {
if (error == GIT_ENOTFOUND) {
giterr_clear();
- error = 0;
+ error = 0;
}
}
}
}
- /* 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..d05e6ec 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);
+}