environment: migrate apply_default_whitespace and apply_default_ignorewhitespace

The global variables 'apply_default_whitespace' and 'apply_default_ignorewhitespace' are used to store the default whitespace configuration for 'git apply'. Move these variables into 'struct repo_config_values' to continue the libification effort. Dynamically allocated strings fetched via 'repo_config_get_string()' are now tracked per-repository and safely freed in 'repo_config_values_clear()'. As part of this transition, update 'git_apply_config()' to accept a 'struct repository *' argument rather than relying on the 'the_repository' global. Mentored-by: Christian Couder <christian.couder@gmail.com> Mentored-by: Ayush Chandekar <ayu.chandekar@gmail.com> Mentored-by: Olamide Caleb Bello <belkid98@gmail.com> Signed-off-by: Tian Yuchen <cat@malon.dev> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Tian Yuchen committed Jul 14, 2026 at 11:25 UTC a9f5e90fb9068fd1a1a9a7c9a60f005e7ed392dd
3 files changed +26 -12
apply.c
+20 -8
@@ -47,11 +47,17 @@ struct gitdiff_data {
47 int p_value;
48 };
49
50 -static void git_apply_config(void)
50 +static void git_apply_config(struct repository *repo)
51 {
52 - repo_config_get_string(the_repository, "apply.whitespace", &apply_default_whitespace);
53 - repo_config_get_string(the_repository, "apply.ignorewhitespace", &apply_default_ignorewhitespace);
54 - repo_config(the_repository, git_xmerge_config, NULL);
52 + struct repo_config_values *cfg = repo_config_values(repo);
53 +
54 + FREE_AND_NULL(cfg->apply_default_whitespace);
55 + repo_config_get_string(repo, "apply.whitespace",
56 + &cfg->apply_default_whitespace);
57 + FREE_AND_NULL(cfg->apply_default_ignorewhitespace);
58 + repo_config_get_string(repo, "apply.ignorewhitespace",
59 + &cfg->apply_default_ignorewhitespace);
60 + repo_config(repo, git_xmerge_config, NULL);
61 }
62
63 static int parse_whitespace_option(struct apply_state *state, const char *option)
@@ -109,6 +115,8 @@ int init_apply_state(struct apply_state *state,
115 struct repository *repo,
116 const char *prefix)
117 {
118 + struct repo_config_values *cfg = repo_config_values(repo);
119 +
120 memset(state, 0, sizeof(*state));
121 state->prefix = prefix;
122 state->repo = repo;
@@ -126,10 +134,13 @@ int init_apply_state(struct apply_state *state,
134 strset_init(&state->kept_symlinks);
135 strbuf_init(&state->root, 0);
136
129 - git_apply_config();
130 - if (apply_default_whitespace && parse_whitespace_option(state, apply_default_whitespace))
137 + git_apply_config(repo);
138 +
139 + if (cfg->apply_default_whitespace &&
140 + parse_whitespace_option(state, cfg->apply_default_whitespace))
141 return -1;
132 - if (apply_default_ignorewhitespace && parse_ignorewhitespace_option(state, apply_default_ignorewhitespace))
142 + if (cfg->apply_default_ignorewhitespace &&
143 + parse_ignorewhitespace_option(state, cfg->apply_default_ignorewhitespace))
144 return -1;
145 return 0;
146 }
@@ -192,7 +203,8 @@ int check_apply_state(struct apply_state *state, int force_apply)
203
204 static void set_default_whitespace_mode(struct apply_state *state)
205 {
195 - if (!state->whitespace_option && !apply_default_whitespace)
206 + if (!state->whitespace_option &&
207 + !repo_config_values(state->repo)->apply_default_whitespace)
208 state->ws_error_action = (state->apply ? warn_on_ws_error : nowarn_ws_error);
209 }
210
environment.c
+4 -2
@@ -49,8 +49,6 @@ int assume_unchanged;
49 int is_bare_repository_cfg = -1; /* unspecified */
50 char *git_commit_encoding;
51 char *git_log_output_encoding;
52 -char *apply_default_whitespace;
53 -char *apply_default_ignorewhitespace;
52 int fsync_object_files = -1;
53 int use_fsync = -1;
54 enum fsync_method fsync_method = FSYNC_METHOD_DEFAULT;
@@ -726,6 +724,8 @@ void repo_config_values_init(struct repo_config_values *cfg)
724 cfg->editor_program = NULL;
725 cfg->pager_program = NULL;
726 cfg->askpass_program = NULL;
727 + cfg->apply_default_whitespace = NULL;
728 + cfg->apply_default_ignorewhitespace = NULL;
729 cfg->apply_sparse_checkout = 0;
730 cfg->branch_track = BRANCH_TRACK_REMOTE;
731 cfg->trust_ctime = 1;
@@ -745,4 +745,6 @@ void repo_config_values_clear(struct repo_config_values *cfg)
745 FREE_AND_NULL(cfg->editor_program);
746 FREE_AND_NULL(cfg->pager_program);
747 FREE_AND_NULL(cfg->askpass_program);
748 + FREE_AND_NULL(cfg->apply_default_whitespace);
749 + FREE_AND_NULL(cfg->apply_default_ignorewhitespace);
750 }
environment.h
+2 -2
@@ -94,6 +94,8 @@ struct repo_config_values {
94 char *editor_program;
95 char *pager_program;
96 char *askpass_program;
97 + char *apply_default_whitespace;
98 + char *apply_default_ignorewhitespace;
99 int apply_sparse_checkout;
100 int trust_ctime;
101 int check_stat;
@@ -182,8 +184,6 @@ extern int has_symlinks;
184 extern int minimum_abbrev, default_abbrev;
185 extern int ignore_case;
186 extern int assume_unchanged;
185 -extern char *apply_default_whitespace;
186 -extern char *apply_default_ignorewhitespace;
187 extern unsigned long pack_size_limit_cfg;
188
189 extern int protect_hfs;