Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2021-01-12 15:26:45 +0300
committerJunio C Hamano <gitster@pobox.com>2021-01-12 23:03:18 +0300
commitce81b1da230cf04e231ce337c2946c0671ffb303 (patch)
tree1da56ff0ae9cd73277adc220bad64122482fc69c /config.c
parentb0812b6ac0776b6e43e8483d5579ffd11d5c5f42 (diff)
config: add new way to pass config via `--config-env`
While it's already possible to pass runtime configuration via `git -c <key>=<value>`, it may be undesirable to use when the value contains sensitive information. E.g. if one wants to set `http.extraHeader` to contain an authentication token, doing so via `-c` would trivially leak those credentials via e.g. ps(1), which typically also shows command arguments. To enable this usecase without leaking credentials, this commit introduces a new switch `--config-env=<key>=<envvar>`. Instead of directly passing a value for the given key, it instead allows the user to specify the name of an environment variable. The value of that variable will then be used as value of the key. Co-authored-by: Jeff King <peff@peff.net> Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'config.c')
-rw-r--r--config.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/config.c b/config.c
index 8f324ed3a6..ed89c557bd 100644
--- a/config.c
+++ b/config.c
@@ -345,6 +345,31 @@ void git_config_push_parameter(const char *text)
strbuf_release(&env);
}
+void git_config_push_env(const char *spec)
+{
+ struct strbuf buf = STRBUF_INIT;
+ const char *env_name;
+ const char *env_value;
+
+ env_name = strrchr(spec, '=');
+ if (!env_name)
+ die(_("invalid config format: %s"), spec);
+ env_name++;
+ if (!*env_name)
+ die(_("missing environment variable name for configuration '%.*s'"),
+ (int)(env_name - spec - 1), spec);
+
+ env_value = getenv(env_name);
+ if (!env_value)
+ die(_("missing environment variable '%s' for configuration '%.*s'"),
+ env_name, (int)(env_name - spec - 1), spec);
+
+ strbuf_add(&buf, spec, env_name - spec);
+ strbuf_addstr(&buf, env_value);
+ git_config_push_parameter(buf.buf);
+ strbuf_release(&buf);
+}
+
static inline int iskeychar(int c)
{
return isalnum(c) || c == '-';