The `core.attributeFile` config value is parsed in
git_default_core_config(), loaded eagerly and stored in the global
variable `git_attributes_file`. Storing this value in a global
variable can lead to it being overwritten by another repository when
more than one Git repository run in the same Git process.
Create a new struct `repo_config_values` to hold this value and
other repository dependent values parsed by `git_default_config()`.
This will ensure the current behaviour remains the same while also
enabling the libification of Git.
An accessor function 'repo_config_values()' s created to ensure
that we do not access an uninitialized repository, or an instance
of a different repository than the current one.
Suggested-by: Phillip Wood <phillip.wood123@gmail.com>
Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Usman Akinyemi <usmanakinyemi202@gmail.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Olamide Caleb Bello <belkid98@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Olamide Caleb Bello committedFeb 16, 2026 at 17:38 UTCf9b3c1f731dd12144cd6d1e27787e99beb3a631f
6 files changed+45-7
attr.c
+4-3
index 4999b7e09d..75369547b3 100644--- 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 = repo_config_values(the_repository);+ if (!cfg->attributes_file)+ cfg->attributes_file = xdg_config_home("attributes");- return git_attributes_file;+ return cfg->attributes_file; } int git_attr_system_is_enabled(void)
environment.c
+9-3
index a770b5921d..4b5c701e80 100644--- a/environment.c+++ b/environment.c@@ -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 = repo_config_values(the_repository);+ /* 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);+ return git_config_pathname(&cfg->attributes_file, var, value); } if (!strcmp(var, "core.bare")) {@@ -756,3 +757,8 @@ int git_default_config(const char *var, const char *value, /* Add other config variables here and to Documentation/config.adoc. */ return 0; }++void repo_config_values_init(struct repo_config_values *cfg)+{+ cfg->attributes_file = NULL;+}
environment.h
+10-1
index 51898c99cd..dfc31b794d 100644--- a/environment.h+++ b/environment.h@@ -84,6 +84,14 @@ extern const char * const local_repo_env[]; struct strvec;+struct repository;+struct repo_config_values {+ /* section "core" config values */+ char *attributes_file;+};++struct repo_config_values *repo_config_values(struct repository *repo);+ /* * Wrapper of getenv() that returns a strdup value. This value is kept * in argv to be freed later.@@ -107,6 +115,8 @@ const char *strip_namespace(const char *namespaced_ref); int git_default_config(const char *, const char *, const struct config_context *, void *);+void repo_config_values_init(struct repo_config_values *cfg);+ /* * TODO: All the below state either explicitly or implicitly relies on * `the_repository`. We should eventually get rid of these and make the@@ -152,7 +162,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;