trace2: plumb config kvi

There is a code path starting from trace2_def_param_fl() that eventually calls current_config_scope(), and thus it needs to have "kvi" plumbed through it. Additional plumbing is also needed to get "kvi" to trace2_def_param_fl(), which gets called by two code paths: - Through tr2_cfg_cb(), which is a config callback, so it trivially receives "kvi" via the "struct config_context ctx" parameter. - Through tr2_list_env_vars_fl(), which is a high level function that lists environment variables for tracing. This has been secretly behaving like git_config_from_parameters() (in that it parses config from environment variables/the CLI), but does not set config source information. Teach tr2_list_env_vars_fl() to be well-behaved by using kvi_from_param(), which is used elsewhere for CLI/environment variable-based config. As a result, current_config_scope() has no more callers, so remove it. Signed-off-by: Glen Choo <chooglen@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Glen Choo committed Jun 28, 2023 at 19:26 UTC dc9020849773393e47c37c2834a5582374b55ecc
9 files changed +19 -60
config.c
-46
@@ -85,16 +85,6 @@ struct config_reader {
85 */
86 struct config_source *source;
87 struct key_value_info *config_kvi;
88 - /*
89 - * The "scope" of the current config source being parsed (repo, global,
90 - * etc). Like "source", this is only set when parsing a config source.
91 - * It's not part of "source" because it transcends a single file (i.e.,
92 - * a file included from .git/config is still in "repo" scope).
93 - *
94 - * When iterating through a configset, the equivalent value is
95 - * "config_kvi.scope" (see above).
96 - */
97 - enum config_scope parsing_scope;
88 };
89 /*
90 * Where possible, prefer to accept "struct config_reader" as an arg than to use
@@ -125,19 +115,9 @@ static inline struct config_source *config_reader_pop_source(struct config_reade
115 static inline void config_reader_set_kvi(struct config_reader *reader,
116 struct key_value_info *kvi)
117 {
128 - if (kvi && (reader->source || reader->parsing_scope))
129 - BUG("kvi should not be set while parsing a config source");
118 reader->config_kvi = kvi;
119 }
120
133 -static inline void config_reader_set_scope(struct config_reader *reader,
134 - enum config_scope scope)
135 -{
136 - if (scope && reader->config_kvi)
137 - BUG("scope should only be set when iterating through a config source");
138 - reader->parsing_scope = scope;
139 -}
140 -
121 static int pack_compression_seen;
122 static int zlib_compression_seen;
123
@@ -412,19 +392,13 @@ static void populate_remote_urls(struct config_include_data *inc)
392 {
393 struct config_options opts;
394
415 - enum config_scope store_scope = inc->config_reader->parsing_scope;
416 -
395 opts = *inc->opts;
396 opts.unconditional_remote_url = 1;
397
420 - config_reader_set_scope(inc->config_reader, 0);
421 -
398 inc->remote_urls = xmalloc(sizeof(*inc->remote_urls));
399 string_list_init_dup(inc->remote_urls);
400 config_with_options(add_remote_url, inc->remote_urls,
401 inc->config_source, inc->repo, &opts);
426 -
427 - config_reader_set_scope(inc->config_reader, store_scope);
402 }
403
404 static int forbid_remote_url(const char *var, const char *value UNUSED,
@@ -2255,7 +2229,6 @@ static int do_git_config_sequence(struct config_reader *reader,
2229 char *user_config = NULL;
2230 char *repo_config;
2231 char *worktree_config;
2258 - enum config_scope prev_parsing_scope = reader->parsing_scope;
2232
2233 /*
2234 * Ensure that either:
@@ -2273,7 +2246,6 @@ static int do_git_config_sequence(struct config_reader *reader,
2246 worktree_config = NULL;
2247 }
2248
2276 - config_reader_set_scope(reader, CONFIG_SCOPE_SYSTEM);
2249 if (git_config_system() && system_config &&
2250 !access_or_die(system_config, R_OK,
2251 opts->system_gently ? ACCESS_EACCES_OK : 0))
@@ -2281,7 +2253,6 @@ static int do_git_config_sequence(struct config_reader *reader,
2253 data, CONFIG_SCOPE_SYSTEM,
2254 NULL);
2255
2284 - config_reader_set_scope(reader, CONFIG_SCOPE_GLOBAL);
2256 git_global_config(&user_config, &xdg_config);
2257
2258 if (xdg_config && !access_or_die(xdg_config, R_OK, ACCESS_EACCES_OK))
@@ -2292,13 +2263,11 @@ static int do_git_config_sequence(struct config_reader *reader,
2263 ret += git_config_from_file_with_options(fn, user_config, data,
2264 CONFIG_SCOPE_GLOBAL, NULL);
2265
2295 - config_reader_set_scope(reader, CONFIG_SCOPE_LOCAL);
2266 if (!opts->ignore_repo && repo_config &&
2267 !access_or_die(repo_config, R_OK, 0))
2268 ret += git_config_from_file_with_options(fn, repo_config, data,
2269 CONFIG_SCOPE_LOCAL, NULL);
2270
2301 - config_reader_set_scope(reader, CONFIG_SCOPE_WORKTREE);
2271 if (!opts->ignore_worktree && worktree_config &&
2272 repo && repo->repository_format_worktree_config &&
2273 !access_or_die(worktree_config, R_OK, 0)) {
@@ -2307,11 +2276,9 @@ static int do_git_config_sequence(struct config_reader *reader,
2276 NULL);
2277 }
2278
2310 - config_reader_set_scope(reader, CONFIG_SCOPE_COMMAND);
2279 if (!opts->ignore_cmdline && git_config_from_parameters(fn, data) < 0)
2280 die(_("unable to parse command-line config"));
2281
2314 - config_reader_set_scope(reader, prev_parsing_scope);
2282 free(system_config);
2283 free(xdg_config);
2284 free(user_config);
@@ -2326,7 +2293,6 @@ int config_with_options(config_fn_t fn, void *data,
2293 const struct config_options *opts)
2294 {
2295 struct config_include_data inc = CONFIG_INCLUDE_INIT;
2329 - enum config_scope prev_scope = the_reader.parsing_scope;
2296 int ret;
2297
2298 if (opts->respect_includes) {
@@ -2340,9 +2306,6 @@ int config_with_options(config_fn_t fn, void *data,
2306 data = &inc;
2307 }
2308
2343 - if (config_source)
2344 - config_reader_set_scope(&the_reader, config_source->scope);
2345 -
2309 /*
2310 * If we have a specific filename, use it. Otherwise, follow the
2311 * regular lookup sequence.
@@ -2364,7 +2327,6 @@ int config_with_options(config_fn_t fn, void *data,
2327 string_list_clear(inc.remote_urls, 0);
2328 FREE_AND_NULL(inc.remote_urls);
2329 }
2367 - config_reader_set_scope(&the_reader, prev_scope);
2330 return ret;
2331 }
2332
@@ -4088,14 +4050,6 @@ static int reader_config_name(struct config_reader *reader, const char **out)
4050 return 0;
4051 }
4052
4091 -enum config_scope current_config_scope(void)
4092 -{
4093 - if (the_reader.config_kvi)
4094 - return the_reader.config_kvi->scope;
4095 - else
4096 - return the_reader.parsing_scope;
4097 -}
4098 -
4053 int lookup_config(const char **mapping, int nr_mapping, const char *var)
4054 {
4055 int i;
config.h
-1
@@ -386,7 +386,6 @@ void git_global_config(char **user, char **xdg);
386
387 int git_config_parse_parameter(const char *, config_fn_t fn, void *data);
388
389 -enum config_scope current_config_scope(void);
389 const char *config_origin_type_name(enum config_origin_type type);
390 void kvi_from_param(struct key_value_info *out);
391
trace2.c
+2 -2
@@ -634,7 +634,7 @@ void trace2_thread_exit_fl(const char *file, int line)
634 }
635
636 void trace2_def_param_fl(const char *file, int line, const char *param,
637 - const char *value)
637 + const char *value, const struct key_value_info *kvi)
638 {
639 struct tr2_tgt *tgt_j;
640 int j;
@@ -644,7 +644,7 @@ void trace2_def_param_fl(const char *file, int line, const char *param,
644
645 for_each_wanted_builtin (j, tgt_j)
646 if (tgt_j->pfn_param_fl)
647 - tgt_j->pfn_param_fl(file, line, param, value);
647 + tgt_j->pfn_param_fl(file, line, param, value, kvi);
648 }
649
650 void trace2_def_repo_fl(const char *file, int line, struct repository *repo)
trace2.h
+2 -1
@@ -325,6 +325,7 @@ void trace2_thread_exit_fl(const char *file, int line);
325
326 #define trace2_thread_exit() trace2_thread_exit_fl(__FILE__, __LINE__)
327
328 +struct key_value_info;
329 /*
330 * Emits a "def_param" message containing a key/value pair.
331 *
@@ -334,7 +335,7 @@ void trace2_thread_exit_fl(const char *file, int line);
335 * `core.abbrev`, `status.showUntrackedFiles`, or `--no-ahead-behind`.
336 */
337 void trace2_def_param_fl(const char *file, int line, const char *param,
337 - const char *value);
338 + const char *value, const struct key_value_info *kvi);
339
340 #define trace2_def_param(param, value) \
341 trace2_def_param_fl(__FILE__, __LINE__, (param), (value))
trace2/tr2_cfg.c
+6 -3
@@ -100,7 +100,7 @@ struct tr2_cfg_data {
100 * See if the given config key matches any of our patterns of interest.
101 */
102 static int tr2_cfg_cb(const char *key, const char *value,
103 - const struct config_context *ctx UNUSED, void *d)
103 + const struct config_context *ctx, void *d)
104 {
105 struct strbuf **s;
106 struct tr2_cfg_data *data = (struct tr2_cfg_data *)d;
@@ -109,7 +109,8 @@ static int tr2_cfg_cb(const char *key, const char *value,
109 struct strbuf *buf = *s;
110 int wm = wildmatch(buf->buf, key, WM_CASEFOLD);
111 if (wm == WM_MATCH) {
112 - trace2_def_param_fl(data->file, data->line, key, value);
112 + trace2_def_param_fl(data->file, data->line, key, value,
113 + ctx->kvi);
114 return 0;
115 }
116 }
@@ -127,8 +128,10 @@ void tr2_cfg_list_config_fl(const char *file, int line)
128
129 void tr2_list_env_vars_fl(const char *file, int line)
130 {
131 + struct key_value_info kvi = KVI_INIT;
132 struct strbuf **s;
133
134 + kvi_from_param(&kvi);
135 if (tr2_load_env_vars() <= 0)
136 return;
137
@@ -136,7 +139,7 @@ void tr2_list_env_vars_fl(const char *file, int line)
139 struct strbuf *buf = *s;
140 const char *val = getenv(buf->buf);
141 if (val && *val)
139 - trace2_def_param_fl(file, line, buf->buf, val);
142 + trace2_def_param_fl(file, line, buf->buf, val, &kvi);
143 }
144 }
145
trace2/tr2_tgt.h
+3 -1
@@ -69,8 +69,10 @@ typedef void(tr2_tgt_evt_exec_result_fl_t)(const char *file, int line,
69 uint64_t us_elapsed_absolute,
70 int exec_id, int code);
71
72 +struct key_value_info;
73 typedef void(tr2_tgt_evt_param_fl_t)(const char *file, int line,
73 - const char *param, const char *value);
74 + const char *param, const char *value,
75 + const struct key_value_info *kvi);
76
77 typedef void(tr2_tgt_evt_repo_fl_t)(const char *file, int line,
78 const struct repository *repo);
trace2/tr2_tgt_event.c
+2 -2
@@ -477,11 +477,11 @@ static void fn_exec_result_fl(const char *file, int line,
477 }
478
479 static void fn_param_fl(const char *file, int line, const char *param,
480 - const char *value)
480 + const char *value, const struct key_value_info *kvi)
481 {
482 const char *event_name = "def_param";
483 struct json_writer jw = JSON_WRITER_INIT;
484 - enum config_scope scope = current_config_scope();
484 + enum config_scope scope = kvi->scope;
485 const char *scope_name = config_scope_name(scope);
486
487 jw_object_begin(&jw, 0);
trace2/tr2_tgt_normal.c
+2 -2
@@ -297,10 +297,10 @@ static void fn_exec_result_fl(const char *file, int line,
297 }
298
299 static void fn_param_fl(const char *file, int line, const char *param,
300 - const char *value)
300 + const char *value, const struct key_value_info *kvi)
301 {
302 struct strbuf buf_payload = STRBUF_INIT;
303 - enum config_scope scope = current_config_scope();
303 + enum config_scope scope = kvi->scope;
304 const char *scope_name = config_scope_name(scope);
305
306 strbuf_addf(&buf_payload, "def_param scope:%s %s=%s", scope_name, param,
trace2/tr2_tgt_perf.c
+2 -2
@@ -439,12 +439,12 @@ static void fn_exec_result_fl(const char *file, int line,
439 }
440
441 static void fn_param_fl(const char *file, int line, const char *param,
442 - const char *value)
442 + const char *value, const struct key_value_info *kvi)
443 {
444 const char *event_name = "def_param";
445 struct strbuf buf_payload = STRBUF_INIT;
446 struct strbuf scope_payload = STRBUF_INIT;
447 - enum config_scope scope = current_config_scope();
447 + enum config_scope scope = kvi->scope;
448 const char *scope_name = config_scope_name(scope);
449
450 strbuf_addf(&buf_payload, "%s:%s", param, value);