зеркало из https://github.com/microsoft/git.git
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:
Родитель
434a6db7dc
Коммит
2affea4125
|
@ -824,7 +824,7 @@ void mingw_execvp(const char *cmd, char *const *argv)
|
|||
free_path_split(path);
|
||||
}
|
||||
|
||||
char **copy_environ()
|
||||
static char **copy_environ(void)
|
||||
{
|
||||
char **env;
|
||||
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
|
||||
*/
|
||||
char **env_setenv(char **env, const char *name)
|
||||
static char **env_setenv(char **env, const char *name)
|
||||
{
|
||||
char *eq = strchrnul(name, '=');
|
||||
int i = lookup_env(env, name, eq-name);
|
||||
|
@ -886,6 +886,18 @@ char **env_setenv(char **env, const char *name)
|
|||
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 */
|
||||
#undef gethostbyname
|
||||
struct hostent *mingw_gethostbyname(const char *host)
|
||||
|
|
|
@ -222,9 +222,8 @@ void mingw_open_html(const char *path);
|
|||
* helpers
|
||||
*/
|
||||
|
||||
char **copy_environ(void);
|
||||
char **make_augmented_environ(const char *const *vars);
|
||||
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
|
||||
|
|
|
@ -173,11 +173,8 @@ fail_pipe:
|
|||
|
||||
if (cmd->dir)
|
||||
die("chdir in start_command() not implemented");
|
||||
if (cmd->env) {
|
||||
env = copy_environ();
|
||||
for (; *cmd->env; cmd->env++)
|
||||
env = env_setenv(env, *cmd->env);
|
||||
}
|
||||
if (cmd->env)
|
||||
env = make_augmented_environ(cmd->env);
|
||||
|
||||
if (cmd->git_cmd) {
|
||||
cmd->argv = prepare_git_cmd(cmd->argv);
|
||||
|
|
Загрузка…
Ссылка в новой задаче