X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=pager.c;h=92c03f654abd0333bd0dd48b4aebf9ae42ac4de5;hb=b706fcfe93262e485976ed2bc648b779cc47981f;hp=f19ddbc87df04f117cd5e39189c8322fd5f29d68;hpb=f054a419419337142ffe40433aa3984ccc000624;p=git.git diff --git a/pager.c b/pager.c index f19ddbc87..92c03f654 100644 --- a/pager.c +++ b/pager.c @@ -1,5 +1,10 @@ #include "cache.h" #include "run-command.h" +#include "sigchain.h" + +#ifndef DEFAULT_PAGER +#define DEFAULT_PAGER "less" +#endif /* * This is split up from the rest of git so that we can do @@ -8,7 +13,7 @@ static int spawned_pager; -#ifndef __MINGW32__ +#ifndef WIN32 static void pager_preexec(void) { /* @@ -20,8 +25,6 @@ static void pager_preexec(void) FD_ZERO(&in); FD_SET(0, &in); select(1, &in, NULL, &in, NULL); - - setenv("LESS", "FRSX", 0); } #endif @@ -38,12 +41,21 @@ static void wait_for_pager(void) finish_command(&pager_process); } -void setup_pager(void) +static void wait_for_pager_signal(int signo) { - const char *pager = getenv("GIT_PAGER"); + wait_for_pager(); + sigchain_pop(signo); + raise(signo); +} + +const char *git_pager(void) +{ + const char *pager; if (!isatty(1)) - return; + return NULL; + + pager = getenv("GIT_PAGER"); if (!pager) { if (!pager_program) git_config(git_default_config, NULL); @@ -52,8 +64,18 @@ void setup_pager(void) if (!pager) pager = getenv("PAGER"); if (!pager) - pager = "less"; + pager = DEFAULT_PAGER; else if (!*pager || !strcmp(pager, "cat")) + pager = NULL; + + return pager; +} + +void setup_pager(void) +{ + const char *pager = git_pager(); + + if (!pager) return; spawned_pager = 1; /* means we are emitting to terminal */ @@ -62,7 +84,11 @@ void setup_pager(void) pager_argv[2] = pager; pager_process.argv = pager_argv; pager_process.in = -1; -#ifndef __MINGW32__ + if (!getenv("LESS")) { + static const char *env[] = { "LESS=FRSX", NULL }; + pager_process.env = env; + } +#ifndef WIN32 pager_process.preexec_cb = pager_preexec; #endif if (start_command(&pager_process)) @@ -75,6 +101,7 @@ void setup_pager(void) close(pager_process.in); /* this makes sure that the parent terminates after the pager */ + sigchain_push_common(wait_for_pager_signal); atexit(wait_for_pager); }