diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-07-02 21:57:52 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-07-02 21:57:52 -0700 |
commit | bb1ab2db08f48add4236a5a9c08aa1a6aa4d5d48 (patch) | |
tree | e9e85601f78f7cfaf47785db9fd65f426e79fadb /pager.c | |
parent | 7d3580d74c6d801419dd91416f9a81750b7d4e2c (diff) | |
parent | 14086b0a13f5f5ac456cb9ae16a263f92908ae61 (diff) | |
download | git-bb1ab2db08f48add4236a5a9c08aa1a6aa4d5d48.tar.gz |
Merge branch 'j6t/mingw'
* j6t/mingw: (38 commits)
compat/pread.c: Add a forward declaration to fix a warning
Windows: Fix ntohl() related warnings about printf formatting
Windows: TMP and TEMP environment variables specify a temporary directory.
Windows: Make 'git help -a' work.
Windows: Work around an oddity when a pipe with no reader is written to.
Windows: Make the pager work.
When installing, be prepared that template_dir may be relative.
Windows: Use a relative default template_dir and ETC_GITCONFIG
Windows: Compute the fallback for exec_path from the program invocation.
Turn builtin_exec_path into a function.
Windows: Use a customized struct stat that also has the st_blocks member.
Windows: Add a custom implementation for utime().
Windows: Add a new lstat and fstat implementation based on Win32 API.
Windows: Implement a custom spawnve().
Windows: Implement wrappers for gethostbyname(), socket(), and connect().
Windows: Work around incompatible sort and find.
Windows: Implement asynchronous functions as threads.
Windows: Disambiguate DOS style paths from SSH URLs.
Windows: A rudimentary poll() emulation.
Windows: Implement start_command().
...
Diffstat (limited to 'pager.c')
-rw-r--r-- | pager.c | 40 |
1 files changed, 38 insertions, 2 deletions
@@ -1,12 +1,13 @@ #include "cache.h" /* - * This is split up from the rest of git so that we might do - * something different on Windows, for example. + * This is split up from the rest of git so that we can do + * something different on Windows. */ static int spawned_pager; +#ifndef __MINGW32__ static void run_pager(const char *pager) { /* @@ -22,11 +23,31 @@ static void run_pager(const char *pager) execlp(pager, pager, NULL); execl("/bin/sh", "sh", "-c", pager, NULL); } +#else +#include "run-command.h" + +static const char *pager_argv[] = { "sh", "-c", NULL, NULL }; +static struct child_process pager_process = { + .argv = pager_argv, + .in = -1 +}; +static void wait_for_pager(void) +{ + fflush(stdout); + fflush(stderr); + /* signal EOF to pager */ + close(1); + 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)) @@ -45,6 +66,7 @@ void setup_pager(void) spawned_pager = 1; /* means we are emitting to terminal */ +#ifndef __MINGW32__ if (pipe(fd) < 0) return; pid = fork(); @@ -72,6 +94,20 @@ void setup_pager(void) run_pager(pager); die("unable to execute pager '%s'", pager); exit(255); +#else + /* spawn the pager */ + pager_argv[2] = pager; + if (start_command(&pager_process)) + return; + + /* original process continues, but writes to the pipe */ + dup2(pager_process.in, 1); + dup2(pager_process.in, 2); + close(pager_process.in); + + /* this makes sure that the parent terminates after the pager */ + atexit(wait_for_pager); +#endif } int pager_in_use(void) |