Jeff King <peff@xxxxxxxx> 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. > 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)