start_command: do not clobber cmd->env on Windows code path
Previously, it would not be possible to call start_command twice for the same struct child_process that has env set. The fix is achieved by moving the loop that modifies the environment block into a helper function. This also allows us to make two other helper functions static. Signed-off-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
434a6db7dc
commit
2affea4125
@ -824,7 +824,7 @@ void mingw_execvp(const char *cmd, char *const *argv)
|
|||||||
free_path_split(path);
|
free_path_split(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
char **copy_environ()
|
static char **copy_environ(void)
|
||||||
{
|
{
|
||||||
char **env;
|
char **env;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -861,7 +861,7 @@ static int lookup_env(char **env, const char *name, size_t nmln)
|
|||||||
/*
|
/*
|
||||||
* If name contains '=', then sets the variable, otherwise it unsets it
|
* If name contains '=', then sets the variable, otherwise it unsets it
|
||||||
*/
|
*/
|
||||||
char **env_setenv(char **env, const char *name)
|
static char **env_setenv(char **env, const char *name)
|
||||||
{
|
{
|
||||||
char *eq = strchrnul(name, '=');
|
char *eq = strchrnul(name, '=');
|
||||||
int i = lookup_env(env, name, eq-name);
|
int i = lookup_env(env, name, eq-name);
|
||||||
@ -886,6 +886,18 @@ char **env_setenv(char **env, const char *name)
|
|||||||
return env;
|
return env;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copies global environ and adjusts variables as specified by vars.
|
||||||
|
*/
|
||||||
|
char **make_augmented_environ(const char *const *vars)
|
||||||
|
{
|
||||||
|
char **env = copy_environ();
|
||||||
|
|
||||||
|
while (*vars)
|
||||||
|
env = env_setenv(env, *vars++);
|
||||||
|
return env;
|
||||||
|
}
|
||||||
|
|
||||||
/* this is the first function to call into WS_32; initialize it */
|
/* this is the first function to call into WS_32; initialize it */
|
||||||
#undef gethostbyname
|
#undef gethostbyname
|
||||||
struct hostent *mingw_gethostbyname(const char *host)
|
struct hostent *mingw_gethostbyname(const char *host)
|
||||||
|
|||||||
@ -222,9 +222,8 @@ void mingw_open_html(const char *path);
|
|||||||
* helpers
|
* helpers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char **copy_environ(void);
|
char **make_augmented_environ(const char *const *vars);
|
||||||
void free_environ(char **env);
|
void free_environ(char **env);
|
||||||
char **env_setenv(char **env, const char *name);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A replacement of main() that ensures that argv[0] has a path
|
* A replacement of main() that ensures that argv[0] has a path
|
||||||
|
|||||||
@ -173,11 +173,8 @@ fail_pipe:
|
|||||||
|
|
||||||
if (cmd->dir)
|
if (cmd->dir)
|
||||||
die("chdir in start_command() not implemented");
|
die("chdir in start_command() not implemented");
|
||||||
if (cmd->env) {
|
if (cmd->env)
|
||||||
env = copy_environ();
|
env = make_augmented_environ(cmd->env);
|
||||||
for (; *cmd->env; cmd->env++)
|
|
||||||
env = env_setenv(env, *cmd->env);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd->git_cmd) {
|
if (cmd->git_cmd) {
|
||||||
cmd->argv = prepare_git_cmd(cmd->argv);
|
cmd->argv = prepare_git_cmd(cmd->argv);
|
||||||
|
|||||||
Reference in New Issue
Block a user