]> git.ipfire.org Git - thirdparty/git.git/commitdiff
environment: stop storing `core.attributesFile` globally
authorOlamide Caleb Bello <belkid98@gmail.com>
Tue, 13 Jan 2026 16:44:00 +0000 (17:44 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 13 Jan 2026 19:14:41 +0000 (11:14 -0800)
The config value parsed in git_default_core_config() is loaded eagerly
and stored in the global variable `git_attributes_file`.
Storing this value in a global variable can lead to unexpected
behaviours when more than one Git repository run in the same Git process.

Move this value into a `struct repo_config_values` which holds all the
values parsed by `git_default_config()` and can be accessed per
repository via `git_default_config()`. This will ensure the current
behaviour remains the same while also enabling the libification of Git.

It is important to note that `git_default_config()` is a wrapper to other
`git_default_*_config()` such as `git_default_core_config()`.
Therefore to access and modify this global variable,
the change has to be made in the function which parses and
stores the value in the global variable.

Suggested-by: Phillip Wood <phillip.wood123@gmail.com>
Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Usman Akinyemi <usmanakinyemi202@gmail.com>
Signed-off-by: Olamide Caleb Bello <belkid98@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
attr.c
environment.c
environment.h
repository.h

diff --git a/attr.c b/attr.c
index 4999b7e09da930f7701e6fbd22306531c6f67ca8..fbb9eaffaf3f1530726ef223f79931dbb90add80 100644 (file)
--- a/attr.c
+++ b/attr.c
@@ -881,10 +881,11 @@ const char *git_attr_system_file(void)
 
 const char *git_attr_global_file(void)
 {
-       if (!git_attributes_file)
-               git_attributes_file = xdg_config_home("attributes");
+       struct repo_config_values *cfg = &the_repository->config_values;
+       if (!cfg->attributes_file_path)
+               cfg->attributes_file_path = xdg_config_home("attributes");
 
-       return git_attributes_file;
+       return cfg->attributes_file_path;
 }
 
 int git_attr_system_is_enabled(void)
index a770b5921d9546818b350157f7b4501db1261f4c..2789c3514a70405e796f84498f2f950f2dfe800d 100644 (file)
@@ -53,7 +53,6 @@ char *git_commit_encoding;
 char *git_log_output_encoding;
 char *apply_default_whitespace;
 char *apply_default_ignorewhitespace;
-char *git_attributes_file;
 int zlib_compression_level = Z_BEST_SPEED;
 int pack_compression_level = Z_DEFAULT_COMPRESSION;
 int fsync_object_files = -1;
@@ -327,6 +326,8 @@ next_name:
 static int git_default_core_config(const char *var, const char *value,
                                   const struct config_context *ctx, void *cb)
 {
+       struct repo_config_values *cfg = &the_repository->config_values;
+
        /* This needs a better name */
        if (!strcmp(var, "core.filemode")) {
                trust_executable_bit = git_config_bool(var, value);
@@ -364,8 +365,8 @@ static int git_default_core_config(const char *var, const char *value,
        }
 
        if (!strcmp(var, "core.attributesfile")) {
-               FREE_AND_NULL(git_attributes_file);
-               return git_config_pathname(&git_attributes_file, var, value);
+               FREE_AND_NULL(cfg->attributes_file_path);
+               return git_config_pathname(&cfg->attributes_file_path, var, value);
        }
 
        if (!strcmp(var, "core.bare")) {
index 51898c99cd1e451a47c1a4aae32869cfbddbce45..8c7803425e6a4f19320b84259366812f3e1b6d2b 100644 (file)
@@ -84,6 +84,12 @@ extern const char * const local_repo_env[];
 
 struct strvec;
 
+/* Config values parsed by git_default_config() */
+struct repo_config_values {
+       /* core config values */
+       char *attributes_file_path;
+};
+
 /*
  * Wrapper of getenv() that returns a strdup value. This value is kept
  * in argv to be freed later.
@@ -152,7 +158,6 @@ extern int assume_unchanged;
 extern int warn_on_object_refname_ambiguity;
 extern char *apply_default_whitespace;
 extern char *apply_default_ignorewhitespace;
-extern char *git_attributes_file;
 extern int zlib_compression_level;
 extern int pack_compression_level;
 extern unsigned long pack_size_limit_cfg;
index 6063c4b846d031d657827f8b16d65af8c09e5b29..638a1425773e52becd693e18ecfc9066b3af49cc 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "strmap.h"
 #include "repo-settings.h"
+#include "environment.h"
 
 struct config_set;
 struct git_hash_algo;
@@ -148,6 +149,9 @@ struct repository {
        /* Repository's compatibility hash algorithm. */
        const struct git_hash_algo *compat_hash_algo;
 
+       /* Repository's config values parsed by git_default_config() */
+       struct repo_config_values config_values;
+
        /* Repository's reference storage format, as serialized on disk. */
        enum ref_storage_format ref_storage_format;