Junio C Hamano <[email protected]> writes:
> Perhaps we can start it like this. Then pager.c can iterate over
> the PAGER_ENV string, parse out LESS=, LV=, etc., and do its thing.
>
> We would also need to muck with git-sh-setup.sh but that file is
> already preprocessed in the Makefile, so we should be able to do
> something similar to "# @@BROKEN_PATH_FIX@@" there.
And here is such an attempt. There may be some missing dependencies
that need to be covered with a mechanism like GIT-BUILD-OPTIONS,
though.
Makefile | 18 ++++++++++++++++--
config.mak.uname | 1 +
git-sh-setup.sh | 9 +++++----
pager.c | 44 +++++++++++++++++++++++++++++++++-----------
4 files changed, 55 insertions(+), 17 deletions(-)
diff --git a/Makefile b/Makefile
index b4af1e2..690f4c6 100644
--- a/Makefile
+++ b/Makefile
@@ -342,6 +342,14 @@ all::
# Define DEFAULT_HELP_FORMAT to "man", "info" or "html"
# (defaults to "man") if you want to have a different default when
# "git help" is called without a parameter specifying the format.
+#
+# Define PAGER_ENV to a SP separated VAR=VAL pairs to define
+# default environment variables to be passed when a pager is spawned, e.g.
+#
+# PAGER_ENV = LESS=-FRSX LV=-c
+#
+# to say "export LESS=-FRSX (and LV=-c) if the environment variable
+# LESS (and LV) is not set, respectively".
GIT-VERSION-FILE: FORCE
@$(SHELL_PATH) ./GIT-VERSION-GEN
@@ -1506,6 +1514,10 @@ ifeq ($(PYTHON_PATH),)
NO_PYTHON = NoThanks
endif
+ifndef PAGER_ENV
+PAGER_ENV = LESS=-FRSX LV=-c
+endif
+
QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir
QUIET_SUBDIR1 =
@@ -1585,11 +1597,12 @@ PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
DIFF_SQ = $(subst ','\'',$(DIFF))
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
+PAGER_ENV_SQ = $(subst ','\'',$(PAGER_ENV))
LIBS = $(GITLIBS) $(EXTLIBS)
BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' \
- $(COMPAT_CFLAGS)
+ $(COMPAT_CFLAGS) -DPAGER_ENV='$(PAGER_ENV)'
LIB_OBJS += $(COMPAT_OBJS)
# Quote for C
@@ -1739,7 +1752,7 @@ common-cmds.h: $(wildcard Documentation/git-*.txt)
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
- $(gitwebdir_SQ):$(PERL_PATH_SQ)
+ $(gitwebdir_SQ):$(PERL_PATH_SQ):$(PAGER_ENV)
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
@@ -1751,6 +1764,7 @@ sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
-e $(BROKEN_PATH_FIX) \
-e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
-e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
+ -e 's|@@PAGER_ENV@@|$(PAGER_ENV_SQ)|g' \
[email protected] >$@+
endef
diff --git a/config.mak.uname b/config.mak.uname
index 7d31fad..8aea8a6 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -188,6 +188,7 @@ ifeq ($(uname_S),FreeBSD)
endif
PYTHON_PATH = /usr/local/bin/python
HAVE_PATHS_H = YesPlease
+ PAGER_ENV = LESS=-FRSX LV=-c MORE=-R
endif
ifeq ($(uname_S),OpenBSD)
NO_STRCASESTR = YesPlease
diff --git a/git-sh-setup.sh b/git-sh-setup.sh
index fffa3c7..8fc1bbd 100644
--- a/git-sh-setup.sh
+++ b/git-sh-setup.sh
@@ -158,10 +158,11 @@ git_pager() {
else
GIT_PAGER=cat
fi
- : ${LESS=-FRSX}
- : ${LV=-c}
- export LESS LV
-
+ for vardef in @@PAGER_ENV@@
+ do
+ var=${vardef%%=*}
+ eval ": \${$vardef} && export $var"
+ done
eval "$GIT_PAGER" '"$@"'
}
diff --git a/pager.c b/pager.c
index 0cc75a8..81a8af7 100644
--- a/pager.c
+++ b/pager.c
@@ -1,6 +1,7 @@
#include "cache.h"
#include "run-command.h"
#include "sigchain.h"
+#include "argv-array.h"
#ifndef DEFAULT_PAGER
#define DEFAULT_PAGER "less"
@@ -60,9 +61,37 @@ const char *git_pager(int stdout_is_tty)
return pager;
}
+#define stringify_(x) #x
+#define stringify(x) stringify_(x)
+
+static void setup_pager_env(struct argv_array *env)
+{
+ const char *pager_env = stringify(PAGER_ENV);
+
+ while (*pager_env) {
+ struct strbuf buf = STRBUF_INIT;
+ const char *cp = strchrnul(pager_env, '=');
+
+ if (!*cp)
+ die("malformed build-time PAGER_ENV");
+ strbuf_add(&buf, pager_env, cp - pager_env);
+ cp = strchrnul(pager_env, ' ');
+ if (!getenv(buf.buf)) {
+ strbuf_reset(&buf);
+ strbuf_add(&buf, pager_env, cp - pager_env);
+ argv_array_push(env, strbuf_detach(&buf, NULL));
+ }
+ strbuf_reset(&buf);
+ while (*cp && *cp == ' ')
+ cp++;
+ pager_env = cp;
+ }
+}
+
void setup_pager(void)
{
const char *pager = git_pager(isatty(1));
+ struct argv_array env = ARGV_ARRAY_INIT;
if (!pager || pager_in_use())
return;
@@ -80,17 +109,10 @@ void setup_pager(void)
pager_process.use_shell = 1;
pager_process.argv = pager_argv;
pager_process.in = -1;
- if (!getenv("LESS") || !getenv("LV")) {
- static const char *env[3];
- int i = 0;
-
- if (!getenv("LESS"))
- env[i++] = "LESS=FRSX";
- if (!getenv("LV"))
- env[i++] = "LV=-c";
- env[i] = NULL;
- pager_process.env = env;
- }
+
+ setup_pager_env(&env);
+ pager_process.env = argv_array_detach(&env, NULL);
+
if (start_command(&pager_process))
return;
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html