Raw
1 #define USE_THE_REPOSITORY_VARIABLE
2
3 #include "git-compat-util.h"
4 #include "config.h"
5 #include "strbuf.h"
6 #include "trace2.h"
7 #include "trace2/tr2_cfg.h"
8 #include "trace2/tr2_sysenv.h"
9 #include "wildmatch.h"
10
11 static struct string_list tr2_cfg_patterns = STRING_LIST_INIT_DUP;
12 static int tr2_cfg_loaded;
13
14 static struct string_list tr2_cfg_env_vars = STRING_LIST_INIT_DUP;
15 static int tr2_cfg_env_vars_loaded;
16
17 /*
18 * Parse a string containing a comma-delimited list of config keys
19 * or wildcard patterns into a string list.
20 */
21 static size_t tr2_cfg_load_patterns(void)
22 {
23 const char *envvar;
24
25 if (tr2_cfg_loaded)
26 return tr2_cfg_patterns.nr;
27 tr2_cfg_loaded = 1;
28
29 envvar = tr2_sysenv_get(TR2_SYSENV_CFG_PARAM);
30 if (!envvar || !*envvar)
31 return tr2_cfg_patterns.nr;
32
33 string_list_split_f(&tr2_cfg_patterns, envvar, ",", -1,
34 STRING_LIST_SPLIT_TRIM);
35 return tr2_cfg_patterns.nr;
36 }
37
38 void tr2_cfg_free_patterns(void)
39 {
40 if (tr2_cfg_patterns.nr)
41 string_list_clear(&tr2_cfg_patterns, 0);
42 tr2_cfg_loaded = 0;
43 }
44
45 /*
46 * Parse a string containing a comma-delimited list of environment variable
47 * names into a string list.
48 */
49 static size_t tr2_load_env_vars(void)
50 {
51 const char *varlist;
52
53 if (tr2_cfg_env_vars_loaded)
54 return tr2_cfg_env_vars.nr;
55 tr2_cfg_env_vars_loaded = 1;
56
57 varlist = tr2_sysenv_get(TR2_SYSENV_ENV_VARS);
58 if (!varlist || !*varlist)
59 return tr2_cfg_env_vars.nr;
60
61 string_list_split_f(&tr2_cfg_env_vars, varlist, ",", -1,
62 STRING_LIST_SPLIT_TRIM);
63 return tr2_cfg_env_vars.nr;
64 }
65
66 void tr2_cfg_free_env_vars(void)
67 {
68 if (tr2_cfg_env_vars.nr)
69 string_list_clear(&tr2_cfg_env_vars, 0);
70 tr2_cfg_env_vars_loaded = 0;
71 }
72
73 struct tr2_cfg_data {
74 const char *file;
75 int line;
76 };
77
78 /*
79 * See if the given config key matches any of our patterns of interest.
80 */
81 static int tr2_cfg_cb(const char *key, const char *value,
82 const struct config_context *ctx, void *d)
83 {
84 struct string_list_item *item;
85 struct tr2_cfg_data *data = (struct tr2_cfg_data *)d;
86
87 for_each_string_list_item(item, &tr2_cfg_patterns) {
88 int wm = wildmatch(item->string, key, WM_CASEFOLD);
89 if (wm == WM_MATCH) {
90 trace2_def_param_fl(data->file, data->line, key, value,
91 ctx->kvi);
92 return 0;
93 }
94 }
95
96 return 0;
97 }
98
99 void tr2_cfg_list_config_fl(const char *file, int line)
100 {
101 struct tr2_cfg_data data = { file, line };
102
103 if (tr2_cfg_load_patterns() > 0)
104 read_early_config(the_repository, tr2_cfg_cb, &data);
105 }
106
107 void tr2_list_env_vars_fl(const char *file, int line)
108 {
109 struct key_value_info kvi = KVI_INIT;
110 struct string_list_item *item;
111
112 kvi_from_param(&kvi);
113 if (tr2_load_env_vars() <= 0)
114 return;
115
116 for_each_string_list_item(item, &tr2_cfg_env_vars) {
117 const char *val = getenv(item->string);
118 if (val && *val)
119 trace2_def_param_fl(file, line, item->string, val, &kvi);
120 }
121 }
122
123 void tr2_cfg_set_fl(const char *file, int line, const char *key,
124 const char *value)
125 {
126 struct key_value_info kvi = KVI_INIT;
127 struct config_context ctx = {
128 .kvi = &kvi,
129 };
130 struct tr2_cfg_data data = { file, line };
131
132 if (tr2_cfg_load_patterns() > 0)
133 tr2_cfg_cb(key, value, &ctx, &data);
134 }