X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=inline;f=pager.c;h=6b5c9e44b4ded338ddb344ae454d83a685b7569a;hb=6e1c23442a0315ad440bb8457703dcf1ad943b96;hp=fb7a1a625abf07b0d896a270286ee422a700c14c;hpb=9bbe6db85f368fc4f75cc9f6c4bfaf2269bf0068;p=git.git diff --git a/pager.c b/pager.c index fb7a1a625..6b5c9e44b 100644 --- a/pager.c +++ b/pager.c @@ -1,10 +1,13 @@ #include "cache.h" /* - * This is split up from the rest of git so that we might do - * something different on Windows, for example. + * This is split up from the rest of git so that we can do + * something different on Windows. */ +static int spawned_pager; + +#ifndef __MINGW32__ static void run_pager(const char *pager) { /* @@ -20,18 +23,38 @@ static void run_pager(const char *pager) execlp(pager, pager, NULL); execl("/bin/sh", "sh", "-c", pager, NULL); } +#else +#include "run-command.h" + +static const char *pager_argv[] = { "sh", "-c", NULL, NULL }; +static struct child_process pager_process = { + .argv = pager_argv, + .in = -1 +}; +static void wait_for_pager(void) +{ + fflush(stdout); + fflush(stderr); + /* signal EOF to pager */ + close(1); + close(2); + finish_command(&pager_process); +} +#endif void setup_pager(void) { +#ifndef __MINGW32__ pid_t pid; int fd[2]; +#endif const char *pager = getenv("GIT_PAGER"); if (!isatty(1)) return; if (!pager) { if (!pager_program) - git_config(git_default_config); + git_config(git_default_config, NULL); pager = pager_program; } if (!pager) @@ -41,8 +64,9 @@ void setup_pager(void) else if (!*pager || !strcmp(pager, "cat")) return; - pager_in_use = 1; /* means we are emitting to terminal */ + spawned_pager = 1; /* means we are emitting to terminal */ +#ifndef __MINGW32__ if (pipe(fd) < 0) return; pid = fork(); @@ -55,6 +79,7 @@ void setup_pager(void) /* return in the child */ if (!pid) { dup2(fd[1], 1); + dup2(fd[1], 2); close(fd[0]); close(fd[1]); return; @@ -69,4 +94,29 @@ void setup_pager(void) run_pager(pager); die("unable to execute pager '%s'", pager); exit(255); +#else + /* spawn the pager */ + pager_argv[2] = pager; + if (start_command(&pager_process)) + return; + + /* original process continues, but writes to the pipe */ + dup2(pager_process.in, 1); + dup2(pager_process.in, 2); + close(pager_process.in); + + /* this makes sure that the parent terminates after the pager */ + atexit(wait_for_pager); +#endif +} + +int pager_in_use(void) +{ + const char *env; + + if (spawned_pager) + return 1; + + env = getenv("GIT_PAGER_IN_USE"); + return env ? git_config_bool("GIT_PAGER_IN_USE", env) : 0; }