diff options
| author | Russell Belfer <rb@github.com> | 2012-03-30 14:40:50 -0700 |
|---|---|---|
| committer | Russell Belfer <rb@github.com> | 2012-03-30 14:40:50 -0700 |
| commit | 95dfb031f70601b12a9eb57229fd4aa9a51ddd54 (patch) | |
| tree | 1413fc2f40bdc3e1af6c5ff16f5550de142e6bf3 /src/config.c | |
| parent | bfc9ca595aa2f189743f2a7b9812f05def78ec88 (diff) | |
| download | libgit2-95dfb031f70601b12a9eb57229fd4aa9a51ddd54.tar.gz | |
Improve config handling for diff,submodules,attrs
This adds support for a bunch of core.* settings that affect
diff and status, plus fixes up some incorrect implementations
of those settings from before. Also, this cleans up the
handling of config settings in the new submodules code and
in the old attrs/ignore code.
Diffstat (limited to 'src/config.c')
| -rw-r--r-- | src/config.c | 74 |
1 files changed, 43 insertions, 31 deletions
diff --git a/src/config.c b/src/config.c index 5ef1a24b3..250bfa652 100644 --- a/src/config.c +++ b/src/config.c @@ -140,7 +140,7 @@ int git_config_add_file(git_config *cfg, git_config_file *file, int priority) int git_config_foreach(git_config *cfg, int (*fn)(const char *, const char *, void *), void *data) { - int ret = GIT_SUCCESS; + int ret = 0; unsigned int i; file_internal *internal; git_config_file *file; @@ -206,20 +206,20 @@ int git_config_parse_bool(int *out, const char *value) /* A missing value means true */ if (value == NULL) { *out = 1; - return GIT_SUCCESS; + return 0; } if (!strcasecmp(value, "true") || !strcasecmp(value, "yes") || !strcasecmp(value, "on")) { *out = 1; - return GIT_SUCCESS; + return 0; } if (!strcasecmp(value, "false") || !strcasecmp(value, "no") || !strcasecmp(value, "off")) { *out = 0; - return GIT_SUCCESS; + return 0; } return GIT_EINVALIDTYPE; @@ -283,46 +283,58 @@ static int parse_int32(int32_t *out, const char *value) /*********** * Getters ***********/ -int git_config_get_mapped(git_config *cfg, const char *name, git_cvar_map *maps, size_t map_n, int *out) +int git_config_lookup_map_value( + git_cvar_map *maps, size_t map_n, const char *value, int *out) { size_t i; - const char *value; - int error; - error = git_config_get_string(cfg, name, &value); - if (error < GIT_SUCCESS) - return error; + if (!value) + return GIT_ENOTFOUND; for (i = 0; i < map_n; ++i) { git_cvar_map *m = maps + i; switch (m->cvar_type) { - case GIT_CVAR_FALSE: - case GIT_CVAR_TRUE: { - int bool_val; + case GIT_CVAR_FALSE: + case GIT_CVAR_TRUE: { + int bool_val; + + if (git_config_parse_bool(&bool_val, value) == 0 && + bool_val == (int)m->cvar_type) { + *out = m->map_value; + return 0; + } + break; + } - if (git_config_parse_bool(&bool_val, value) == 0 && - bool_val == (int)m->cvar_type) { - *out = m->map_value; - return 0; - } + case GIT_CVAR_INT32: + if (parse_int32(out, value) == 0) + return 0; + break; - break; + case GIT_CVAR_STRING: + if (strcasecmp(value, m->str_match) == 0) { + *out = m->map_value; + return 0; } + break; + } + } - case GIT_CVAR_INT32: - if (parse_int32(out, value) == 0) - return 0; + return GIT_ENOTFOUND; +} - break; +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; - case GIT_CVAR_STRING: - if (strcasecmp(value, m->str_match) == 0) { - *out = m->map_value; - return 0; - } - } - } + error = git_config_get_string(cfg, name, &value); + if (error < 0) + return error; + + if (!git_config_lookup_map_value(maps, map_n, value, out)) + return 0; giterr_set(GITERR_CONFIG, "Failed to map the '%s' config variable with a valid value", name); @@ -449,7 +461,7 @@ int git_config_set_multivar(git_config *cfg, const char *name, const char *regex internal = git_vector_get(&cfg->files, i - 1); file = internal->file; ret = file->set_multivar(file, name, regexp, value); - if (ret < GIT_SUCCESS && ret != GIT_ENOTFOUND) + if (ret < 0 && ret != GIT_ENOTFOUND) return ret; } |
