From: Junio C Hamano <gitster@pobox.com>
To: Olamide Caleb Bello <belkid98@gmail.com>
Cc: git@vger.kernel.org, toon@iotcl.com, phillip.wood123@gmail.com,
christian.couder@gmail.com, usmanakinyemi202@gmail.com,
kaartic.sivaraam@gmail.com, me@ttaylorr.com,
karthik.188@gmail.com
Subject: Re: [Outreachy PATCH v5 1/3] environment: stop storing `core.attributesFile` globally
Date: Thu, 29 Jan 2026 10:01:56 -0800 [thread overview]
Message-ID: <xmqqv7gkb8mj.fsf@gitster.g> (raw)
In-Reply-To: <d28850bcdb5677ad0c81cf4bfa51ae1c056aabd3.1769256839.git.belkid98@gmail.com> (Olamide Caleb Bello's message of "Sat, 24 Jan 2026 13:21:11 +0100")
Olamide Caleb Bello <belkid98@gmail.com> writes:
> 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;
Here, the_repository, being defined in repository.c as the address
of a singleton "the_repo" instance, cannot be NULL even outside a
repository, so taking the address of its config_values member is
always safe. OK.
> + if (!cfg->attributes_file)
> + cfg->attributes_file = xdg_config_home("attributes");
>
> - return git_attributes_file;
> + return cfg->attributes_file;
> }
> diff --git a/repository.h b/repository.h
> index 6063c4b846..638a142577 100644
> --- a/repository.h
> +++ b/repository.h
> @@ -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;
And because this new config_values member is directly embedded in
the repository structure, and "the_repo" instance is a global in
BSS, its members are initialized exactly the same way as the
global variables like git_attributes_file were initialized. Good.
> diff --git a/environment.c b/environment.c
> index a770b5921d..72735d9e4b 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;
And we lose this global, that used to be zero-initialized for being
in BSS.
> @@ -327,6 +326,8 @@ static enum fsync_component parse_fsync_components(const char *var, const char *
> 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);
> + 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;
> }
And instead of assigning to the global git_attributes_file, we
assign to the config_values.attributes_file member via the global
"the_repository". No functional changes. OK.
> +void repo_config_values_init(struct repo_config_values *cfg)
> +{
> + cfg->attributes_file = NULL;
> +}
This is not strictly needed, as git_attributes_file is left to be
zero-initialized for being in BSS; its replacement, i.e.,
the_repo.config_values.attributes_file, will be zero-initialized the
same way.
But other members we may want add later to the struct may need a
place to initialize them. Or we can do a static initialization for
the_repo in repository.c then we do not have to have this function
and we do not have to call it. Either would work fine, as long as
everybody calls initialize_repository() function, which is the only
caller of this helper.
> diff --git a/environment.h b/environment.h
> index 51898c99cd..0c0dcc6847 100644
> --- a/environment.h
> +++ b/environment.h
> @@ -84,6 +84,11 @@ extern const char * const local_repo_env[];
>
> struct strvec;
>
> +struct repo_config_values {
> + /* section "core" config values */
> + char *attributes_file;
> +};
OK.
> diff --git a/repository.c b/repository.c
> index c7e75215ac..d308cd78bf 100644
> --- a/repository.c
> +++ b/repository.c
> @@ -57,6 +57,7 @@ void initialize_repository(struct repository *repo)
> ALLOC_ARRAY(repo->index, 1);
> index_state_init(repo->index, repo);
> repo->check_deprecated_config = true;
> + repo_config_values_init(&repo->config_values);
>
> /*
> * When a command runs inside a repository, it learns what
Continuing the discussion on repo_config_values_init(), currently,
initialize_repository() is called by init_git(), which is called
from "main()", so it should be fairly safe to assume that all in Git
codebase will call repo_config_values_init().
But those who replace "main()" for their own libified use of Git
code may not call init_git() hence initialize_repository() hence
your repo_config_values_init(). In that sense, this is less safe
than the other alternative.
next prev parent reply other threads:[~2026-01-29 18:01 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-12 12:59 [Outreachy PATCH RFC 0/3] store git_default_config() parsed values in new config struct Olamide Caleb Bello
2026-01-12 12:59 ` [Outreachy PATCH RFC 1/3] environment: stop storing `core.attributesFile` globally Olamide Caleb Bello
2026-01-12 14:29 ` Phillip Wood
2026-01-12 15:05 ` Bello Olamide
2026-01-12 12:59 ` [Outreachy PATCH RFC 2/3] environment: stop using core.sparseCheckout globally Olamide Caleb Bello
2026-01-12 12:59 ` [Outreachy PATCH RFC 3/3] environment: move "branch.autoSetupMerge" into `struct config_values` Olamide Caleb Bello
2026-01-13 16:43 ` [Outreachy PATCH v2 0/3] store git_default_config() parsed values in new config struct Olamide Caleb Bello
2026-01-13 16:44 ` [Outreachy PATCH v2 1/3] environment: stop storing `core.attributesFile` globally Olamide Caleb Bello
2026-01-13 19:26 ` Junio C Hamano
2026-01-14 6:59 ` Bello Olamide
2026-01-13 16:44 ` [Outreachy PATCH v2 2/3] environment: environment: stop using core.sparseCheckout globally Olamide Caleb Bello
2026-01-13 19:38 ` Junio C Hamano
2026-01-14 7:16 ` Bello Olamide
2026-01-13 16:44 ` [Outreachy PATCH v2 3/3] environment: move "branch.autoSetupMerge" into `struct repo_config_values` Olamide Caleb Bello
2026-01-13 19:53 ` Junio C Hamano
2026-01-14 7:40 ` Bello Olamide
2026-01-15 22:17 ` [Outreachy PATCH v2 0/3] store git_default_config() parsed values in new config struct Bello Olamide
2026-01-17 20:59 ` [Outreachy PATCH v3 0/3] store repo specific config values in new `struct repo_config_values` Olamide Caleb Bello
2026-01-17 20:59 ` [Outreachy PATCH v3 1/3] environment: stop storing `core.attributesFile` globally Olamide Caleb Bello
2026-01-22 12:13 ` Toon Claes
2026-01-22 15:08 ` Bello Olamide
2026-01-22 14:40 ` Phillip Wood
2026-01-22 15:11 ` Bello Olamide
2026-01-17 20:59 ` [Outreachy PATCH v3 2/3] environment: environment: stop using core.sparseCheckout globally Olamide Caleb Bello
2026-01-22 12:13 ` Toon Claes
2026-01-22 15:17 ` Bello Olamide
2026-01-22 14:41 ` Phillip Wood
2026-01-22 15:29 ` Bello Olamide
2026-01-23 10:43 ` Phillip Wood
2026-01-23 13:24 ` Bello Olamide
2026-01-17 20:59 ` [Outreachy PATCH v3 3/3] environment: move "branch.autoSetupMerge" into `struct repo_config_values` Olamide Caleb Bello
2026-01-22 14:41 ` Phillip Wood
2026-01-22 15:29 ` Bello Olamide
2026-01-20 15:19 ` [Outreachy PATCH v3 0/3] store repo specific config values in new " Bello Olamide
2026-01-24 11:55 ` [Outreachy PATCH v4 " Olamide Caleb Bello
2026-01-24 11:55 ` [Outreachy PATCH v4 1/3] environment: stop storing `core.attributesFile` globally Olamide Caleb Bello
2026-01-24 11:55 ` [Outreachy PATCH v4 2/3] environment: stop using core.sparseCheckout globally Olamide Caleb Bello
2026-01-24 11:55 ` [Outreachy PATCH v4 3/3] environment: move "branch.autoSetupMerge" into `struct repo_config_values` Olamide Caleb Bello
2026-01-24 12:21 ` [Outreachy PATCH v5 0/3] store repo specific config values in new " Olamide Caleb Bello
2026-01-24 12:21 ` [Outreachy PATCH v5 1/3] environment: stop storing `core.attributesFile` globally Olamide Caleb Bello
2026-01-29 18:01 ` Junio C Hamano [this message]
2026-01-24 12:21 ` [Outreachy PATCH v5 2/3] environment: stop using core.sparseCheckout globally Olamide Caleb Bello
2026-01-29 18:12 ` Junio C Hamano
2026-01-24 12:21 ` [Outreachy PATCH v5 3/3] environment: move "branch.autoSetupMerge" into `struct repo_config_values` Olamide Caleb Bello
2026-01-29 18:37 ` Junio C Hamano
2026-01-30 16:20 ` Junio C Hamano
2026-01-30 20:15 ` Junio C Hamano
2026-01-29 8:29 ` [Outreachy PATCH v5 0/3] store repo specific config values in new " Bello Olamide
2026-02-03 15:42 ` [Outreachy PATCH v6 " Olamide Caleb Bello
2026-02-03 15:42 ` [Outreachy PATCH v6 1/3] environment: stop storing `core.attributesFile` globally Olamide Caleb Bello
2026-02-04 16:39 ` Phillip Wood
2026-02-09 8:47 ` Bello Olamide
2026-02-07 1:14 ` Junio C Hamano
2026-02-08 11:14 ` Phillip Wood
2026-02-09 8:54 ` Bello Olamide
2026-02-10 8:40 ` Bello Olamide
2026-02-03 15:42 ` [Outreachy PATCH v6 2/3] environment: stop using core.sparseCheckout globally Olamide Caleb Bello
2026-02-04 16:55 ` Phillip Wood
2026-02-03 15:42 ` [Outreachy PATCH v6 3/3] environment: move "branch.autoSetupMerge" into `struct repo_config_values` Olamide Caleb Bello
2026-02-04 16:57 ` [Outreachy PATCH v6 0/3] store repo specific config values in new " Phillip Wood
2026-02-16 16:38 ` [Outreachy PATCH v7 " Olamide Caleb Bello
2026-02-16 16:38 ` [Outreachy PATCH v7 1/3] environment: stop storing `core.attributesFile` globally Olamide Caleb Bello
2026-02-16 16:38 ` [Outreachy PATCH v7 2/3] environment: stop using core.sparseCheckout globally Olamide Caleb Bello
2026-02-26 12:57 ` Christian Couder
2026-02-26 15:23 ` Junio C Hamano
2026-02-26 16:24 ` Bello Olamide
2026-02-16 16:38 ` [Outreachy PATCH v7 3/3] environment: move "branch.autoSetupMerge" into `struct repo_config_values` Olamide Caleb Bello
2026-02-17 20:08 ` [Outreachy PATCH v7 0/3] store repo specific config values in new " Junio C Hamano
2026-02-18 11:27 ` Bello Olamide
2026-02-26 13:03 ` Christian Couder
2026-02-26 15:19 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqv7gkb8mj.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=belkid98@gmail.com \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=kaartic.sivaraam@gmail.com \
--cc=karthik.188@gmail.com \
--cc=me@ttaylorr.com \
--cc=phillip.wood123@gmail.com \
--cc=toon@iotcl.com \
--cc=usmanakinyemi202@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox