Skip to content

Commit

Permalink
Merge branch 'jk/pager-swap'
Browse files Browse the repository at this point in the history
* jk/pager-swap:
  spawn pager via run_command interface
  run-command: add pre-exec callback
  • Loading branch information
Junio C Hamano committed Aug 20, 2008
2 parents c8a4cbc + ea27a18 commit 0208c96
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 44 deletions.
55 changes: 11 additions & 44 deletions pager.c
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand All @@ -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);
Expand All @@ -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))
Expand All @@ -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;

Expand All @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions run-command.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
1 change: 1 addition & 0 deletions run-command.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
Expand Down

0 comments on commit 0208c96

Please sign in to comment.