|
|
|
@ -1,4 +1,5 @@
@@ -1,4 +1,5 @@
|
|
|
|
|
#include "cache.h" |
|
|
|
|
#include "run-command.h" |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* This is split up from the rest of git so that we can do |
|
|
|
@ -8,7 +9,7 @@
@@ -8,7 +9,7 @@
|
|
|
|
|
static int spawned_pager; |
|
|
|
|
|
|
|
|
|
#ifndef __MINGW32__ |
|
|
|
|
static void run_pager(const char *pager) |
|
|
|
|
static void pager_preexec(void) |
|
|
|
|
{ |
|
|
|
|
/* |
|
|
|
|
* Work around bug in "less" by not starting it until we |
|
|
|
@ -20,17 +21,13 @@ static void run_pager(const char *pager)
@@ -20,17 +21,13 @@ static void run_pager(const char *pager)
|
|
|
|
|
FD_SET(0, &in); |
|
|
|
|
select(1, &in, NULL, &in, NULL); |
|
|
|
|
|
|
|
|
|
execlp(pager, pager, NULL); |
|
|
|
|
execl("/bin/sh", "sh", "-c", pager, NULL); |
|
|
|
|
setenv("LESS", "FRSX", 0); |
|
|
|
|
} |
|
|
|
|
#else |
|
|
|
|
#include "run-command.h" |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
static const char *pager_argv[] = { "sh", "-c", NULL, NULL }; |
|
|
|
|
static struct child_process pager_process = { |
|
|
|
|
.argv = pager_argv, |
|
|
|
|
.in = -1 |
|
|
|
|
}; |
|
|
|
|
static struct child_process pager_process; |
|
|
|
|
|
|
|
|
|
static void wait_for_pager(void) |
|
|
|
|
{ |
|
|
|
|
fflush(stdout); |
|
|
|
@ -40,14 +37,9 @@ static void wait_for_pager(void)
@@ -40,14 +37,9 @@ static void wait_for_pager(void)
|
|
|
|
|
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)) |
|
|
|
@ -66,37 +58,13 @@ void setup_pager(void)
@@ -66,37 +58,13 @@ void setup_pager(void)
|
|
|
|
|
|
|
|
|
|
spawned_pager = 1; /* means we are emitting to terminal */ |
|
|
|
|
|
|
|
|
|
#ifndef __MINGW32__ |
|
|
|
|
if (pipe(fd) < 0) |
|
|
|
|
return; |
|
|
|
|
pid = fork(); |
|
|
|
|
if (pid < 0) { |
|
|
|
|
close(fd[0]); |
|
|
|
|
close(fd[1]); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* return in the child */ |
|
|
|
|
if (!pid) { |
|
|
|
|
dup2(fd[1], 1); |
|
|
|
|
dup2(fd[1], 2); |
|
|
|
|
close(fd[0]); |
|
|
|
|
close(fd[1]); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* The original process turns into the PAGER */ |
|
|
|
|
dup2(fd[0], 0); |
|
|
|
|
close(fd[0]); |
|
|
|
|
close(fd[1]); |
|
|
|
|
|
|
|
|
|
setenv("LESS", "FRSX", 0); |
|
|
|
|
run_pager(pager); |
|
|
|
|
die("unable to execute pager '%s'", pager); |
|
|
|
|
exit(255); |
|
|
|
|
#else |
|
|
|
|
/* spawn the pager */ |
|
|
|
|
pager_argv[2] = pager; |
|
|
|
|
pager_process.argv = pager_argv; |
|
|
|
|
pager_process.in = -1; |
|
|
|
|
#ifndef __MINGW32__ |
|
|
|
|
pager_process.preexec_cb = pager_preexec; |
|
|
|
|
#endif |
|
|
|
|
if (start_command(&pager_process)) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
@ -107,7 +75,6 @@ void setup_pager(void)
@@ -107,7 +75,6 @@ void setup_pager(void)
|
|
|
|
|
|
|
|
|
|
/* this makes sure that the parent terminates after the pager */ |
|
|
|
|
atexit(wait_for_pager); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int pager_in_use(void) |
|
|
|
|