Re: [PATCH 3/3] environment: reorder variables in repo_config_values structure

Junio C Hamano <[email protected]> Wed, 05 Aug 2026 14:47:26 -0700
Newsgroups org.kernel.vger.git
Message-ID <[email protected]>
Tian Yuchen <[email protected]> writes:

> Reorder the fields in struct repo_config_values and its initialization
> function to follow the order of configuration sections.
>
> Keeping the declaration and initialization order aligned makes the
> structure easier to review and maintain.

Really?

Do you have some automated tool to make sure these initialization
assignments in the environment.c file and declaration in the
environment.h file match the order in Documentation/config/*.adoc or
something else?  Have you designated some list as the authoritative
source of truth to check these against?  Without such a list to
check the code against and a mechanism to enforce the ordering, I
find it hard to agree with such a claim that this makes it easier to
maintain.

It is typical to list the structure members in the order of stricter
to looser alignment requirement of their types.  I do not know how
strictly it is followed for "struct repo_config_values", but by
spreading pointer valued members more widely with smaller enums in
between, the change certainly is making the overall structure size
larger by requiring more padding between the members with different
alignment requirements.  Not that we would have 100s of instances of
these structures.

> Mentored-by: Christian Couder <[email protected]>
> Mentored-by: Ayush Chandekar <[email protected]>
> Mentored-by: Olamide Caleb Bello <[email protected]>
> Signed-off-by: Tian Yuchen <[email protected]>
> ---
>  environment.c | 31 +++++++++++++++++++++----------
>  environment.h | 20 +++++++++++++-------
>  2 files changed, 34 insertions(+), 17 deletions(-)
>
> diff --git a/environment.c b/environment.c
> index f5628b6758..918d8b50b8 100644
> --- a/environment.c
> +++ b/environment.c
> @@ -745,31 +745,42 @@ int git_default_config(const char *var, const char *value,
>  
>  void repo_config_values_init(struct repo_config_values *cfg)
>  {
> +	/* core */
>  	cfg->attributes_file = NULL;
>  	cfg->excludes_file = NULL;
>  	cfg->editor_program = NULL;
>  	cfg->pager_program = NULL;
>  	cfg->askpass_program = NULL;
> -	cfg->apply_default_whitespace = NULL;
> -	cfg->apply_default_ignorewhitespace = NULL;
> -	cfg->push_default = PUSH_DEFAULT_UNSPECIFIED;
> -	cfg->autorebase = AUTOREBASE_NEVER;
>  	cfg->object_creation_mode = OBJECT_CREATION_MODE;
>  	cfg->apply_sparse_checkout = 0;
> +	cfg->trust_ctime = 1;
> +	cfg->check_stat = 1;
> +	cfg->zlib_compression_level = Z_BEST_SPEED;
> +	cfg->precomposed_unicode = -1;
> +	cfg->core_sparse_checkout_cone = 0;
> +	cfg->warn_on_object_refname_ambiguity = 1;
>  	cfg->protect_hfs = PROTECT_HFS_DEFAULT;
>  	cfg->protect_ntfs = PROTECT_NTFS_DEFAULT;
>  	cfg->ignore_case = 0;
>  	cfg->trust_executable_bit = 1;
>  	cfg->has_symlinks = platform_has_symlinks();
> +
> +	/* apply */
> +	cfg->apply_default_whitespace = NULL;
> +	cfg->apply_default_ignorewhitespace = NULL;
> +
> +	/* branch */
> +	cfg->autorebase = AUTOREBASE_NEVER;
>  	cfg->branch_track = BRANCH_TRACK_REMOTE;
> -	cfg->trust_ctime = 1;
> -	cfg->check_stat = 1;
> -	cfg->zlib_compression_level = Z_BEST_SPEED;
> +
> +	/* pack */
>  	cfg->pack_compression_level = Z_DEFAULT_COMPRESSION;
> -	cfg->precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
> -	cfg->core_sparse_checkout_cone = 0;
> +
> +	/* push */
> +	cfg->push_default = PUSH_DEFAULT_UNSPECIFIED;
> +
> +	/* sparse */
>  	cfg->sparse_expect_files_outside_of_patterns = 0;
> -	cfg->warn_on_object_refname_ambiguity = 1;
>  }
>  
>  void repo_config_values_clear(struct repo_config_values *cfg)
> diff --git a/environment.h b/environment.h
> index 30678257b5..52ed13c0fc 100644
> --- a/environment.h
> +++ b/environment.h
> @@ -121,16 +121,11 @@ struct repo_config_values {
>  	char *editor_program;
>  	char *pager_program;
>  	char *askpass_program;
> -	char *apply_default_whitespace;
> -	char *apply_default_ignorewhitespace;
> -	enum push_default_type push_default;
> -	enum rebase_setup_type autorebase;
>  	enum object_creation_mode object_creation_mode;
>  	int apply_sparse_checkout;
>  	int trust_ctime;
>  	int check_stat;
>  	int zlib_compression_level;
> -	int pack_compression_level;
>  	int precomposed_unicode;
>  	int core_sparse_checkout_cone;
>  	int warn_on_object_refname_ambiguity;
> @@ -140,11 +135,22 @@ struct repo_config_values {
>  	int trust_executable_bit;
>  	int has_symlinks;
>  
> -	/* section "sparse" config values */
> -	int sparse_expect_files_outside_of_patterns;
> +	/* section "apply" config values */
> +	char *apply_default_whitespace;
> +	char *apply_default_ignorewhitespace;
>  
>  	/* section "branch" config values */
> +	enum rebase_setup_type autorebase;
>  	enum branch_track branch_track;
> +
> +	/* section "pack" config values */
> +	int pack_compression_level;
> +
> +	/* section "push" config values */
> +	enum push_default_type push_default;
> +
> +	/* section "sparse" config values */
> +	int sparse_expect_files_outside_of_patterns;
>  };
>  
>  struct repo_config_values *repo_config_values(struct repository *repo);