Subject: [PATCH v7 0/8] config: allow specifying config entries via envvar pairs

From: Patrick Steinhardt <[email-masked]>
Date: Mon, 11 Jan 2021 09:36:40 +0100

Hi,

this is the seventh version of my patch series which aims to implement a
way to pass config entries via the environment while avoiding any
requirements to perform shell quoting on the user's side.

The only change in this version is improved error handling for the
`--config-env` switch:

    - Error messages are now correctly marked for translation.

    - A separate error message is given if no value is passed to
      `--config-env`. Previously, we would've tried to look up the
      empty environment variable (`getenv("")`).

    - The error message when the environment variable is missing was
      improved.

Please see the attached ranged-diff for further details.

Patrick

Jeff King (2):
  quote: make sq_dequote_step() a public function
  config: parse more robust format in GIT_CONFIG_PARAMETERS

Patrick Steinhardt (6):
  git: add `--super-prefix` to usage string
  config: add new way to pass config via `--config-env`
  config: extract function to parse config pairs
  config: store "git -c" variables using more robust format
  environment: make `getenv_safe()` a public function
  config: allow specifying config entries via envvar pairs

 Documentation/git-config.txt |  16 +++
 Documentation/git.txt        |  24 +++-
 cache.h                      |   1 +
 config.c                     | 208 ++++++++++++++++++++++++++++----
 config.h                     |   1 +
 environment.c                |   8 +-
 environment.h                |  12 ++
 git.c                        |   3 +
 quote.c                      |  15 ++-
 quote.h                      |  18 ++-
 t/t1300-config.sh            | 222 ++++++++++++++++++++++++++++++++++-
 11 files changed, 489 insertions(+), 39 deletions(-)
 create mode 100644 environment.h

Range-diff against v6:
1:  cd3de0743a = 1:  55fa4d0d11 git: add `--super-prefix` to usage string
2:  9b8461010e ! 2:  b9cf47afe8 config: add new way to pass config via `--config-env`
    @@ config.c: void git_config_push_parameter(const char *text)
     +
     +	env_name = strrchr(spec, '=');
     +	if (!env_name)
    -+		die("invalid config format: %s", spec);
    ++		die(_("invalid config format: %s"), spec);
     +	env_name++;
    ++	if (!*env_name)
    ++		die(_("missing value for --config-env"));
     +
     +	env_value = getenv(env_name);
     +	if (!env_value)
    -+		die("config variable missing for '%s'", env_name);
    ++		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);
    @@ t/t1300-config.sh: test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' '
     +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" error &&
    ++	test_must_fail git --config-env=foo.flag= config --bool foo.flag 2>error &&
    ++	test_i18ngrep "missing value for --config-env" error &&
     +	test_must_fail git --config-env=foo.flag=NONEXISTENT config --bool foo.flag 2>error &&
    -+	test_i18ngrep "config variable missing" 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' '
3:  9d4c8d7be9 = 3:  1b47f0db98 quote: make sq_dequote_step() a public function
4:  0a9b085fe5 = 4:  b9565a050e config: extract function to parse config pairs
5:  b96686c9cd ! 5:  8f998ac81a config: store "git -c" variables using more robust format
    @@
      ## Metadata ##
    -Author: Jeff King <[email-masked]>
    +Author: Patrick Steinhardt <[email-masked]>
     
      ## Commit message ##
         config: store "git -c" variables using more robust format
    @@ config.c: void git_config_push_parameter(const char *text)
      
      	env_name = strrchr(spec, '=');
      	if (!env_name)
    - 		die("invalid config format: %s", spec);
    + 		die(_("invalid config format: %s"), spec);
     +	key = xmemdupz(spec, env_name - spec);
      	env_name++;
    - 
    - 	env_value = getenv(env_name);
    - 	if (!env_value)
    - 		die("config variable missing for '%s'", env_name);
    + 	if (!*env_name)
    + 		die(_("missing value for --config-env"));
    +@@ config.c: void git_config_push_env(const char *spec)
    + 		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);
6:  6597700ffb = 6:  e7b073c9dc config: parse more robust format in GIT_CONFIG_PARAMETERS
7:  cade8fb12f = 7:  6c1800a18f environment: make `getenv_safe()` a public function
8:  4e3f208d13 = 8:  ac9e778704 config: allow specifying config entries via envvar pairs
-- 
2.30.0