environment: move pager_program into repo_config_values

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()'. All current callers indeed pass
'the_repository', so this new enforcement does not harm them.

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 memory leaks 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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
next
Tian Yuchen 2026-07-14 11:25:19 +08:00 committed by Junio C Hamano
parent 469e95c257
commit e57125d804
3 changed files with 26 additions and 9 deletions

View File

@ -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);
}

View File

@ -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;

32
pager.c
View File

@ -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,17 @@ 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)
{
if (!strcmp(var, "core.pager"))
return git_config_string(&pager_program, var, value);
struct repository *r = data;

if (!strcmp(var, "core.pager")) {
struct repo_config_values *cfg = repo_config_values(r);

FREE_AND_NULL(cfg->pager_program);
return git_config_string(&cfg->pager_program, var, value);
}

return 0;
}

@ -91,10 +99,12 @@ const char *git_pager(struct repository *r, int stdout_is_tty)

pager = getenv("GIT_PAGER");
if (!pager) {
if (!pager_program)
struct repo_config_values *cfg = repo_config_values(r);

if (!cfg->pager_program)
read_early_config(r,
core_pager_config, NULL);
pager = pager_program;
core_pager_config, r);
pager = cfg->pager_program;
}
if (!pager)
pager = getenv("PAGER");
@ -302,7 +312,11 @@ 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) {
struct repo_config_values *cfg = repo_config_values(r);

free(cfg->pager_program);
cfg->pager_program = data.value;
}
return data.want;
}