environment: move askpass_program into repo_config_values

The global variable 'askpass_program' stores the path to the program
used to prompt the user for credentials. Move it into repo_config_values
to continue the libification effort.

While it is uncommon for a single process to require different askpass
programs for different repositories, maintaining this value as a mutable
global string is a blocker for libification. Global heap-allocated
strings introduce thread-safety issues in a multi-repo environment.

Move 'askpass_program' into 'struct repo_config_values' to eliminate
this global state. The memory is now safely managed and freed via
'repo_config_values_clear()'.

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:20 +08:00 committed by Junio C Hamano
parent e57125d804
commit 48cbe40079
3 changed files with 7 additions and 6 deletions

View File

@ -55,7 +55,6 @@ int fsync_object_files = -1;
int use_fsync = -1;
enum fsync_method fsync_method = FSYNC_METHOD_DEFAULT;
enum fsync_component fsync_components = FSYNC_COMPONENTS_DEFAULT;
char *askpass_program;
enum auto_crlf auto_crlf = AUTO_CRLF_FALSE;
enum eol core_eol = EOL_UNSET;
int global_conv_flags_eol = CONV_EOL_RNDTRP_WARN;
@ -464,8 +463,8 @@ int git_default_core_config(const char *var, const char *value,
}

if (!strcmp(var, "core.askpass")) {
FREE_AND_NULL(askpass_program);
return git_config_string(&askpass_program, var, value);
FREE_AND_NULL(cfg->askpass_program);
return git_config_string(&cfg->askpass_program, var, value);
}

if (!strcmp(var, "core.excludesfile")) {
@ -726,6 +725,7 @@ void repo_config_values_init(struct repo_config_values *cfg)
cfg->excludes_file = NULL;
cfg->editor_program = NULL;
cfg->pager_program = NULL;
cfg->askpass_program = NULL;
cfg->apply_sparse_checkout = 0;
cfg->branch_track = BRANCH_TRACK_REMOTE;
cfg->trust_ctime = 1;
@ -744,4 +744,5 @@ void repo_config_values_clear(struct repo_config_values *cfg)
FREE_AND_NULL(cfg->excludes_file);
FREE_AND_NULL(cfg->editor_program);
FREE_AND_NULL(cfg->pager_program);
FREE_AND_NULL(cfg->askpass_program);
}

View File

@ -93,6 +93,7 @@ struct repo_config_values {
char *excludes_file;
char *editor_program;
char *pager_program;
char *askpass_program;
int apply_sparse_checkout;
int trust_ctime;
int check_stat;
@ -220,8 +221,6 @@ const char *get_commit_output_encoding(void);
extern char *git_commit_encoding;
extern char *git_log_output_encoding;

extern char *askpass_program;

/*
* The character that begins a commented line in user-editable file
* that is subject to stripspace.

View File

@ -3,6 +3,7 @@
#include "git-compat-util.h"
#include "parse.h"
#include "environment.h"
#include "repository.h"
#include "run-command.h"
#include "strbuf.h"
#include "prompt.h"
@ -51,7 +52,7 @@ char *git_prompt(const char *prompt, int flags)

askpass = getenv("GIT_ASKPASS");
if (!askpass)
askpass = askpass_program;
askpass = repo_config_values(the_repository)->askpass_program;
if (!askpass)
askpass = getenv("SSH_ASKPASS");
if (askpass && *askpass)