From: Thomas Bachem <redacted>
"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 <redacted>
---
config.c | 20 +++++++++++++-------
config.h | 12 ++++++++++++
2 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/config.c b/config.c
index d9019e7e6c..e0bb29b53d 100644
--- a/config.c
+++ b/config.c
@@ -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);
}diff --git a/config.h b/config.h
index b66dd08007..b048f63571 100644
--- a/config.h
+++ b/config.h
@@ -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);
/*
--
gitgitgadget