summaryrefslogtreecommitdiff
path: root/t/t1300-config.sh
diff options
context:
space:
mode:
authorLibravatar Patrick Steinhardt <ps@pks.im>2021-01-12 13:26:45 +0100
committerLibravatar Junio C Hamano <gitster@pobox.com>2021-01-12 12:03:18 -0800
commitce81b1da230cf04e231ce337c2946c0671ffb303 (patch)
tree1da56ff0ae9cd73277adc220bad64122482fc69c /t/t1300-config.sh
parentgit: add `--super-prefix` to usage string (diff)
downloadtgif-ce81b1da230cf04e231ce337c2946c0671ffb303.tar.xz
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 't/t1300-config.sh')
-rwxr-xr-xt/t1300-config.sh48
1 files changed, 48 insertions, 0 deletions
diff --git a/t/t1300-config.sh b/t/t1300-config.sh
index 825d9a184f..ba46d9559d 100755
--- a/t/t1300-config.sh
+++ b/t/t1300-config.sh
@@ -1316,6 +1316,54 @@ test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' '
git config --get-regexp "env.*"
'
+test_expect_success 'git --config-env=key=envvar support' '
+ cat >expect <<-\EOF &&
+ value
+ value
+ false
+ EOF
+ {
+ ENVVAR=value git --config-env=core.name=ENVVAR config core.name &&
+ ENVVAR=value git --config-env=foo.CamelCase=ENVVAR config foo.camelcase &&
+ ENVVAR= git --config-env=foo.flag=ENVVAR config --bool foo.flag
+ } >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'git --config-env fails with invalid parameters' '
+ test_must_fail git --config-env=foo.flag config --bool foo.flag 2>error &&
+ test_i18ngrep "invalid config format: foo.flag" error &&
+ test_must_fail git --config-env=foo.flag= config --bool foo.flag 2>error &&
+ test_i18ngrep "missing environment variable name for configuration ${SQ}foo.flag${SQ}" error &&
+ sane_unset NONEXISTENT &&
+ test_must_fail git --config-env=foo.flag=NONEXISTENT config --bool foo.flag 2>error &&
+ test_i18ngrep "missing environment variable ${SQ}NONEXISTENT${SQ} for configuration ${SQ}foo.flag${SQ}" error
+'
+
+test_expect_success 'git -c and --config-env work together' '
+ cat >expect <<-\EOF &&
+ bar.cmd cmd-value
+ bar.env env-value
+ EOF
+ ENVVAR=env-value git \
+ -c bar.cmd=cmd-value \
+ --config-env=bar.env=ENVVAR \
+ config --get-regexp "^bar.*" >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'git -c and --config-env override each other' '
+ cat >expect <<-\EOF &&
+ env
+ cmd
+ EOF
+ {
+ ENVVAR=env git -c bar.bar=cmd --config-env=bar.bar=ENVVAR config bar.bar &&
+ ENVVAR=env git --config-env=bar.bar=ENVVAR -c bar.bar=cmd config bar.bar
+ } >actual &&
+ test_cmp expect actual
+'
+
test_expect_success 'git config --edit works' '
git config -f tmp test.value no &&
echo test.value=yes >expect &&