+# Check whether we are supposed to output the help message
+should_do_help()
+{
+ # we are being sourced for utility functions, never run help
+ [ -z "$tg__include" ] || return 1
+
+ local prev
+ while [ -n "$1" ]; do
+ case "$1" in
+ help|--help|-h)
+ shift
+ echo "${1:-$prev}"
+ return 0
+ esac
+ prev="$1"
+ shift
+ done
+
+ # run help when there was no previous topic, meaning that there where
+ # no arguments at all
+ test -z "$prev"
+}
+
+## Pager stuff
+
+# isatty FD
+isatty()
+{
+ test -t $1
+}
+
+# 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 | less
+ # NOTE: GIT_PAGER='' is significant
+ TG_PAGER=${GIT_PAGER-${PAGER-less}}
+
+ [ -z "$TG_PAGER" -o "$TG_PAGER" = "cat" ] && return 0
+
+
+ # now spawn pager
+ export LESS="${LESS:-FRSX}" # as in pager.c:pager_preexec()
+
+ # setup_pager should be called only once per command
+ pager_fifo="$tg_tmp_dir/pager"
+ 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)
+ # deliberately overwrites the global EXIT trap
+ trap "exec >&-; rm -rf \"$tg_tmp_dir\"; wait" EXIT
+}
+
+# get_temp NAME [-d]
+# creates a new temporary file (or directory with -d) in the global
+# temporary directory $tg_tmp_dir with pattern prefix NAME
+get_temp()
+{
+ mktemp ${2-} "$tg_tmp_dir/$1.XXXXXX"
+}
+
+## Startup
+
+[ -d "@cmddir@" ] ||
+ die "No command directory: '@cmddir@'"
+
+# check if we should run help and get the topic while we're at it
+help_topic="$(should_do_help "$@")" && { do_help "$help_topic"; exit 0; }