From: Junio C Hamano Date: Wed, 20 Aug 2008 04:42:55 +0000 (-0700) Subject: Merge branch 'jk/pager-swap' X-Git-Tag: v1.6.1-rc1~343 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/0208c9611ab4e82b09feba857c4f9bc8e02a6d9d?ds=sidebyside;hp=-c Merge branch 'jk/pager-swap' * jk/pager-swap: spawn pager via run_command interface run-command: add pre-exec callback --- 0208c9611ab4e82b09feba857c4f9bc8e02a6d9d diff --combined run-command.c index bbb9c777e5,73d0c31276..caab374577 --- a/run-command.c +++ b/run-command.c @@@ -68,7 -68,6 +68,7 @@@ int start_command(struct child_process trace_argv_printf(cmd->argv, "trace: run_command:"); #ifndef __MINGW32__ + fflush(NULL); cmd->pid = fork(); if (!cmd->pid) { if (cmd->no_stdin) @@@ -111,6 -110,8 +111,8 @@@ unsetenv(*cmd->env); } } + if (cmd->preexec_cb) + cmd->preexec_cb(); if (cmd->git_cmd) { execv_git_cmd(cmd->argv); } else { @@@ -120,8 -121,9 +122,8 @@@ } #else int s0 = -1, s1 = -1, s2 = -1; /* backups of stdin, stdout, stderr */ - const char *sargv0 = cmd->argv[0]; + const char **sargv = cmd->argv; char **env = environ; - struct strbuf git_cmd; if (cmd->no_stdin) { s0 = dup(0); @@@ -165,7 -167,9 +167,7 @@@ } if (cmd->git_cmd) { - strbuf_init(&git_cmd, 0); - strbuf_addf(&git_cmd, "git-%s", cmd->argv[0]); - cmd->argv[0] = git_cmd.buf; + cmd->argv = prepare_git_cmd(cmd->argv); } cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, env); @@@ -173,9 -177,9 +175,9 @@@ if (cmd->env) free_environ(env); if (cmd->git_cmd) - strbuf_release(&git_cmd); + free(cmd->argv); - cmd->argv[0] = sargv0; + cmd->argv = sargv; if (s0 >= 0) dup2(s0, 0), close(s0); if (s1 >= 0) @@@ -305,9 -309,6 +307,9 @@@ int start_async(struct async *async async->out = pipe_out[0]; #ifndef __MINGW32__ + /* Flush stdio before fork() to avoid cloning buffers */ + fflush(NULL); + async->pid = fork(); if (async->pid < 0) { error("fork (async) failed: %s", strerror(errno));