1 #include "git-compat-util.h"
4 #include "tr2_sysenv.h"
7 * Each entry represents a trace2 setting.
8 * See Documentation/technical/api-trace2.txt
10 struct tr2_sysenv_entry
{
11 const char *env_var_name
;
12 const char *git_config_name
;
15 unsigned int getenv_called
: 1;
19 * This table must match "enum tr2_sysenv_variable" in tr2_sysenv.h.
21 * The strings in this table are constant and must match the published
22 * config and environment variable names as described in the documentation.
24 * We do not define entries for the GIT_TRACE2_PARENT_* environment
25 * variables because they are transient and used to pass information
26 * from parent to child git processes, rather than settings.
28 /* clang-format off */
29 static struct tr2_sysenv_entry tr2_sysenv_settings
[] = {
30 [TR2_SYSENV_CFG_PARAM
] = { "GIT_TRACE2_CONFIG_PARAMS",
31 "trace2.configparams" },
32 [TR2_SYSENV_ENV_VARS
] = { "GIT_TRACE2_ENV_VARS",
35 [TR2_SYSENV_DST_DEBUG
] = { "GIT_TRACE2_DST_DEBUG",
36 "trace2.destinationdebug" },
38 [TR2_SYSENV_NORMAL
] = { "GIT_TRACE2",
39 "trace2.normaltarget" },
40 [TR2_SYSENV_NORMAL_BRIEF
] = { "GIT_TRACE2_BRIEF",
41 "trace2.normalbrief" },
43 [TR2_SYSENV_EVENT
] = { "GIT_TRACE2_EVENT",
44 "trace2.eventtarget" },
45 [TR2_SYSENV_EVENT_BRIEF
] = { "GIT_TRACE2_EVENT_BRIEF",
46 "trace2.eventbrief" },
47 [TR2_SYSENV_EVENT_NESTING
] = { "GIT_TRACE2_EVENT_NESTING",
48 "trace2.eventnesting" },
50 [TR2_SYSENV_PERF
] = { "GIT_TRACE2_PERF",
51 "trace2.perftarget" },
52 [TR2_SYSENV_PERF_BRIEF
] = { "GIT_TRACE2_PERF_BRIEF",
55 [TR2_SYSENV_MAX_FILES
] = { "GIT_TRACE2_MAX_FILES",
60 static int tr2_sysenv_cb(const char *key
, const char *value
,
61 const struct config_context
*ctx UNUSED
, void *d
)
65 if (!starts_with(key
, "trace2."))
68 for (k
= 0; k
< ARRAY_SIZE(tr2_sysenv_settings
); k
++) {
69 if (!strcmp(key
, tr2_sysenv_settings
[k
].git_config_name
)) {
70 free(tr2_sysenv_settings
[k
].value
);
71 tr2_sysenv_settings
[k
].value
= xstrdup(value
);
80 * Load Trace2 settings from the system config (usually "/etc/gitconfig"
81 * unless we were built with a runtime-prefix). These are intended to
82 * define the default values for Trace2 as requested by the administrator.
84 * Then override with the Trace2 settings from the global config.
86 void tr2_sysenv_load(void)
88 if (ARRAY_SIZE(tr2_sysenv_settings
) != TR2_SYSENV_MUST_BE_LAST
)
89 BUG("tr2_sysenv_settings size is wrong");
91 read_very_early_config(tr2_sysenv_cb
, NULL
);
95 * Return the value for the requested Trace2 setting from these sources:
96 * the system config, the global config, and the environment.
98 const char *tr2_sysenv_get(enum tr2_sysenv_variable var
)
100 if (var
>= TR2_SYSENV_MUST_BE_LAST
)
101 BUG("tr2_sysenv_get invalid var '%d'", var
);
103 if (!tr2_sysenv_settings
[var
].getenv_called
) {
104 const char *v
= getenv(tr2_sysenv_settings
[var
].env_var_name
);
106 free(tr2_sysenv_settings
[var
].value
);
107 tr2_sysenv_settings
[var
].value
= xstrdup(v
);
109 tr2_sysenv_settings
[var
].getenv_called
= 1;
112 return tr2_sysenv_settings
[var
].value
;
116 * Return a friendly name for this setting that is suitable for printing
117 * in an error messages.
119 const char *tr2_sysenv_display_name(enum tr2_sysenv_variable var
)
121 if (var
>= TR2_SYSENV_MUST_BE_LAST
)
122 BUG("tr2_sysenv_get invalid var '%d'", var
);
124 return tr2_sysenv_settings
[var
].env_var_name
;
127 void tr2_sysenv_release(void)
131 for (k
= 0; k
< ARRAY_SIZE(tr2_sysenv_settings
); k
++)
132 free(tr2_sysenv_settings
[k
].value
);