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
next prev parent 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