1
0
mirror of https://github.com/git/git.git synced 2024-09-28 08:49:45 +02:00

Merge branch 'jk/pager-swap'

* jk/pager-swap:
  spawn pager via run_command interface
  run-command: add pre-exec callback
This commit is contained in:
Junio C Hamano 2008-08-19 21:42:55 -07:00
commit 0208c9611a
3 changed files with 14 additions and 44 deletions

55
pager.c
View File

@ -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 @@
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)
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)
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)
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)
/* this makes sure that the parent terminates after the pager */
atexit(wait_for_pager);
#endif
}
int pager_in_use(void)

View File

@ -111,6 +111,8 @@ int start_command(struct child_process *cmd)
unsetenv(*cmd->env);
}
}
if (cmd->preexec_cb)
cmd->preexec_cb();
if (cmd->git_cmd) {
execv_git_cmd(cmd->argv);
} else {

View File

@ -42,6 +42,7 @@ struct child_process {
unsigned no_stderr:1;
unsigned git_cmd:1; /* if this is to be git sub-command */
unsigned stdout_to_stderr:1;
void (*preexec_cb)(void);
};
int start_command(struct child_process *);