Coverage Report

Created: 2025-12-31 07:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/git/trace2/tr2_cfg.c
Line
Count
Source
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
0
{
23
0
  const char *envvar;
24
25
0
  if (tr2_cfg_loaded)
26
0
    return tr2_cfg_patterns.nr;
27
0
  tr2_cfg_loaded = 1;
28
29
0
  envvar = tr2_sysenv_get(TR2_SYSENV_CFG_PARAM);
30
0
  if (!envvar || !*envvar)
31
0
    return tr2_cfg_patterns.nr;
32
33
0
  string_list_split_f(&tr2_cfg_patterns, envvar, ",", -1,
34
0
          STRING_LIST_SPLIT_TRIM);
35
0
  return tr2_cfg_patterns.nr;
36
0
}
37
38
void tr2_cfg_free_patterns(void)
39
0
{
40
0
  if (tr2_cfg_patterns.nr)
41
0
    string_list_clear(&tr2_cfg_patterns, 0);
42
0
  tr2_cfg_loaded = 0;
43
0
}
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
0
{
51
0
  const char *varlist;
52
53
0
  if (tr2_cfg_env_vars_loaded)
54
0
    return tr2_cfg_env_vars.nr;
55
0
  tr2_cfg_env_vars_loaded = 1;
56
57
0
  varlist = tr2_sysenv_get(TR2_SYSENV_ENV_VARS);
58
0
  if (!varlist || !*varlist)
59
0
    return tr2_cfg_env_vars.nr;
60
61
0
  string_list_split_f(&tr2_cfg_env_vars, varlist, ",", -1,
62
0
          STRING_LIST_SPLIT_TRIM);
63
0
  return tr2_cfg_env_vars.nr;
64
0
}
65
66
void tr2_cfg_free_env_vars(void)
67
0
{
68
0
  if (tr2_cfg_env_vars.nr)
69
0
    string_list_clear(&tr2_cfg_env_vars, 0);
70
0
  tr2_cfg_env_vars_loaded = 0;
71
0
}
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
0
{
84
0
  struct string_list_item *item;
85
0
  struct tr2_cfg_data *data = (struct tr2_cfg_data *)d;
86
87
0
  for_each_string_list_item(item, &tr2_cfg_patterns) {
88
0
    int wm = wildmatch(item->string, key, WM_CASEFOLD);
89
0
    if (wm == WM_MATCH) {
90
0
      trace2_def_param_fl(data->file, data->line, key, value,
91
0
              ctx->kvi);
92
0
      return 0;
93
0
    }
94
0
  }
95
96
0
  return 0;
97
0
}
98
99
void tr2_cfg_list_config_fl(const char *file, int line)
100
0
{
101
0
  struct tr2_cfg_data data = { file, line };
102
103
0
  if (tr2_cfg_load_patterns() > 0)
104
0
    read_early_config(the_repository, tr2_cfg_cb, &data);
105
0
}
106
107
void tr2_list_env_vars_fl(const char *file, int line)
108
0
{
109
0
  struct key_value_info kvi = KVI_INIT;
110
0
  struct string_list_item *item;
111
112
0
  kvi_from_param(&kvi);
113
0
  if (tr2_load_env_vars() <= 0)
114
0
    return;
115
116
0
  for_each_string_list_item(item, &tr2_cfg_env_vars) {
117
0
    const char *val = getenv(item->string);
118
0
    if (val && *val)
119
0
      trace2_def_param_fl(file, line, item->string, val, &kvi);
120
0
  }
121
0
}
122
123
void tr2_cfg_set_fl(const char *file, int line, const char *key,
124
        const char *value)
125
0
{
126
0
  struct key_value_info kvi = KVI_INIT;
127
0
  struct config_context ctx = {
128
0
    .kvi = &kvi,
129
0
  };
130
0
  struct tr2_cfg_data data = { file, line };
131
132
0
  if (tr2_cfg_load_patterns() > 0)
133
0
    tr2_cfg_cb(key, value, &ctx, &data);
134
0
}