builtin/config.c: Fix a sparse warning
[gitweb.git] / builtin / config.c
index 08e83fc5ea9ddd24d4a2d07074b6f4fcaa337450..e796af4db6c533a936ecfc70d36e936a8fffa4bd 100644 (file)
@@ -107,7 +107,6 @@ static int collect_config(const char *key_, const char *value_, void *cb)
        char value[256];
        const char *vptr = value;
        int must_free_vptr = 0;
-       int dup_error = 0;
        int must_print_delim = 0;
 
        if (!use_key_regexp && strcmp(key_, key))
@@ -126,8 +125,6 @@ static int collect_config(const char *key_, const char *value_, void *cb)
                strbuf_addstr(buf, key_);
                must_print_delim = 1;
        }
-       if (values->nr > 1 && !do_all)
-               dup_error = 1;
        if (types == TYPE_INT)
                sprintf(value, "%d", git_config_int(key_, value_?value_:""));
        else if (types == TYPE_BOOL)
@@ -149,16 +146,12 @@ static int collect_config(const char *key_, const char *value_, void *cb)
                vptr = "";
                must_print_delim = 0;
        }
-       if (dup_error) {
-               error("More than one value for the key %s: %s",
-                               key_, vptr);
-       }
-       else {
-               if (must_print_delim)
-                       strbuf_addch(buf, key_delim);
-               strbuf_addstr(buf, vptr);
-               strbuf_addch(buf, term);
-       }
+
+       if (must_print_delim)
+               strbuf_addch(buf, key_delim);
+       strbuf_addstr(buf, vptr);
+       strbuf_addch(buf, term);
+
        if (must_free_vptr)
                /* If vptr must be freed, it's a pointer to a
                 * dynamically allocated buffer, it's safe to cast to
@@ -172,22 +165,9 @@ static int collect_config(const char *key_, const char *value_, void *cb)
 static int get_value(const char *key_, const char *regex_)
 {
        int ret = CONFIG_GENERIC_ERROR;
-       char *global = NULL, *xdg = NULL, *repo_config = NULL;
-       const char *system_wide = NULL, *local;
-       struct config_include_data inc = CONFIG_INCLUDE_INIT;
-       config_fn_t fn;
-       void *data;
-       struct strbuf_list values = {0};
+       struct strbuf_list values = {NULL};
        int i;
 
-       local = given_config_file;
-       if (!local) {
-               local = repo_config = git_pathdup("config");
-               if (git_config_system())
-                       system_wide = git_etc_gitconfig();
-               home_config_paths(&global, &xdg, "config");
-       }
-
        if (use_key_regexp) {
                char *tl;
 
@@ -236,49 +216,20 @@ static int get_value(const char *key_, const char *regex_)
                }
        }
 
-       fn = collect_config;
-       data = &values;
-       if (respect_includes) {
-               inc.fn = fn;
-               inc.data = data;
-               fn = git_config_include;
-               data = &inc;
-       }
-
-       if (do_all && system_wide)
-               git_config_from_file(fn, system_wide, data);
-       if (do_all && xdg)
-               git_config_from_file(fn, xdg, data);
-       if (do_all && global)
-               git_config_from_file(fn, global, data);
-       if (do_all)
-               git_config_from_file(fn, local, data);
-       git_config_from_parameters(fn, data);
-       if (!do_all && !values.nr)
-               git_config_from_file(fn, local, data);
-       if (!do_all && !values.nr && global)
-               git_config_from_file(fn, global, data);
-       if (!do_all && !values.nr && xdg)
-               git_config_from_file(fn, xdg, data);
-       if (!do_all && !values.nr && system_wide)
-               git_config_from_file(fn, system_wide, data);
-
-       if (do_all)
-               ret = !values.nr;
-       else
-               ret = (values.nr == 1) ? 0 : values.nr > 1 ? 2 : 1;
+       git_config_with_options(collect_config, &values,
+                               given_config_file, respect_includes);
+
+       ret = !values.nr;
 
        for (i = 0; i < values.nr; i++) {
                struct strbuf *buf = values.items + i;
-               fwrite(buf->buf, 1, buf->len, stdout);
+               if (do_all || i == values.nr - 1)
+                       fwrite(buf->buf, 1, buf->len, stdout);
                strbuf_release(buf);
        }
        free(values.items);
 
 free_strings:
-       free(repo_config);
-       free(global);
-       free(xdg);
        free(key);
        if (key_regexp) {
                regfree(key_regexp);