config: add git_config_append_parameter()

"git -c" passes its settings to the commands it spawns through
GIT_CONFIG_PARAMETERS, a list of quoted 'key'='value' pairs. The only
place that formats such an entry is git_config_push_split_parameter(),
which writes straight into our own environment.

Split the formatting out into git_config_append_parameter(), which
appends one entry to a strbuf, so that a caller can build the value
for a child's environment. The sequencer will use it in a later
commit.

Assisted-by: Claude Fable 5.1
Signed-off-by: Thomas Bachem <mail@thomasbachem.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
seen
Thomas Bachem 2026-09-17 18:42:12 +00:00 committed by Junio C Hamano
parent 3cb9185f65
commit 528bb4f019
2 changed files with 25 additions and 7 deletions

View File

@ -450,18 +450,24 @@ static int git_config_include(const char *var, const char *value,
return ret;
}

void git_config_append_parameter(struct strbuf *env, const char *key,
const char *value)
{
if (env->len)
strbuf_addch(env, ' ');
sq_quote_buf(env, key);
strbuf_addch(env, '=');
if (value)
sq_quote_buf(env, value);
}

static void git_config_push_split_parameter(const char *key, const char *value)
{
struct strbuf env = STRBUF_INIT;
const char *old = getenv(CONFIG_DATA_ENVIRONMENT);
if (old && *old) {
if (old && *old)
strbuf_addstr(&env, old);
strbuf_addch(&env, ' ');
}
sq_quote_buf(&env, key);
strbuf_addch(&env, '=');
if (value)
sq_quote_buf(&env, value);
git_config_append_parameter(&env, key, value);
setenv(CONFIG_DATA_ENVIRONMENT, env.buf, 1);
strbuf_release(&env);
}

View File

@ -22,6 +22,7 @@
*/

struct object_id;
struct strbuf;

/* git_config_parse_key() returns these negated: */
#define CONFIG_INVALID_KEY 1
@ -186,6 +187,17 @@ int git_config_from_blob_oid(config_fn_t fn, const char *name,
enum config_scope scope);
void git_config_push_parameter(const char *text);
void git_config_push_env(const char *spec);

/*
* Append a config option to the buffer that can be exported via the
* GIT_CONFIG_PARAMETERS environment variable, which allows us to
* propagate configuration across Git processes. The format of the
* variable is a space-separated list of quoted "'<key>'='<value>'"
* pairs. With a NULL `value`, only 'key'= is appended, which git reads
* back as a boolean true, like "-c key" on the command line.
*/
void git_config_append_parameter(struct strbuf *env, const char *key,
const char *value);
int git_config_from_parameters(config_fn_t fn, void *data);

/*