[PATCH (topgit) 1/2] Implement setup_pager just like in git
- From
Kirill Smelkov <kirr@landau.phys.spbu.ru>
- Date
- Jan 6, 2009, 15:16 UTC
- Message-ID
- <acaae74f79d385014e726b97f8258b2a0caa3dd0.1231254832.git.kirr@landau.phys.spbu.ru>
- In-Reply-To
- <cover.1231254832.git.kirr@landau.phys.spbu.ru>
setup_pager() spawns a pager process and redirect the rest of our output to it.
This will be needed to fix `tg patch` output in the next commit.
Signed-off-by: Kirill Smelkov <kirr@landau.phys.spbu.ru> --- tg.sh | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 53 insertions(+), 0 deletions(-)
diff --git a/tg.sh b/tg.sh index 8c23d26..51a82af 100644 --- a/tg.sh +++ b/tg.sh @@ -243,6 +243,59 @@ do_help() fi } +## Pager stuff + +# isatty FD +isatty() +{ + tty -s 0<&$1 || return 1 + return 0 +} + +# setup_pager +# Spawn pager process and redirect the rest of our output to it +setup_pager() +{ + isatty 1 || return 0 + + # TG_PAGER = GIT_PAGER | PAGER + # http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2004-03/0792.html + case ${GIT_PAGER+XXX} in + '') + case ${PAGER+XXX} in + '') + # both GIT_PAGER & PAGER unset + TG_PAGER='' + ;; + *) + TG_PAGER="$PAGER" + ;; + esac + ;; + *) + TG_PAGER="$GIT_PAGER" + ;; + esac + + [ -z "$TG_PAGER" -o "$TG_PAGER" = "cat" ] && return 0 + + + # now spawn pager + export LESS=${LESS:-FRSX} # as in pager.c:pager_preexec() + + _pager_fifo="$(mktemp -t tg-pager-fifo.XXXXXX)" + rm "$_pager_fifo" && mkfifo -m 600 "$_pager_fifo" + + "$TG_PAGER" < "$_pager_fifo" & + exec > "$_pager_fifo" # dup2(pager_fifo.in, 1) + + # this is needed so e.g. `git diff` will still colorize it's output if + # requested in ~/.gitconfig with color.diff=auto + export GIT_PAGER_IN_USE=1 + + # atexit(close(1); wait pager) + trap "exec >&-; rm $_pager_fifo; wait" EXIT +} ## Startup
-- 1.6.1.48.ge9b8