]>
Commit | Line | Data |
---|---|---|
f67b45f8 LT |
1 | #include "cache.h" |
2 | ||
3 | /* | |
4 | * This is split up from the rest of git so that we might do | |
5 | * something different on Windows, for example. | |
6 | */ | |
7 | ||
402461aa | 8 | static void run_pager(const char *pager) |
f67b45f8 | 9 | { |
402461aa | 10 | execlp(pager, pager, NULL); |
34fd1c9a | 11 | execl("/bin/sh", "sh", "-c", pager, NULL); |
f67b45f8 LT |
12 | } |
13 | ||
14 | void setup_pager(void) | |
15 | { | |
16 | pid_t pid; | |
17 | int fd[2]; | |
402461aa | 18 | const char *pager = getenv("PAGER"); |
f67b45f8 LT |
19 | |
20 | if (!isatty(1)) | |
21 | return; | |
402461aa JS |
22 | if (!pager) |
23 | pager = "less"; | |
caef71a5 | 24 | else if (!*pager || !strcmp(pager, "cat")) |
402461aa JS |
25 | return; |
26 | ||
85fb65ed JH |
27 | pager_in_use = 1; /* means we are emitting to terminal */ |
28 | ||
f67b45f8 LT |
29 | if (pipe(fd) < 0) |
30 | return; | |
31 | pid = fork(); | |
32 | if (pid < 0) { | |
33 | close(fd[0]); | |
34 | close(fd[1]); | |
35 | return; | |
36 | } | |
37 | ||
38 | /* return in the child */ | |
39 | if (!pid) { | |
40 | dup2(fd[1], 1); | |
41 | close(fd[0]); | |
42 | close(fd[1]); | |
43 | return; | |
44 | } | |
45 | ||
46 | /* The original process turns into the PAGER */ | |
47 | dup2(fd[0], 0); | |
48 | close(fd[0]); | |
49 | close(fd[1]); | |
50 | ||
cd112cef | 51 | setenv("LESS", "-RS", 0); |
402461aa | 52 | run_pager(pager); |
34fd1c9a | 53 | die("unable to execute pager '%s'", pager); |
f67b45f8 LT |
54 | exit(255); |
55 | } |