summaryrefslogtreecommitdiff
path: root/src/remote.c
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2013-11-25 14:21:34 -0800
committerRussell Belfer <rb@github.com>2013-12-11 10:57:49 -0800
commit9f77b3f6f5ce6944ec49dfc666ef6b8df0af0c6b (patch)
tree1c5405663a7bcc505f098b375c7ff5dc872af3ea /src/remote.c
parent0eedacb06ae07fd0d784066ad41383276e05d92e (diff)
downloadlibgit2-9f77b3f6f5ce6944ec49dfc666ef6b8df0af0c6b.tar.gz
Add config read fns with controlled error behavior
This adds `git_config__lookup_entry` which will look up a key in a config and return either the entry or NULL if the key was not present. Optionally, it can either suppress all errors or can return them (although not finding the key is not an error for this function). Unlike other accessors, this does not normalize the config key string, so it must only be used when the key is known to be in normalized form (i.e. all lower-case before the first dot and after the last dot, with no invalid characters). This also adds three high-level helper functions to look up config values with no errors and a fallback value. The three functions are for string, bool, and int values, and will resort to the fallback value for any error that arises. They are: * `git_config__get_string_force` * `git_config__get_bool_force` * `git_config__get_int_force` None of them normalize the config `key` either, so they can only be used for internal cases where the key is known to be in normal format.
Diffstat (limited to 'src/remote.c')
-rw-r--r--src/remote.c63
1 files changed, 26 insertions, 37 deletions
diff --git a/src/remote.c b/src/remote.c
index 3d890a5f1..6f86a4b57 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -45,7 +45,7 @@ static int add_refspec(git_remote *remote, const char *string, bool is_fetch)
static int download_tags_value(git_remote *remote, git_config *cfg)
{
- const char *val;
+ const git_config_entry *ce;
git_buf buf = GIT_BUF_INIT;
int error;
@@ -53,16 +53,14 @@ static int download_tags_value(git_remote *remote, git_config *cfg)
if (git_buf_printf(&buf, "remote.%s.tagopt", remote->name) < 0)
return -1;
- error = git_config_get_string(&val, cfg, git_buf_cstr(&buf));
+ error = git_config__lookup_entry(&ce, cfg, git_buf_cstr(&buf), false);
git_buf_free(&buf);
- if (!error && !strcmp(val, "--no-tags"))
- remote->download_tags = GIT_REMOTE_DOWNLOAD_TAGS_NONE;
- else if (!error && !strcmp(val, "--tags"))
- remote->download_tags = GIT_REMOTE_DOWNLOAD_TAGS_ALL;
- if (error == GIT_ENOTFOUND) {
- giterr_clear();
- error = 0;
+ if (!error && ce && ce->value) {
+ if (!strcmp(ce->value, "--no-tags"))
+ remote->download_tags = GIT_REMOTE_DOWNLOAD_TAGS_NONE;
+ else if (!strcmp(ce->value, "--tags"))
+ remote->download_tags = GIT_REMOTE_DOWNLOAD_TAGS_ALL;
}
return error;
@@ -104,12 +102,7 @@ static int get_check_cert(int *out, git_repository *repo)
if ((error = git_repository_config__weakptr(&cfg, repo)) < 0)
return error;
- if ((error = git_config_get_bool(out, cfg, "http.sslVerify")) == 0)
- return 0;
- else if (error != GIT_ENOTFOUND)
- return error;
-
- giterr_clear();
+ *out = git_config__get_bool_force(cfg, "http.sslverify", 1);
return 0;
}
@@ -493,7 +486,7 @@ int git_remote_save(const git_remote *remote)
}
if (error < 0) {
git_buf_free(&buf);
- return -1;
+ return error;
}
}
@@ -667,7 +660,8 @@ int git_remote_ls(const git_remote_head ***out, size_t *size, git_remote *remote
int git_remote__get_http_proxy(git_remote *remote, bool use_ssl, char **proxy_url)
{
git_config *cfg;
- const char *val;
+ const git_config_entry *ce;
+ const char *val = NULL;
int error;
assert(remote);
@@ -684,44 +678,39 @@ int git_remote__get_http_proxy(git_remote *remote, bool use_ssl, char **proxy_ur
* to least specific. */
/* remote.<name>.proxy config setting */
- if (remote->name && 0 != *(remote->name)) {
+ if (remote->name && remote->name[0]) {
git_buf buf = GIT_BUF_INIT;
if ((error = git_buf_printf(&buf, "remote.%s.proxy", remote->name)) < 0)
return error;
- if ((error = git_config_get_string(&val, cfg, git_buf_cstr(&buf))) == 0 &&
- val && ('\0' != *val)) {
- git_buf_free(&buf);
+ error = git_config__lookup_entry(&ce, cfg, git_buf_cstr(&buf), false);
+ git_buf_free(&buf);
- *proxy_url = git__strdup(val);
- GITERR_CHECK_ALLOC(*proxy_url);
- return 0;
- } else if (error != GIT_ENOTFOUND)
+ if (error < 0)
return error;
- giterr_clear();
- git_buf_free(&buf);
+ if (ce && ce->value) {
+ val = ce->value;
+ goto found;
+ }
}
/* http.proxy config setting */
- if ((error = git_config_get_string(&val, cfg, "http.proxy")) == 0 &&
- val && ('\0' != *val)) {
- *proxy_url = git__strdup(val);
- GITERR_CHECK_ALLOC(*proxy_url);
- return 0;
- } else if (error != GIT_ENOTFOUND)
+ if ((error = git_config__lookup_entry(&ce, cfg, "http.proxy", false)) < 0)
return error;
-
- giterr_clear();
+ if (ce && ce->value) {
+ val = ce->value;
+ goto found;
+ }
/* HTTP_PROXY / HTTPS_PROXY environment variables */
val = use_ssl ? getenv("HTTPS_PROXY") : getenv("HTTP_PROXY");
- if (val && ('\0' != *val)) {
+found:
+ if (val && val[0]) {
*proxy_url = git__strdup(val);
GITERR_CHECK_ALLOC(*proxy_url);
- return 0;
}
return 0;