repository: introduce a convenience config snapshot method Accessing the repository's config and immediately taking a snapshot of it is a common operation, so let's provide a convenience function for it.
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 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
diff --git a/include/git2/repository.h b/include/git2/repository.h
index 4433e71..37140d4 100644
--- a/include/git2/repository.h
+++ b/include/git2/repository.h
@@ -409,13 +409,25 @@ GIT_EXTERN(int) git_repository_is_bare(git_repository *repo);
* The configuration file must be freed once it's no longer
* being used by the user.
*
- * @param out Pointer to store the loaded config file
+ * @param out Pointer to store the loaded configuration
* @param repo A repository object
* @return 0, or an error code
*/
GIT_EXTERN(int) git_repository_config(git_config **out, git_repository *repo);
/**
+ * Get a snapshot of the repository's configuration
+ *
+ * Convenience function to take a snapshot from the repository's
+ * configuration.
+ *
+ * @param out Pointer to store the loaded configuration
+ * @param repo the repository
+ * @return 0, or an error code
+ */
+GIT_EXTERN(int) git_repository_config_snapshot(git_config **out, git_repository *repo);
+
+/**
* Get the Object Database for this repository.
*
* If a custom ODB has not been set, the default
diff --git a/src/branch.c b/src/branch.c
index d8c82b7..5276085 100644
--- a/src/branch.c
+++ b/src/branch.c
@@ -332,7 +332,7 @@ int git_branch_upstream_name(
int error = -1;
git_remote *remote = NULL;
const git_refspec *refspec;
- git_config *config, *repo_config;
+ git_config *config;
assert(out && refname);
@@ -341,10 +341,7 @@ int git_branch_upstream_name(
if (!git_reference__is_branch(refname))
return not_a_local_branch(refname);
- if ((error = git_repository_config__weakptr(&repo_config, repo)) < 0)
- return error;
-
- if ((error = git_config_snapshot(&config, repo_config)) < 0)
+ if ((error = git_repository_config_snapshot(&config, repo)) < 0)
return error;
if ((error = retrieve_upstream_configuration(
diff --git a/src/diff_driver.c b/src/diff_driver.c
index 6e87fd6..28c0a6b 100644
--- a/src/diff_driver.c
+++ b/src/diff_driver.c
@@ -234,14 +234,11 @@ static int git_diff_driver_load(
}
/* if you can't read config for repo, just use default driver */
- if (git_repository_config__weakptr(&repo_cfg, repo) < 0) {
+ if (git_repository_config_snapshot(&cfg, repo) < 0) {
giterr_clear();
goto done;
}
- if ((error = git_config_snapshot(&cfg, repo_cfg)) < 0)
- return error;
-
drv = git__calloc(1, sizeof(git_diff_driver) + namelen + 1);
GITERR_CHECK_ALLOC(drv);
drv->type = DIFF_DRIVER_AUTO;
diff --git a/src/pack-objects.c b/src/pack-objects.c
index e7c7f39..882ddf5 100644
--- a/src/pack-objects.c
+++ b/src/pack-objects.c
@@ -86,14 +86,11 @@ static unsigned name_hash(const char *name)
static int packbuilder_config(git_packbuilder *pb)
{
- git_config *config, *repo_config;
+ git_config *config;
int ret;
int64_t val;
- if ((ret = git_repository_config__weakptr(&repo_config, pb->repo)) < 0)
- return ret;
-
- if ((ret = git_config_snapshot(&config, repo_config)) < 0)
+ if ((ret = git_repository_config_snapshot(&config, pb->repo)) < 0)
return ret;
#define config_get(KEY,DST,DFLT) do { \
diff --git a/src/remote.c b/src/remote.c
index 3a754d4..0a6b72f 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -347,7 +347,7 @@ int git_remote_load(git_remote **out, git_repository *repo, const char *name)
git_buf buf = GIT_BUF_INIT;
const char *val;
int error = 0;
- git_config *config, *repo_config;
+ git_config *config;
struct refspec_cb_data data = { NULL };
bool optional_setting_found = false, found;
@@ -356,10 +356,7 @@ int git_remote_load(git_remote **out, git_repository *repo, const char *name)
if ((error = ensure_remote_name_is_valid(name)) < 0)
return error;
- if (git_repository_config__weakptr(&repo_config, repo) < 0)
- return -1;
-
- if ((error = git_config_snapshot(&config, repo_config)) < 0)
+ if ((error = git_repository_config_snapshot(&config, repo)) < 0)
return error;
remote = git__malloc(sizeof(git_remote));
diff --git a/src/repository.c b/src/repository.c
index c1d9830..dfddc59 100644
--- a/src/repository.c
+++ b/src/repository.c
@@ -439,7 +439,7 @@ int git_repository_open_ext(
int error;
git_buf path = GIT_BUF_INIT, parent = GIT_BUF_INIT;
git_repository *repo;
- git_config *repo_config, *config;
+ git_config *config;
if (repo_ptr)
*repo_ptr = NULL;
@@ -454,10 +454,7 @@ int git_repository_open_ext(
repo->path_repository = git_buf_detach(&path);
GITERR_CHECK_ALLOC(repo->path_repository);
- if ((error = git_repository_config__weakptr(&repo_config, repo)) < 0)
- return error;
-
- if ((error = git_config_snapshot(&config, repo_config)) < 0)
+ if ((error = git_repository_config_snapshot(&config, repo)) < 0)
return error;
if ((flags & GIT_REPOSITORY_OPEN_BARE) != 0)
@@ -624,6 +621,16 @@ int git_repository_config(git_config **out, git_repository *repo)
return 0;
}
+int git_repository_config_snapshot(git_config **out, git_repository *repo)
+{
+ git_config *weak;
+
+ if (git_repository_config__weakptr(&weak, repo) < 0)
+ return -1;
+
+ return git_config_snapshot(out, weak);
+}
+
void git_repository_set_config(git_repository *repo, git_config *config)
{
assert(repo && config);
diff --git a/src/signature.c b/src/signature.c
index b0ee0da..2545b75 100644
--- a/src/signature.c
+++ b/src/signature.c
@@ -141,13 +141,10 @@ int git_signature_now(git_signature **sig_out, const char *name, const char *ema
int git_signature_default(git_signature **out, git_repository *repo)
{
int error;
- git_config *cfg, *repo_cfg;
+ git_config *cfg;
const char *user_name, *user_email;
- if ((error = git_repository_config__weakptr(&repo_cfg, repo)) < 0)
- return error;
-
- if ((error = git_config_snapshot(&cfg, repo_cfg)) < 0)
+ if ((error = git_repository_config_snapshot(&cfg, repo)) < 0)
return error;
if (!(error = git_config_get_string(&user_name, cfg, "user.name")) &&