]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/config.c
config: pass kvi to die_bad_number()
[thirdparty/git.git] / builtin / config.c
index ff2fe8ef1257f71dd1ae777cb75b8ea308fae97a..680269d263c7589f1706fcde2bd855d13ef1fbb4 100644 (file)
@@ -5,6 +5,7 @@
 #include "color.h"
 #include "editor.h"
 #include "environment.h"
+#include "repository.h"
 #include "gettext.h"
 #include "ident.h"
 #include "parse-options.h"
@@ -193,37 +194,42 @@ static void check_argc(int argc, int min, int max)
        usage_builtin_config();
 }
 
-static void show_config_origin(struct strbuf *buf)
+static void show_config_origin(const struct key_value_info *kvi,
+                              struct strbuf *buf)
 {
        const char term = end_nul ? '\0' : '\t';
 
-       strbuf_addstr(buf, current_config_origin_type());
+       strbuf_addstr(buf, config_origin_type_name(kvi->origin_type));
        strbuf_addch(buf, ':');
        if (end_nul)
-               strbuf_addstr(buf, current_config_name());
+               strbuf_addstr(buf, kvi->filename ? kvi->filename : "");
        else
-               quote_c_style(current_config_name(), buf, NULL, 0);
+               quote_c_style(kvi->filename ? kvi->filename : "", buf, NULL, 0);
        strbuf_addch(buf, term);
 }
 
-static void show_config_scope(struct strbuf *buf)
+static void show_config_scope(const struct key_value_info *kvi,
+                             struct strbuf *buf)
 {
        const char term = end_nul ? '\0' : '\t';
-       const char *scope = config_scope_name(current_config_scope());
+       const char *scope = config_scope_name(kvi->scope);
 
        strbuf_addstr(buf, N_(scope));
        strbuf_addch(buf, term);
 }
 
 static int show_all_config(const char *key_, const char *value_,
+                          const struct config_context *ctx,
                           void *cb UNUSED)
 {
+       const struct key_value_info *kvi = ctx->kvi;
+
        if (show_origin || show_scope) {
                struct strbuf buf = STRBUF_INIT;
                if (show_scope)
-                       show_config_scope(&buf);
+                       show_config_scope(kvi, &buf);
                if (show_origin)
-                       show_config_origin(&buf);
+                       show_config_origin(kvi, &buf);
                /* Use fwrite as "buf" can contain \0's if "end_null" is set. */
                fwrite(buf.buf, 1, buf.len, stdout);
                strbuf_release(&buf);
@@ -241,12 +247,13 @@ struct strbuf_list {
        int alloc;
 };
 
-static int format_config(struct strbuf *buf, const char *key_, const char *value_)
+static int format_config(struct strbuf *buf, const char *key_,
+                        const char *value_, const struct key_value_info *kvi)
 {
        if (show_scope)
-               show_config_scope(buf);
+               show_config_scope(kvi, buf);
        if (show_origin)
-               show_config_origin(buf);
+               show_config_origin(kvi, buf);
        if (show_keys)
                strbuf_addstr(buf, key_);
        if (!omit_values) {
@@ -255,13 +262,14 @@ static int format_config(struct strbuf *buf, const char *key_, const char *value
 
                if (type == TYPE_INT)
                        strbuf_addf(buf, "%"PRId64,
-                                   git_config_int64(key_, value_ ? value_ : ""));
+                                   git_config_int64(key_, value_ ? value_ : "", kvi));
                else if (type == TYPE_BOOL)
                        strbuf_addstr(buf, git_config_bool(key_, value_) ?
                                      "true" : "false");
                else if (type == TYPE_BOOL_OR_INT) {
                        int is_bool, v;
-                       v = git_config_bool_or_int(key_, value_, &is_bool);
+                       v = git_config_bool_or_int(key_, value_, kvi,
+                                                  &is_bool);
                        if (is_bool)
                                strbuf_addstr(buf, v ? "true" : "false");
                        else
@@ -300,9 +308,11 @@ static int format_config(struct strbuf *buf, const char *key_, const char *value
        return 0;
 }
 
-static int collect_config(const char *key_, const char *value_, void *cb)
+static int collect_config(const char *key_, const char *value_,
+                         const struct config_context *ctx, void *cb)
 {
        struct strbuf_list *values = cb;
+       const struct key_value_info *kvi = ctx->kvi;
 
        if (!use_key_regexp && strcmp(key_, key))
                return 0;
@@ -317,7 +327,7 @@ static int collect_config(const char *key_, const char *value_, void *cb)
        ALLOC_GROW(values->items, values->nr + 1, values->alloc);
        strbuf_init(&values->items[values->nr], 0);
 
-       return format_config(&values->items[values->nr++], key_, value_);
+       return format_config(&values->items[values->nr++], key_, value_, kvi);
 }
 
 static int get_value(const char *key_, const char *regex_, unsigned flags)
@@ -375,14 +385,18 @@ static int get_value(const char *key_, const char *regex_, unsigned flags)
        }
 
        config_with_options(collect_config, &values,
-                           &given_config_source, &config_options);
+                           &given_config_source, the_repository,
+                           &config_options);
 
        if (!values.nr && default_value) {
+               struct key_value_info kvi = KVI_INIT;
                struct strbuf *item;
+
+               kvi_from_param(&kvi);
                ALLOC_GROW(values.items, values.nr + 1, values.alloc);
                item = &values.items[values.nr++];
                strbuf_init(item, 0);
-               if (format_config(item, key_, default_value) < 0)
+               if (format_config(item, key_, default_value, &kvi) < 0)
                        die(_("failed to format default config value: %s"),
                                default_value);
        }
@@ -411,7 +425,8 @@ free_strings:
        return ret;
 }
 
-static char *normalize_value(const char *key, const char *value)
+static char *normalize_value(const char *key, const char *value,
+                            struct key_value_info *kvi)
 {
        if (!value)
                return NULL;
@@ -426,12 +441,12 @@ static char *normalize_value(const char *key, const char *value)
                 */
                return xstrdup(value);
        if (type == TYPE_INT)
-               return xstrfmt("%"PRId64, git_config_int64(key, value));
+               return xstrfmt("%"PRId64, git_config_int64(key, value, kvi));
        if (type == TYPE_BOOL)
                return xstrdup(git_config_bool(key, value) ?  "true" : "false");
        if (type == TYPE_BOOL_OR_INT) {
                int is_bool, v;
-               v = git_config_bool_or_int(key, value, &is_bool);
+               v = git_config_bool_or_int(key, value, kvi, &is_bool);
                if (!is_bool)
                        return xstrfmt("%d", v);
                else
@@ -468,6 +483,7 @@ static const char *get_colorbool_slot;
 static char parsed_color[COLOR_MAXLEN];
 
 static int git_get_color_config(const char *var, const char *value,
+                               const struct config_context *ctx UNUSED,
                                void *cb UNUSED)
 {
        if (!strcmp(var, get_color_slot)) {
@@ -486,7 +502,8 @@ static void get_color(const char *var, const char *def_color)
        get_color_found = 0;
        parsed_color[0] = '\0';
        config_with_options(git_get_color_config, NULL,
-                           &given_config_source, &config_options);
+                           &given_config_source, the_repository,
+                           &config_options);
 
        if (!get_color_found && def_color) {
                if (color_parse(def_color, parsed_color) < 0)
@@ -500,6 +517,7 @@ static int get_colorbool_found;
 static int get_diff_color_found;
 static int get_color_ui_found;
 static int git_get_colorbool_config(const char *var, const char *value,
+                                   const struct config_context *ctx UNUSED,
                                    void *data UNUSED)
 {
        if (!strcmp(var, get_colorbool_slot))
@@ -518,7 +536,8 @@ static int get_colorbool(const char *var, int print)
        get_diff_color_found = -1;
        get_color_ui_found = -1;
        config_with_options(git_get_colorbool_config, NULL,
-                           &given_config_source, &config_options);
+                           &given_config_source, the_repository,
+                           &config_options);
 
        if (get_colorbool_found < 0) {
                if (!strcmp(get_colorbool_slot, "color.diff"))
@@ -555,13 +574,17 @@ static void check_write(void)
 struct urlmatch_current_candidate_value {
        char value_is_null;
        struct strbuf value;
+       struct key_value_info kvi;
 };
 
-static int urlmatch_collect_fn(const char *var, const char *value, void *cb)
+static int urlmatch_collect_fn(const char *var, const char *value,
+                              const struct config_context *ctx,
+                              void *cb)
 {
        struct string_list *values = cb;
        struct string_list_item *item = string_list_insert(values, var);
        struct urlmatch_current_candidate_value *matched = item->util;
+       const struct key_value_info *kvi = ctx->kvi;
 
        if (!matched) {
                matched = xmalloc(sizeof(*matched));
@@ -570,6 +593,7 @@ static int urlmatch_collect_fn(const char *var, const char *value, void *cb)
        } else {
                strbuf_reset(&matched->value);
        }
+       matched->kvi = *kvi;
 
        if (value) {
                strbuf_addstr(&matched->value, value);
@@ -607,7 +631,8 @@ static int get_urlmatch(const char *var, const char *url)
        }
 
        config_with_options(urlmatch_config_entry, &config,
-                           &given_config_source, &config_options);
+                           &given_config_source, the_repository,
+                           &config_options);
 
        ret = !values.nr;
 
@@ -616,7 +641,8 @@ static int get_urlmatch(const char *var, const char *url)
                struct strbuf buf = STRBUF_INIT;
 
                format_config(&buf, item->string,
-                             matched->value_is_null ? NULL : matched->value.buf);
+                             matched->value_is_null ? NULL : matched->value.buf,
+                             &matched->kvi);
                fwrite(buf.buf, 1, buf.len, stdout);
                strbuf_release(&buf);
 
@@ -650,6 +676,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        char *value = NULL;
        int flags = 0;
        int ret = 0;
+       struct key_value_info default_kvi = KVI_INIT;
 
        given_config_source.file = xstrdup_or_null(getenv(CONFIG_ENVIRONMENT));
 
@@ -713,7 +740,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                given_config_source.scope = CONFIG_SCOPE_LOCAL;
        } else if (use_worktree_config) {
                struct worktree **worktrees = get_worktrees();
-               if (repository_format_worktree_config)
+               if (the_repository->repository_format_worktree_config)
                        given_config_source.file = git_pathdup("config.worktree");
                else if (worktrees[0] && worktrees[1])
                        die(_("--worktree cannot be used with multiple "
@@ -827,7 +854,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        if (actions == ACTION_LIST) {
                check_argc(argc, 0, 0);
                if (config_with_options(show_all_config, NULL,
-                                       &given_config_source,
+                                       &given_config_source, the_repository,
                                        &config_options) < 0) {
                        if (given_config_source.file)
                                die_errno(_("unable to read config file '%s'"),
@@ -867,7 +894,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        else if (actions == ACTION_SET) {
                check_write();
                check_argc(argc, 2, 2);
-               value = normalize_value(argv[0], argv[1]);
+               value = normalize_value(argv[0], argv[1], &default_kvi);
                ret = git_config_set_in_file_gently(given_config_source.file, argv[0], value);
                if (ret == CONFIG_NOTHING_SET)
                        error(_("cannot overwrite multiple values with a single value\n"
@@ -876,7 +903,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        else if (actions == ACTION_SET_ALL) {
                check_write();
                check_argc(argc, 2, 3);
-               value = normalize_value(argv[0], argv[1]);
+               value = normalize_value(argv[0], argv[1], &default_kvi);
                ret = git_config_set_multivar_in_file_gently(given_config_source.file,
                                                             argv[0], value, argv[2],
                                                             flags);
@@ -884,7 +911,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        else if (actions == ACTION_ADD) {
                check_write();
                check_argc(argc, 2, 2);
-               value = normalize_value(argv[0], argv[1]);
+               value = normalize_value(argv[0], argv[1], &default_kvi);
                ret = git_config_set_multivar_in_file_gently(given_config_source.file,
                                                             argv[0], value,
                                                             CONFIG_REGEX_NONE,
@@ -893,7 +920,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        else if (actions == ACTION_REPLACE_ALL) {
                check_write();
                check_argc(argc, 2, 3);
-               value = normalize_value(argv[0], argv[1]);
+               value = normalize_value(argv[0], argv[1], &default_kvi);
                ret = git_config_set_multivar_in_file_gently(given_config_source.file,
                                                             argv[0], value, argv[2],
                                                             flags | CONFIG_FLAGS_MULTI_REPLACE);