Re: [PATCH v2 0/2] config: allow specifying config entries via envvar pairs
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Nov 25, 2020, 20:28 UTC
- Message-ID
- <xmqqv9dtdvui.fsf@gitster.c.googlers.com>
- In-Reply-To
- <X740yqoYIhrqsNRE@coredump.intra.peff.net>
Jeff King <peff@peff.net> writes:
> I do still think that a "--config-env" option solves your problem in a > much simpler way (especially in terms of interface we expose to users > that we'll be locked into forever).
As a mechanism to allow a custom configuration for a single invocation of a command, I tend to agree. For a mechansim to affect multiple commands in a sequence (read: scripts), I am not so sure.
The simplicity of the implementation we see below is also very attractive.
Show 61 quoted lines
> I sketched out the solution below if
> it's of interest (and I'd be happy to polish it up, or hand it off to
> you if so). But if you're unconvinced, I'll stop mentioning it.
>
> diff --git a/config.c b/config.c
> index 8f324ed3a6..d8cf6a5d6b 100644
> --- a/config.c
> +++ b/config.c
> @@ -345,6 +345,27 @@ 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 = strchr(spec, '=');
> + if (!env_name)
> + return; /* die or warn? */
> + env_name++;
> +
> + env_value = getenv(env_name);
> + if (!env_value)
> + return; /* die or warn? */
> +
> + 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 == '-';
> diff --git a/config.h b/config.h
> index 91cdfbfb41..d05651c96c 100644
> --- a/config.h
> +++ b/config.h
> @@ -138,6 +138,7 @@ int git_config_from_mem(config_fn_t fn,
> int git_config_from_blob_oid(config_fn_t fn, const char *name,
> const struct object_id *oid, void *data);
> void git_config_push_parameter(const char *text);
> +void git_config_push_env(const char *spec);
> int git_config_from_parameters(config_fn_t fn, void *data);
> void read_early_config(config_fn_t cb, void *data);
> void read_very_early_config(config_fn_t cb, void *data);
> diff --git a/git.c b/git.c
> index 4b7bd77b80..342f2fb0c9 100644
> --- a/git.c
> +++ b/git.c
> @@ -254,6 +254,8 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
> git_config_push_parameter((*argv)[1]);
> (*argv)++;
> (*argc)--;
> + } else if (skip_prefix(cmd, "--config-env=", &cmd)) {
> + git_config_push_env(cmd);
> } else if (!strcmp(cmd, "--literal-pathspecs")) {
> setenv(GIT_LITERAL_PATHSPECS_ENVIRONMENT, "1", 1);
> if (envchanged)