aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2025-02-07 12:03:38 +0100
committerJunio C Hamano <gitster@pobox.com>2025-02-28 13:54:11 -0800
commitb411ed60c7438eda3fd85a308050e88159f275fd (patch)
tree051e974975806fc76199efe7fbe3693b7dc03a9c
parentpath: drop `git_path()` in favor of `repo_git_path()` (diff)
downloadgit-b411ed60c7438eda3fd85a308050e88159f275fd.tar.gz
git-b411ed60c7438eda3fd85a308050e88159f275fd.zip
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>
-rw-r--r--repo-settings.c10
-rw-r--r--repo-settings.h1
-rw-r--r--repository.c2
3 files changed, 10 insertions, 3 deletions
diff --git a/repo-settings.c b/repo-settings.c
index 9d16d5399e..719cd7c85c 100644
--- a/repo-settings.c
+++ b/repo-settings.c
@@ -21,7 +21,6 @@ static void repo_cfg_int(struct repository *r, const char *key, int *dest,
void prepare_repo_settings(struct repository *r)
{
- const struct repo_settings defaults = REPO_SETTINGS_INIT;
int experimental;
int value;
const char *strval;
@@ -35,7 +34,7 @@ void prepare_repo_settings(struct repository *r)
if (r->settings.initialized)
return;
- memcpy(&r->settings, &defaults, sizeof(defaults));
+ repo_settings_clear(r);
r->settings.initialized++;
/* Booleans config or default, cascades to other settings */
@@ -143,6 +142,13 @@ void prepare_repo_settings(struct repository *r)
r->settings.packed_git_limit = ulongval;
}
+void repo_settings_clear(struct repository *r)
+{
+ struct repo_settings empty = REPO_SETTINGS_INIT;
+ FREE_AND_NULL(r->settings.fsmonitor);
+ r->settings = empty;
+}
+
enum log_refs_config repo_settings_get_log_all_ref_updates(struct repository *repo)
{
const char *value;
diff --git a/repo-settings.h b/repo-settings.h
index 93ea0c3274..c4f7e3bd8a 100644
--- a/repo-settings.h
+++ b/repo-settings.h
@@ -73,6 +73,7 @@ struct repo_settings {
}
void prepare_repo_settings(struct repository *r);
+void repo_settings_clear(struct repository *r);
/* Read the value for "core.logAllRefUpdates". */
enum log_refs_config repo_settings_get_log_all_ref_updates(struct repository *repo);
diff --git a/repository.c b/repository.c
index 648cd88474..6cbaf2e3da 100644
--- a/repository.c
+++ b/repository.c
@@ -380,7 +380,7 @@ void repo_clear(struct repository *repo)
parsed_object_pool_clear(repo->parsed_objects);
FREE_AND_NULL(repo->parsed_objects);
- FREE_AND_NULL(repo->settings.fsmonitor);
+ repo_settings_clear(repo);
if (repo->config) {
git_configset_clear(repo->config);