diff options
Diffstat (limited to 'pager.c')
| -rw-r--r-- | pager.c | 40 | 
1 files changed, 38 insertions, 2 deletions
@@ -1,12 +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)  {  	/* @@ -22,11 +23,31 @@ 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)) @@ -45,6 +66,7 @@ void setup_pager(void)  	spawned_pager = 1; /* means we are emitting to terminal */ +#ifndef __MINGW32__  	if (pipe(fd) < 0)  		return;  	pid = fork(); @@ -72,6 +94,20 @@ 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)  | 
