summaryrefslogtreecommitdiff
path: root/src/config.c
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2012-04-11 11:52:59 -0700
committerRussell Belfer <rb@github.com>2012-04-11 12:11:35 -0700
commit7784bcbbee972d1f00ea88655a5592fb44ca767d (patch)
tree75926bc03a5f7f072878af8eb3e0e37b7fa66d4f /src/config.c
parent1de77cd31432a1bdff060181c6d9ec25a412a0c2 (diff)
downloadlibgit2-7784bcbbee972d1f00ea88655a5592fb44ca767d.tar.gz
Refactor git_repository_open with new options
Add a new command `git_repository_open_ext` with extended options that control how searching for a repository will be done. The existing `git_repository_open` and `git_repository_discover` are reimplemented on top of it. We may want to change the default behavior of `git_repository_open` but this commit does not do that. Improve support for "gitdir" files where the work dir is separate from the repo and support for the "separate-git-dir" config. Also, add support for opening repos created with `git-new-workdir` script (although I have only confirmed that they can be opened, not that all functions work correctly). There are also a few minor changes that came up: - Fix `git_path_prettify` to allow in-place prettifying. - Fix `git_path_root` to support backslashes on Win32. This fix should help many repo open/discover scenarios - it is the one function called when opening before prettifying the path. - Tweak `git_config_get_string` to set the "out" pointer to NULL if the config value is not found. Allows some other cleanup. - Fix a couple places that should have been calling `git_repository_config__weakptr` and were not. - Fix `cl_git_sandbox_init` clar helper to support bare repos.
Diffstat (limited to 'src/config.c')
-rw-r--r--src/config.c31
1 files changed, 11 insertions, 20 deletions
diff --git a/src/config.c b/src/config.c
index 250bfa652..f5cfa9ec0 100644
--- a/src/config.c
+++ b/src/config.c
@@ -327,11 +327,11 @@ int git_config_lookup_map_value(
int git_config_get_mapped(git_config *cfg, const char *name, git_cvar_map *maps, size_t map_n, int *out)
{
const char *value;
- int error;
+ int ret;
- error = git_config_get_string(cfg, name, &value);
- if (error < 0)
- return error;
+ ret = git_config_get_string(cfg, name, &value);
+ if (ret < 0)
+ return ret;
if (!git_config_lookup_map_value(maps, map_n, value, out))
return 0;
@@ -371,7 +371,7 @@ int git_config_get_int32(git_config *cfg, const char *name, int32_t *out)
giterr_set(GITERR_CONFIG, "Failed to parse '%s' as a 32-bit integer", value);
return -1;
}
-
+
return 0;
}
@@ -399,26 +399,17 @@ int git_config_get_bool(git_config *cfg, const char *name, int *out)
int git_config_get_string(git_config *cfg, const char *name, const char **out)
{
file_internal *internal;
- git_config_file *file;
- int ret = GIT_ENOTFOUND;
unsigned int i;
assert(cfg->files.length);
- for (i = 0; i < cfg->files.length; ++i) {
- internal = git_vector_get(&cfg->files, i);
- file = internal->file;
-
- ret = file->get(file, name, out);
- if (ret == 0)
- return 0;
+ *out = NULL;
- /* File backend doesn't set error message on variable
- * not found */
- if (ret == GIT_ENOTFOUND)
- continue;
-
- return ret;
+ git_vector_foreach(&cfg->files, i, internal) {
+ git_config_file *file = internal->file;
+ int ret = file->get(file, name, out);
+ if (ret != GIT_ENOTFOUND)
+ return ret;
}
giterr_set(GITERR_CONFIG, "Config variable '%s' not found", name);