Git development
 help / color / mirror / Atom feed
From: Tian Yuchen <cat@malon.dev>
To: Pablo Sabater <pabloosabaterr@gmail.com>, git@vger.kernel.org
Cc: cirnovskyv@gmail.com, szeder.dev@gmail.com,
	Christian Couder <christian.couder@gmail.com>,
	Ayush Chandekar <ayu.chandekar@gmail.com>,
	Olamide Caleb Bello <belkid98@gmail.com>
Subject: Re: [PATCH v10 4/9] environment: move pager_program into repo_config_values
Date: Mon, 13 Jul 2026 00:54:58 +0800	[thread overview]
Message-ID: <79e2b5b4-fc9e-4ca6-a4ff-dff93a3c64bc@malon.dev> (raw)
In-Reply-To: <DJWNK8BOFIAW.3VVAROHMKVDWE@gmail.com>

On 7/12/26 22:12, Pablo Sabater wrote:
> On Sun Jul 12, 2026 at 1:17 PM CEST, Tian Yuchen wrote:
>> The 'pager_program' variable is currently defined as a file-scoped
>> static string in pager.c. Move it into 'struct repo_config_values'.
>>
>> The configuration parsing logic remains strictly within pager.c to
>> respect subsystem boundaries. The read/write operations are simply
>> redirected to the repository-specific structure using
>> 'repo_config_values()'.
>>
>> Similar to the recent editor_program migration, no standalone getter
>> is introduced to keep the code minimal. The dynamically allocated
>> memory is now managed by 'repo_config_values_clear()'.
>>
>> On top of that, fix a memory leak in pager.c while we are at it.
>>
>> Mentored-by: Christian Couder <christian.couder@gmail.com>
>> Mentored-by: Ayush Chandekar <ayu.chandekar@gmail.com>
>> Mentored-by: Olamide Caleb Bello <belkid98@gmail.com>
>> Signed-off-by: Tian Yuchen <cat@malon.dev>
>> ---
>>   environment.c |  2 ++
>>   environment.h |  1 +
>>   pager.c       | 26 +++++++++++++++++---------
>>   3 files changed, 20 insertions(+), 9 deletions(-)
>>
>> diff --git a/environment.c b/environment.c
>> index a65d575af4..975c9cb9eb 100644
>> --- a/environment.c
>> +++ b/environment.c
>> @@ -725,6 +725,7 @@ void repo_config_values_init(struct repo_config_values *cfg)
>>   	cfg->attributes_file = NULL;
>>   	cfg->excludes_file = NULL;
>>   	cfg->editor_program = NULL;
>> +	cfg->pager_program = NULL;
>>   	cfg->apply_sparse_checkout = 0;
>>   	cfg->branch_track = BRANCH_TRACK_REMOTE;
>>   	cfg->trust_ctime = 1;
>> @@ -742,4 +743,5 @@ void repo_config_values_clear(struct repo_config_values *cfg)
>>   	FREE_AND_NULL(cfg->attributes_file);
>>   	FREE_AND_NULL(cfg->excludes_file);
>>   	FREE_AND_NULL(cfg->editor_program);
>> +	FREE_AND_NULL(cfg->pager_program);
>>   }
>> diff --git a/environment.h b/environment.h
>> index 8178ebab76..39b6691b47 100644
>> --- a/environment.h
>> +++ b/environment.h
>> @@ -92,6 +92,7 @@ struct repo_config_values {
>>   	char *attributes_file;
>>   	char *excludes_file;
>>   	char *editor_program;
>> +	char *pager_program;
>>   	int apply_sparse_checkout;
>>   	int trust_ctime;
>>   	int check_stat;
>> diff --git a/pager.c b/pager.c
>> index 35b210e048..bc55546670 100644
>> --- a/pager.c
>> +++ b/pager.c
>> @@ -5,6 +5,8 @@
>>   #include "run-command.h"
>>   #include "sigchain.h"
>>   #include "alias.h"
>> +#include "repository.h"
>> +#include "environment.h"
>>
>>   int pager_use_color = 1;
>>
>> @@ -13,7 +15,6 @@ int pager_use_color = 1;
>>   #endif
>>
>>   static struct child_process pager_process;
>> -static char *pager_program;
>>   static int old_fd1 = -1, old_fd2 = -1;
>>
>>   /* Is the value coming back from term_columns() just a guess? */
>> @@ -75,10 +76,15 @@ static void wait_for_pager_signal(int signo)
>>
>>   static int core_pager_config(const char *var, const char *value,
>>   			     const struct config_context *ctx UNUSED,
>> -			     void *data UNUSED)
>> +			     void *data)
> 
> Could this change behaviour that a caller expects?
> 
> (looking at the hunk below) we are now using repo_config_values() which
> contains the condition 'repo != the_repository'. This means that if there
> is a caller that sends anything but the_repository, it will BUG() out.
> 
> Before this patch it would have worked, it worked because callers were
> sending the correct repository. Now we enforce it.
> 
> If we check the callers we can see that everyone sends the_repository,
> so this new assert is fine and prevents sending submodules by mistake.
> 
> Makes sense.
> 

;)


> I think it's worth mentioning that on the commit body/function.
> 

Okay, will add a line to briefly explain this. Something like what Junio 
said:

	All current callers of git_pager() and
	check_pager_config() indeed pass 'the_repository', so this new
	enforcement does not harm them.

>>   {
>> -	if (!strcmp(var, "core.pager"))
>> -		return git_config_string(&pager_program, var, value);
>> +	struct repository *r = data;
>> +
>> +	if (!strcmp(var, "core.pager")) {
>> +		FREE_AND_NULL(repo_config_values(r)->pager_program);
>> +		return git_config_string(&repo_config_values(r)->pager_program, var, value);
>> +	}
> 
> Ok. Now that pager_program is not file-scoped we drop the UNUSED and
> pager_program now lives in the per-repo field.
> Then we change the address where ->pager_program (which we access through
> repo_config_values()) points to.
> 
> FREE_AND_NULL() is new, before this patch it must have been leaking,
> good job.
> 
> Similar to previous patches, let's change the pattern to only call
> repo_config_values() once and use the pointer it returns.
> 
>> +
>>   	return 0;
>>   }
>>
>> @@ -91,10 +97,10 @@ const char *git_pager(struct repository *r, int stdout_is_tty)
>>
>>   	pager = getenv("GIT_PAGER");
>>   	if (!pager) {
>> -		if (!pager_program)
>> +		if (!repo_config_values(r)->pager_program)
>>   			read_early_config(r,
>> -					  core_pager_config, NULL);
>> -		pager = pager_program;
>> +					  core_pager_config, r);
>> +		pager = repo_config_values(r)->pager_program;
> 
> Same as above, let's call repo_config_values() once.
> 
>>   	}
>>   	if (!pager)
>>   		pager = getenv("PAGER");
>> @@ -302,7 +308,9 @@ int check_pager_config(struct repository *r, const char *cmd)
>>
>>   	read_early_config(r, pager_command_config, &data);
>>
>> -	if (data.value)
>> -		pager_program = data.value;
>> +	if (data.value) {
>> +		free(repo_config_values(r)->pager_program);
>> +		repo_config_values(r)->pager_program = data.value;
> 
> Same pattern. This also frees, but the log says "a" memory leak is fixed
> in this patch, should we change it to two?

Nice catch.

> 
>> +	}
>>   	return data.want;
>>   }
> 
> I peeked at later patches of this series and the multiple calls of
> repo_config_values() pattern keeps appearing.
> I haven't finished reviewing 5-9. If you reroll before I get to those
> patches, it may be worth fixing this pattern across the whole series.
> 
> Regards,
> Pablo

For those cases where multiple calls to repo_config_values() appear in a 
single function body, I will fix such pattern by using cfg.

Thanks, yuchen

  reply	other threads:[~2026-07-12 16:55 UTC|newest]

Thread overview: 114+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-26  7:50 [PATCH v2 0/2] environment: move excludes_file into repo_config_values Tian Yuchen
2026-06-26  7:50 ` [PATCH v2 1/2] dir: encapsulate excludes_file lazy-load Tian Yuchen
2026-06-26 21:14   ` SZEDER Gábor
2026-06-26 21:45     ` Junio C Hamano
2026-06-27 14:13       ` Tian Yuchen
2026-06-26  7:50 ` [PATCH v2 2/2] environment: move excludes_file into repo_config_values Tian Yuchen
2026-06-26 15:43   ` Junio C Hamano
2026-06-26 19:12   ` Junio C Hamano
2026-06-27 14:10     ` Tian Yuchen
2026-06-26 15:42 ` [PATCH v2 0/2] " Junio C Hamano
2026-06-27 13:56   ` Tian Yuchen
2026-06-27 16:08 ` [PATCH v4 0/1] " Tian Yuchen
2026-06-27 16:08   ` [PATCH v4 1/1] " Tian Yuchen
2026-06-27 16:10     ` Tian Yuchen
2026-06-27 20:47       ` Junio C Hamano
2026-06-28  3:19         ` Tian Yuchen
2026-06-28  3:38           ` Tian Yuchen
2026-06-28  8:40           ` Junio C Hamano
2026-06-28 12:58             ` Tian Yuchen
2026-06-29  6:03               ` Christian Couder
2026-06-29 14:47                 ` Junio C Hamano
2026-06-30 16:20                   ` Tian Yuchen
2026-07-01 18:14                     ` Tian Yuchen
2026-06-30 16:44   ` [PATCH v5 0/1] " Tian Yuchen
2026-06-30 16:44     ` [PATCH v5 1/1] " Tian Yuchen
2026-07-01 18:08     ` [PATCH v6 0/1] " Tian Yuchen
2026-07-01 18:08       ` [PATCH v6 1/1] " Tian Yuchen
2026-07-06 14:25       ` [PATCH v7 0/9] migrate more variables " Tian Yuchen
2026-07-06 14:25         ` [PATCH v7 1/9] repository: introduce repo_config_values_clear() Tian Yuchen
2026-07-06 14:25         ` [PATCH v7 2/9] environment: move excludes_file into repo_config_values Tian Yuchen
2026-07-06 14:25         ` [PATCH v7 3/9] environment: move editor_program " Tian Yuchen
2026-07-11 19:05           ` Pablo Sabater
2026-07-11 19:38             ` Pablo Sabater
2026-07-06 14:25         ` [PATCH v7 4/9] environment: move pager_program " Tian Yuchen
2026-07-06 17:38           ` Junio C Hamano
2026-07-06 14:25         ` [PATCH v7 5/9] environment: move askpass_program " Tian Yuchen
2026-07-06 14:25         ` [PATCH v7 6/9] environment: migrate apply_default_whitespace and apply_default_ignorewhitespace Tian Yuchen
2026-07-06 14:25         ` [PATCH v7 7/9] environment: move push_default into repo_config_values Tian Yuchen
2026-07-06 14:25         ` [PATCH v7 8/9] environment: move autorebase " Tian Yuchen
2026-07-06 14:25         ` [PATCH v7 9/9] environment: move object_creation_mode " Tian Yuchen
2026-07-08 16:02         ` [PATCH v8 0/9] migrate more variables " Tian Yuchen
2026-07-08 16:02           ` [PATCH v8 1/9] repository: introduce repo_config_values_clear() Tian Yuchen
2026-07-08 16:02           ` [PATCH v8 2/9] environment: move excludes_file into repo_config_values Tian Yuchen
2026-07-08 16:02           ` [PATCH v8 3/9] environment: move editor_program " Tian Yuchen
2026-07-08 16:02           ` [PATCH v8 4/9] environment: move pager_program " Tian Yuchen
2026-07-09  3:53             ` Junio C Hamano
2026-07-09 16:12               ` Tian Yuchen
2026-07-09 16:41                 ` Junio C Hamano
2026-07-08 16:02           ` [PATCH v8 5/9] environment: move askpass_program " Tian Yuchen
2026-07-08 16:02           ` [PATCH v8 6/9] environment: migrate apply_default_whitespace and apply_default_ignorewhitespace Tian Yuchen
2026-07-08 16:02           ` [PATCH v8 7/9] environment: move push_default into repo_config_values Tian Yuchen
2026-07-08 16:02           ` [PATCH v8 8/9] environment: move autorebase " Tian Yuchen
2026-07-08 16:03           ` [PATCH v8 9/9] environment: move object_creation_mode " Tian Yuchen
2026-07-09 16:11           ` [PATCH v9 0/9] migrate more variables " Tian Yuchen
2026-07-09 16:11             ` [PATCH v9 1/9] repository: introduce repo_config_values_clear() Tian Yuchen
2026-07-11 17:21               ` Pablo Sabater
2026-07-11 18:35                 ` Tian Yuchen
2026-07-12  9:28                   ` Pablo Sabater
2026-07-12 10:44                     ` Tian Yuchen
2026-07-09 16:11             ` [PATCH v9 2/9] environment: move excludes_file into repo_config_values Tian Yuchen
2026-07-11 18:21               ` Pablo Sabater
2026-07-12 10:08                 ` Tian Yuchen
2026-07-09 16:11             ` [PATCH v9 3/9] environment: move editor_program " Tian Yuchen
2026-07-11 19:30               ` Pablo Sabater
2026-07-09 16:11             ` [PATCH v9 4/9] environment: move pager_program " Tian Yuchen
2026-07-09 16:11             ` [PATCH v9 5/9] environment: move askpass_program " Tian Yuchen
2026-07-09 16:11             ` [PATCH v9 6/9] environment: migrate apply_default_whitespace and apply_default_ignorewhitespace Tian Yuchen
2026-07-09 16:11             ` [PATCH v9 7/9] environment: move push_default into repo_config_values Tian Yuchen
2026-07-09 16:11             ` [PATCH v9 8/9] environment: move autorebase " Tian Yuchen
2026-07-09 16:11             ` [PATCH v9 9/9] environment: move object_creation_mode " Tian Yuchen
2026-07-11 15:24             ` [PATCH v9 0/9] migrate more variables " Pablo Sabater
2026-07-11 16:11               ` Tian Yuchen
2026-07-11 21:10                 ` Junio C Hamano
2026-07-11 21:06               ` Junio C Hamano
2026-07-12  9:34                 ` Pablo Sabater
2026-07-12 11:17             ` [PATCH v10 " Tian Yuchen
2026-07-12 11:17               ` [PATCH v10 1/9] repository: introduce repo_config_values_clear() Tian Yuchen
2026-07-12 11:17               ` [PATCH v10 2/9] environment: move excludes_file into repo_config_values Tian Yuchen
2026-07-12 11:17               ` [PATCH v10 3/9] environment: move editor_program " Tian Yuchen
2026-07-12 11:17               ` [PATCH v10 4/9] environment: move pager_program " Tian Yuchen
2026-07-12 14:12                 ` Pablo Sabater
2026-07-12 16:54                   ` Tian Yuchen [this message]
2026-07-12 15:36                 ` Junio C Hamano
2026-07-12 16:58                   ` Tian Yuchen
2026-07-12 11:17               ` [PATCH v10 5/9] environment: move askpass_program " Tian Yuchen
2026-07-12 14:31                 ` Pablo Sabater
2026-07-12 15:47                 ` Junio C Hamano
2026-07-12 11:17               ` [PATCH v10 6/9] environment: migrate apply_default_whitespace and apply_default_ignorewhitespace Tian Yuchen
2026-07-12 15:04                 ` Pablo Sabater
2026-07-12 11:17               ` [PATCH v10 7/9] environment: move push_default into repo_config_values Tian Yuchen
2026-07-12 15:49                 ` Pablo Sabater
2026-07-12 11:17               ` [PATCH v10 8/9] environment: move autorebase " Tian Yuchen
2026-07-12 11:17               ` [PATCH v10 9/9] environment: move object_creation_mode " Tian Yuchen
2026-07-13  3:57               ` [PATCH v11 00/10] migrate more variables " Tian Yuchen
2026-07-13  3:57                 ` [PATCH v11 01/10] repository: introduce repo_config_values_clear() Tian Yuchen
2026-07-13  3:57                 ` [PATCH v11 02/10] environment: move excludes_file into repo_config_values Tian Yuchen
2026-07-13  3:57                 ` [PATCH v11 03/10] environment: move editor_program " Tian Yuchen
2026-07-13  3:57                 ` [PATCH v11 04/10] environment: move pager_program " Tian Yuchen
2026-07-13  3:57                 ` [PATCH v11 05/10] environment: move askpass_program " Tian Yuchen
2026-07-13  3:57                 ` [PATCH v11 06/10] environment: migrate apply_default_whitespace and apply_default_ignorewhitespace Tian Yuchen
2026-07-13 16:39                   ` Junio C Hamano
2026-07-14  3:19                     ` Tian Yuchen
2026-07-14 16:24                       ` Junio C Hamano
2026-07-14  3:25               ` [PATCH v12 00/10] migrate more variables into repo_config_values Tian Yuchen
2026-07-14  3:25                 ` [PATCH v12 01/10] repository: introduce repo_config_values_clear() Tian Yuchen
2026-07-14  3:25                 ` [PATCH v12 02/10] environment: move excludes_file into repo_config_values Tian Yuchen
2026-07-14  3:25                 ` [PATCH v12 03/10] environment: move editor_program " Tian Yuchen
2026-07-14  3:25                 ` [PATCH v12 04/10] environment: move pager_program " Tian Yuchen
2026-07-14  3:25                 ` [PATCH v12 05/10] environment: move askpass_program " Tian Yuchen
2026-07-14  3:25                 ` [PATCH v12 06/10] environment: migrate apply_default_whitespace and apply_default_ignorewhitespace Tian Yuchen
2026-07-14  3:25                 ` [PATCH v12 07/10] environment: move push_default into repo_config_values Tian Yuchen
2026-07-14  3:25                 ` [PATCH v12 08/10] environment: move autorebase " Tian Yuchen
2026-07-14  3:25                 ` [PATCH v12 09/10] environment: move object_creation_mode " Tian Yuchen
2026-07-14  3:25                 ` [PATCH v12 10/10] repository: adjust the comment of config_values_private_ Tian Yuchen

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=79e2b5b4-fc9e-4ca6-a4ff-dff93a3c64bc@malon.dev \
    --to=cat@malon.dev \
    --cc=ayu.chandekar@gmail.com \
    --cc=belkid98@gmail.com \
    --cc=christian.couder@gmail.com \
    --cc=cirnovskyv@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=pabloosabaterr@gmail.com \
    --cc=szeder.dev@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