Skip to content

Commit

Permalink
Windows: Make the pager work.
Browse files Browse the repository at this point in the history
Since we have neither fork() nor exec(), we have to spawn the pager and
feed it with the program's output.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
  • Loading branch information
Johannes Sixt committed Jun 26, 2008
1 parent 0b50b86 commit bfdd9ff
Showing 1 changed file with 38 additions and 2 deletions.
40 changes: 38 additions & 2 deletions pager.c
Original file line number Diff line number Diff line change
@@ -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)
{
/*
Expand All @@ -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))
Expand All @@ -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();
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit bfdd9ff

Please sign in to comment.