Subject: Re: [Outreachy PATCH v6 2/3] environment: stop using core.sparseCheckout globally

From: Phillip Wood <[email-masked]>
Date: Wed, 4 Feb 2026 16:55:51 +0000

On 03/02/2026 15:42, Olamide Caleb Bello wrote:
> The config value `core.sparseCheckout` is parsed in
> `git_default_core_config()` and stored globally in
> `core_apply_sparse_checkout`. This could cause it to be overwritten
> by another repository when different Git repositories run in the same
> process.
> 
> Move the parsed value into `struct repo_config_values` in the_repository
> to retain current behaviours and move towards libifying Git.

This looks good, I've left a small style comment below

> diff --git a/builtin/clone.c b/builtin/clone.c
> index b19b302b06..0005fd7118 100644
> --- a/builtin/clone.c
> +++ b/builtin/clone.c
> @@ -617,13 +617,14 @@ static int git_sparse_checkout_init(const char *repo)
>   {
>   	struct child_process cmd = CHILD_PROCESS_INIT;
>   	int result = 0;
> +	struct repo_config_values *cfg = repo_config_values(the_repository);

We normally have a blank line between the varibale declarations and 
statements. As you're adding a new declaration here it would be good to 
add a blank line as well. The same goes for dir.c and sparse-index.c below.

Thanks

Phillip

>   	strvec_pushl(&cmd.args, "-C", repo, "sparse-checkout", "set", NULL);

 > diff --git a/dir.c b/dir.c
 > index b00821f294..0e05b3a383 100644
 > --- a/dir.c
 > +++ b/dir.c
 > @@ -1551,7 +1551,8 @@ enum pattern_match_result 
path_matches_pattern_list(
 >
 >  int init_sparse_checkout_patterns(struct index_state *istate)
 >  {
 > -	if (!core_apply_sparse_checkout)
 > +	struct repo_config_values *cfg = repo_config_values(the_repository);
 > +	if (!cfg->apply_sparse_checkout)
 >  		return 1;
 >  	if (istate->sparse_checkout_patterns)
 >  		return 0;

> diff --git a/sparse-index.c b/sparse-index.c
> index 76f90da5f5..cb4c99dcae 100644
> --- a/sparse-index.c
> +++ b/sparse-index.c
> @@ -152,7 +152,8 @@ static int index_has_unmerged_entries(struct index_state *istate)
>   
>   int is_sparse_index_allowed(struct index_state *istate, int flags)
>   {
> -	if (!core_apply_sparse_checkout || !core_sparse_checkout_cone)
> +	struct repo_config_values *cfg = repo_config_values(the_repository);
> +	if (!cfg->apply_sparse_checkout || !core_sparse_checkout_cone)
>   		return 0;
>   
>   	if (!(flags & SPARSE_INDEX_MEMORY_ONLY)) {
> @@ -670,7 +671,8 @@ static void clear_skip_worktree_from_present_files_full(struct index_state *ista
>   
>   void clear_skip_worktree_from_present_files(struct index_state *istate)
>   {
> -	if (!core_apply_sparse_checkout ||
> +	struct repo_config_values *cfg = repo_config_values(the_repository);
> +	if (!cfg->apply_sparse_checkout ||
>   	    sparse_expect_files_outside_of_patterns)
>   		return;
>