]> git.ipfire.org Git - thirdparty/git.git/commitdiff
repo-settings: introduce function to clear struct
authorPatrick Steinhardt <ps@pks.im>
Fri, 7 Feb 2025 11:03:38 +0000 (12:03 +0100)
committerJunio C Hamano <gitster@pobox.com>
Fri, 28 Feb 2025 21:54:11 +0000 (13:54 -0800)
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>
repo-settings.c
repo-settings.h
repository.c

index 9d16d5399e3751a59f4cd527671d216f5e805363..719cd7c85c7be663b091edfb719c3edbb22e2a28 100644 (file)
@@ -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;
index 93ea0c3274112531bd93804a57da6469486a1ec1..c4f7e3bd8a8fe8b78907380c8afacb8a65b062bf 100644 (file)
@@ -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);
index 648cd88474eda3405b4436c12bda6a47b5c9e102..6cbaf2e3daa93a87849f59abf6a29cfe19175757 100644 (file)
@@ -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);