]> git.ipfire.org Git - thirdparty/git.git/commitdiff
environment: move pager_program into repo_config_values
authorTian Yuchen <cat@malon.dev>
Tue, 14 Jul 2026 03:25:19 +0000 (11:25 +0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 14 Jul 2026 14:30:23 +0000 (07:30 -0700)
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>
environment.c
environment.h
pager.c

index a65d575af4a80d0cc68fb2ad9a47309009f40726..975c9cb9ebdb8559273cbbfbe598147ad3bf7490 100644 (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);
 }
index 8178ebab76bba43df24a598c759fca9c175225ba..39b6691b478544877d3546746da29a8e89c6ace4 100644 (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;
diff --git a/pager.c b/pager.c
index 35b210e0484f90c3c2439b84c11aad2012e67747..543ef129366a19171d055d03915070d081de3603 100644 (file)
--- 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,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;
 }