Skip to content

Commit

Permalink
config.c: pass ctx in configsets
Browse files Browse the repository at this point in the history
Pass config_context to config callbacks in configset_iter(), trivially
setting the .kvi member to the cached key_value_info. Then, in config
callbacks that are only used with configsets, use the .kvi member to
replace calls to current_config_*(), and delete current_config_line()
because it has no remaining callers.

This leaves builtin/config.c and config.c as the only remaining users of
current_config_*().

Signed-off-by: Glen Choo <chooglen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
chooglen authored and gitster committed Jun 28, 2023
1 parent a4e7e31 commit 6021e1d
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 32 deletions.
10 changes: 6 additions & 4 deletions builtin/remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -646,17 +646,19 @@ struct push_default_info
};

static int config_read_push_default(const char *key, const char *value,
const struct config_context *ctx UNUSED, void *cb)
const struct config_context *ctx, void *cb)
{
const struct key_value_info *kvi = ctx->kvi;

struct push_default_info* info = cb;
if (strcmp(key, "remote.pushdefault") ||
!value || strcmp(value, info->old_name))
return 0;

info->scope = current_config_scope();
info->scope = kvi->scope;
strbuf_reset(&info->origin);
strbuf_addstr(&info->origin, current_config_name());
info->linenr = current_config_line();
strbuf_addstr(&info->origin, config_origin_type_name(kvi->origin_type));
info->linenr = kvi->linenr;

return 0;
}
Expand Down
35 changes: 16 additions & 19 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -2317,19 +2317,19 @@ static void configset_iter(struct config_reader *reader, struct config_set *set,
struct string_list *values;
struct config_set_element *entry;
struct configset_list *list = &set->list;
struct config_context ctx = CONFIG_CONTEXT_INIT;

for (i = 0; i < list->nr; i++) {
entry = list->items[i].e;
value_index = list->items[i].value_index;
values = &entry->value_list;

config_reader_set_kvi(reader, values->items[value_index].util);

if (fn(entry->key, values->items[value_index].string, NULL, data) < 0)
ctx.kvi = values->items[value_index].util;
if (fn(entry->key, values->items[value_index].string, &ctx, data) < 0)
git_die_config_linenr(entry->key,
reader->config_kvi->filename,
reader->config_kvi->linenr);

ctx.kvi->filename,
ctx.kvi->linenr);
config_reader_set_kvi(reader, NULL);
}
}
Expand Down Expand Up @@ -3984,13 +3984,8 @@ static int reader_origin_type(struct config_reader *reader,
return 0;
}

const char *current_config_origin_type(void)
const char *config_origin_type_name(enum config_origin_type type)
{
enum config_origin_type type = CONFIG_ORIGIN_UNKNOWN;

if (reader_origin_type(&the_reader, &type))
BUG("current_config_origin_type called outside config callback");

switch (type) {
case CONFIG_ORIGIN_BLOB:
return "blob";
Expand All @@ -4007,6 +4002,16 @@ const char *current_config_origin_type(void)
}
}

const char *current_config_origin_type(void)
{
enum config_origin_type type = CONFIG_ORIGIN_UNKNOWN;

if (reader_origin_type(&the_reader, &type))
BUG("current_config_origin_type called outside config callback");

return config_origin_type_name(type);
}

const char *config_scope_name(enum config_scope scope)
{
switch (scope) {
Expand Down Expand Up @@ -4054,14 +4059,6 @@ enum config_scope current_config_scope(void)
return the_reader.parsing_scope;
}

int current_config_line(void)
{
if (the_reader.config_kvi)
return the_reader.config_kvi->linenr;
else
return the_reader.source->linenr;
}

int lookup_config(const char **mapping, int nr_mapping, const char *var)
{
int i;
Expand Down
2 changes: 1 addition & 1 deletion config.h
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,7 @@ int git_config_parse_parameter(const char *, config_fn_t fn, void *data);
enum config_scope current_config_scope(void);
const char *current_config_origin_type(void);
const char *current_config_name(void);
int current_config_line(void);
const char *config_origin_type_name(enum config_origin_type type);

/*
* Match and parse a config key of the form:
Expand Down
7 changes: 4 additions & 3 deletions remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -350,14 +350,15 @@ static void read_branches_file(struct remote_state *remote_state,
}

static int handle_config(const char *key, const char *value,
const struct config_context *ctx UNUSED, void *cb)
const struct config_context *ctx, void *cb)
{
const char *name;
size_t namelen;
const char *subkey;
struct remote *remote;
struct branch *branch;
struct remote_state *remote_state = cb;
const struct key_value_info *kvi = ctx->kvi;

if (parse_config_key(key, "branch", &name, &namelen, &subkey) >= 0) {
/* There is no subsection. */
Expand Down Expand Up @@ -415,8 +416,8 @@ static int handle_config(const char *key, const char *value,
}
remote = make_remote(remote_state, name, namelen);
remote->origin = REMOTE_CONFIG;
if (current_config_scope() == CONFIG_SCOPE_LOCAL ||
current_config_scope() == CONFIG_SCOPE_WORKTREE)
if (kvi->scope == CONFIG_SCOPE_LOCAL ||
kvi->scope == CONFIG_SCOPE_WORKTREE)
remote->configured_in_repo = 1;
if (!strcmp(subkey, "mirror"))
remote->mirror = git_config_bool(key, value);
Expand Down
11 changes: 6 additions & 5 deletions t/helper/test-config.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,20 +43,21 @@
*/

static int iterate_cb(const char *var, const char *value,
const struct config_context *ctx UNUSED,
const struct config_context *ctx,
void *data UNUSED)
{
const struct key_value_info *kvi = ctx->kvi;
static int nr;

if (nr++)
putchar('\n');

printf("key=%s\n", var);
printf("value=%s\n", value ? value : "(null)");
printf("origin=%s\n", current_config_origin_type());
printf("name=%s\n", current_config_name());
printf("lno=%d\n", current_config_line());
printf("scope=%s\n", config_scope_name(current_config_scope()));
printf("origin=%s\n", config_origin_type_name(kvi->origin_type));
printf("name=%s\n", kvi->filename ? kvi->filename : "");
printf("lno=%d\n", kvi->linenr);
printf("scope=%s\n", config_scope_name(kvi->scope));

return 0;
}
Expand Down

0 comments on commit 6021e1d

Please sign in to comment.