repo-settings: introduce function to clear struct
We don't provide a way to clear a `struct repo_settings`, and instead open-code this in `repo_clear()`. This is mixing up concerns and means that developers have to touch multiple files whenever they add a new field to the structure in case the associated resources need to be released. Provide a new `repo_settings_clear()` function to improve this. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Patrick Steinhardt committed
Feb 7, 2025 at 12:03 UTC
b411ed60c7438eda3fd85a308050e88159f275fd
3 files changed
+10
-3
repo-settings.c
+8
-2
@@ -21,7 +21,6 @@ static void repo_cfg_int(struct repository *r, const char *key, int *dest,
21
22
void prepare_repo_settings(struct repository *r)
23
{
24
- const struct repo_settings defaults = REPO_SETTINGS_INIT;
24
int experimental;
25
int value;
26
const char *strval;
@@ -35,7 +34,7 @@ void prepare_repo_settings(struct repository *r)
34
if (r->settings.initialized)
35
return;
36
38
- memcpy(&r->settings, &defaults, sizeof(defaults));
37
+ repo_settings_clear(r);
38
r->settings.initialized++;
39
40
/* Booleans config or default, cascades to other settings */
@@ -143,6 +142,13 @@ void prepare_repo_settings(struct repository *r)
142
r->settings.packed_git_limit = ulongval;
143
}
144
145
+void repo_settings_clear(struct repository *r)
146
+{
147
+ struct repo_settings empty = REPO_SETTINGS_INIT;
148
+ FREE_AND_NULL(r->settings.fsmonitor);
149
+ r->settings = empty;
150
+}
151
+
152
enum log_refs_config repo_settings_get_log_all_ref_updates(struct repository *repo)
153
{
154
const char *value;
repo-settings.h
+1
@@ -73,6 +73,7 @@ struct repo_settings {
73
}
74
75
void prepare_repo_settings(struct repository *r);
76
+void repo_settings_clear(struct repository *r);
77
78
/* Read the value for "core.logAllRefUpdates". */
79
enum log_refs_config repo_settings_get_log_all_ref_updates(struct repository *repo);
repository.c
+1
-1
@@ -380,7 +380,7 @@ void repo_clear(struct repository *repo)
380
parsed_object_pool_clear(repo->parsed_objects);
381
FREE_AND_NULL(repo->parsed_objects);
382
383
- FREE_AND_NULL(repo->settings.fsmonitor);
383
+ repo_settings_clear(repo);
384
385
if (repo->config) {
386
git_configset_clear(repo->config);