Merge branch 'ew/build-time-pager-tweaks'
authorJunio C Hamano <gitster@pobox.com>
Mon, 8 Aug 2016 21:48:44 +0000 (14:48 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 8 Aug 2016 21:48:44 +0000 (14:48 -0700)
The build procedure learned PAGER_ENV knob that lists what default
environment variable settings to export for popular pagers. This
mechanism is used to tweak the default settings to MORE on FreeBSD.

* ew/build-time-pager-tweaks:
pager: move pager-specific setup into the build

1  2 
Makefile
config.mak.uname
git-sh-setup.sh
diff --combined Makefile
index ad3624d95ba337e595874b04bf247d8b3be1d183,99491494b50e7f26322cd1f638b6ddb62de6a6ef..d96ecb7141a12f1fe47246805c5d4e4e562a5c86
+++ b/Makefile
@@@ -351,12 -351,9 +351,12 @@@ all:
  # Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
  # return NULL when it receives a bogus time_t.
  #
 -# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime in librt.
 +# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime.
  #
 -# Define HAVE_CLOCK_MONOTONIC if your platform has CLOCK_MONOTONIC in librt.
 +# Define HAVE_CLOCK_MONOTONIC if your platform has CLOCK_MONOTONIC.
 +#
 +# Define NEEDS_LIBRT if your platform requires linking with librt (glibc version
 +# before 2.17) for clock_gettime and CLOCK_MONOTONIC.
  #
  # Define USE_PARENS_AROUND_GETTEXT_N to "yes" if your compiler happily
  # compiles the following initialization:
  # Define HAVE_BSD_SYSCTL if your platform has a BSD-compatible sysctl function.
  #
  # Define HAVE_GETDELIM if your system has the getdelim() function.
+ #
+ # 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=FRX LV=-c
+ #
+ # to say "export LESS=FRX (and LV=-c) if the environment variable
+ # LESS (and LV) is not set, respectively".
  
  GIT-VERSION-FILE: FORCE
        @$(SHELL_PATH) ./GIT-VERSION-GEN
@@@ -721,7 -726,6 +729,7 @@@ LIB_OBJS += diff-lib.
  LIB_OBJS += diff-no-index.o
  LIB_OBJS += diff.o
  LIB_OBJS += dir.o
 +LIB_OBJS += dir-iterator.o
  LIB_OBJS += editor.o
  LIB_OBJS += entry.o
  LIB_OBJS += environment.o
@@@ -755,7 -759,6 +763,7 @@@ LIB_OBJS += merge.
  LIB_OBJS += merge-blobs.o
  LIB_OBJS += merge-recursive.o
  LIB_OBJS += mergesort.o
 +LIB_OBJS += mru.o
  LIB_OBJS += name-hash.o
  LIB_OBJS += notes.o
  LIB_OBJS += notes-cache.o
@@@ -787,7 -790,6 +795,7 @@@ LIB_OBJS += read-cache.
  LIB_OBJS += reflog-walk.o
  LIB_OBJS += refs.o
  LIB_OBJS += refs/files-backend.o
 +LIB_OBJS += refs/iterator.o
  LIB_OBJS += ref-filter.o
  LIB_OBJS += remote.o
  LIB_OBJS += replace_object.o
@@@ -945,7 -947,7 +953,7 @@@ BUILTIN_OBJS += builtin/verify-tag.
  BUILTIN_OBJS += builtin/worktree.o
  BUILTIN_OBJS += builtin/write-tree.o
  
 -GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
 +GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB)
  EXTLIBS =
  
  GIT_USER_AGENT = git/$(GIT_VERSION)
@@@ -1471,16 -1473,13 +1479,16 @@@ endi
  
  ifdef HAVE_CLOCK_GETTIME
        BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
 -      EXTLIBS += -lrt
  endif
  
  ifdef HAVE_CLOCK_MONOTONIC
        BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
  endif
  
 +ifdef NEEDS_LIBRT
 +      EXTLIBS += -lrt
 +endif
 +
  ifdef HAVE_BSD_SYSCTL
        BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
  endif
@@@ -1501,6 -1500,10 +1509,10 @@@ ifeq ($(PYTHON_PATH),
  NO_PYTHON = NoThanks
  endif
  
+ ifndef PAGER_ENV
+ PAGER_ENV = LESS=FRX LV=-c
+ endif
  QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
  QUIET_SUBDIR1  =
  
@@@ -1581,15 -1584,7 +1593,15 @@@ TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_
  DIFF_SQ = $(subst ','\'',$(DIFF))
  PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
  
 -LIBS = $(GITLIBS) $(EXTLIBS)
 +# We must filter out any object files from $(GITLIBS),
 +# as it is typically used like:
 +#
 +#   foo: foo.o $(GITLIBS)
 +#     $(CC) $(filter %.o,$^) $(LIBS)
 +#
 +# where we use it as a dependency. Since we also pull object files
 +# from the dependency list, that would make each entry appear twice.
 +LIBS = $(filter-out %.o, $(GITLIBS)) $(EXTLIBS)
  
  BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' \
        $(COMPAT_CFLAGS)
@@@ -1630,6 -1625,11 +1642,11 @@@ ifdef DEFAULT_HELP_FORMA
  BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
  endif
  
+ PAGER_ENV_SQ = $(subst ','\'',$(PAGER_ENV))
+ PAGER_ENV_CQ = "$(subst ",\",$(subst \,\\,$(PAGER_ENV)))"
+ PAGER_ENV_CQ_SQ = $(subst ','\'',$(PAGER_ENV_CQ))
+ BASIC_CFLAGS += -DPAGER_ENV='$(PAGER_ENV_CQ_SQ)'
  ALL_CFLAGS += $(BASIC_CFLAGS)
  ALL_LDFLAGS += $(BASIC_LDFLAGS)
  
@@@ -1725,8 -1725,8 +1742,8 @@@ git.sp git.s git.o: EXTRA_CPPFLAGS = 
        '-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
  
  git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
 -      $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) git.o \
 -              $(BUILTIN_OBJS) $(LIBS)
 +      $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \
 +              $(filter %.o,$^) $(LIBS)
  
  help.sp help.s help.o: common-cmds.h
  
@@@ -1754,7 -1754,7 +1771,7 @@@ common-cmds.h: $(wildcard Documentation
  
  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):$(SANE_TEXT_GREP)
+       $(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP):$(PAGER_ENV)
  define cmd_munge_script
  $(RM) $@ $@+ && \
  sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
      -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
      -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
      -e 's|@@SANE_TEXT_GREP@@|$(SANE_TEXT_GREP)|g' \
+     -e 's|@@PAGER_ENV@@|$(PAGER_ENV_SQ)|g' \
      $@.sh >$@+
  endef
  
@@@ -1919,7 -1920,6 +1937,7 @@@ TEST_OBJS := $(patsubst %$X,%.o,$(TEST_
  OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
        $(XDIFF_OBJS) \
        $(VCSSVN_OBJS) \
 +      common-main.o \
        git.o
  ifndef NO_CURL
        OBJECTS += http.o http-walker.o remote-curl.o
@@@ -2081,10 -2081,7 +2099,10 @@@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) -
        --keyword=gettextln --keyword=eval_gettextln
  XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
  LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
 -LOCALIZED_SH = $(SCRIPT_SH) git-parse-remote.sh
 +LOCALIZED_SH = $(SCRIPT_SH)
 +LOCALIZED_SH += git-parse-remote.sh
 +LOCALIZED_SH += git-rebase--interactive.sh
 +LOCALIZED_SH += git-sh-setup.sh
  LOCALIZED_PERL = $(SCRIPT_PERL)
  
  ifdef XGETTEXT_INCLUDE_TESTS
@@@ -2174,6 -2171,7 +2192,7 @@@ GIT-BUILD-OPTIONS: FORC
        @echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@+
        @echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+
        @echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+
+       @echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
  ifdef TEST_OUTPUT_DIRECTORY
        @echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
  endif
@@@ -2246,9 -2244,17 +2265,9 @@@ perf: al
  
  .PHONY: test perf
  
 -t/helper/test-ctype$X: ctype.o
 -
 -t/helper/test-date$X: date.o ctype.o
 -
 -t/helper/test-delta$X: diff-delta.o patch-delta.o
 -
 -t/helper/test-line-buffer$X: vcs-svn/lib.a
 -
 -t/helper/test-parse-options$X: parse-options.o parse-options-cb.o
 +t/helper/test-line-buffer$X: $(VCSSVN_LIB)
  
 -t/helper/test-svn-fe$X: vcs-svn/lib.a
 +t/helper/test-svn-fe$X: $(VCSSVN_LIB)
  
  .PRECIOUS: $(TEST_OBJS)
  
diff --combined config.mak.uname
index 17fed2f43ac6f7564785e2074e7f130bd625c231,9b73c669f05d1db51f44e783542e0772e0bd498b..b232908f8c8c2eae84bd6ef8ab2a96ac45bf94a3
@@@ -36,8 -36,6 +36,8 @@@ ifeq ($(uname_S),Linux
        HAVE_DEV_TTY = YesPlease
        HAVE_CLOCK_GETTIME = YesPlease
        HAVE_CLOCK_MONOTONIC = YesPlease
 +      # -lrt is needed for clock_gettime on glibc <= 2.16
 +      NEEDS_LIBRT = YesPlease
        HAVE_GETDELIM = YesPlease
        SANE_TEXT_GREP=-a
  endif
@@@ -205,10 -203,10 +205,11 @@@ ifeq ($(uname_S),FreeBSD
                NO_STRTOUMAX = YesPlease
        endif
        PYTHON_PATH = /usr/local/bin/python
 +      PERL_PATH = /usr/local/bin/perl
        HAVE_PATHS_H = YesPlease
        GMTIME_UNRELIABLE_ERRORS = UnfortunatelyYes
        HAVE_BSD_SYSCTL = YesPlease
+       PAGER_ENV = LESS=FRX LV=-c MORE=FRX
  endif
  ifeq ($(uname_S),OpenBSD)
        NO_STRCASESTR = YesPlease
diff --combined git-sh-setup.sh
index 0c34aa62f6b1b33be67f4221290c9c5ce55beabe,cda32d0f82f4ee15be9853863905e9932d4d50a2..a8a4576342e519932be07fca5cbe2ee2fc0ab73b
@@@ -2,9 -2,6 +2,9 @@@
  # to set up some variables pointing at the normal git directories and
  # a few helper shell functions.
  
 +# Source git-sh-i18n for gettext support.
 +. git-sh-i18n
 +
  # Having this variable in your environment would break scripts because
  # you would cause "cd" to be taken to unexpected places.  If you
  # like CDPATH, define it for your interactive shell sessions without
@@@ -86,16 -83,16 +86,16 @@@ if test -n "$OPTIONS_SPEC"; the
  else
        dashless=$(basename -- "$0" | sed -e 's/-/ /')
        usage() {
 -              die "usage: $dashless $USAGE"
 +              die "$(eval_gettext "usage: \$dashless \$USAGE")"
        }
  
        if [ -z "$LONG_USAGE" ]
        then
 -              LONG_USAGE="usage: $dashless $USAGE"
 +              LONG_USAGE="$(eval_gettext "usage: \$dashless \$USAGE")"
        else
 -              LONG_USAGE="usage: $dashless $USAGE
 +              LONG_USAGE="$(eval_gettext "usage: \$dashless \$USAGE
  
 -$LONG_USAGE"
 +$LONG_USAGE")"
        fi
  
        case "$1" in
@@@ -163,9 -160,11 +163,11 @@@ git_pager() 
        else
                GIT_PAGER=cat
        fi
-       : "${LESS=-FRX}"
-       : "${LV=-c}"
-       export LESS LV
+       for vardef in @@PAGER_ENV@@
+       do
+               var=${vardef%%=*}
+               eval ": \"\${$vardef}\" && export $var"
+       done
  
        eval "$GIT_PAGER" '"$@"'
  }
@@@ -185,7 -184,7 +187,7 @@@ is_bare_repository () 
  cd_to_toplevel () {
        cdup=$(git rev-parse --show-toplevel) &&
        cd "$cdup" || {
 -              echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree"
 +              gettextln "Cannot chdir to \$cdup, the toplevel of the working tree" >&2
                exit 1
        }
  }
  require_work_tree_exists () {
        if test "z$(git rev-parse --is-bare-repository)" != zfalse
        then
 -              die "fatal: $0 cannot be used without a working tree."
 +              program_name=$0
 +              die "$(gettext "fatal: \$program_name cannot be used without a working tree.")"
        fi
  }
  
  require_work_tree () {
 -      test "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = true ||
 -      die "fatal: $0 cannot be used without a working tree."
 +      test "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = true || {
 +              program_name=$0
 +              die "$(gettext "fatal: \$program_name cannot be used without a working tree.")"
 +      }
  }
  
  require_clean_work_tree () {
  
        if ! git diff-files --quiet --ignore-submodules
        then
 -              echo >&2 "Cannot $1: You have unstaged changes."
 +              action=$1
 +              case "$action" in
 +              rebase)
 +                      gettextln "Cannot rebase: You have unstaged changes." >&2
 +                      ;;
 +              "rewrite branches")
 +                      gettextln "Cannot rewrite branches: You have unstaged changes." >&2
 +                      ;;
 +              "pull with rebase")
 +                      gettextln "Cannot pull with rebase: You have unstaged changes." >&2
 +                      ;;
 +              *)
 +                      eval_gettextln "Cannot \$action: You have unstaged changes." >&2
 +                      ;;
 +              esac
                err=1
        fi
  
        if ! git diff-index --cached --quiet --ignore-submodules HEAD --
        then
 -              if [ $err = 0 ]
 +              if test $err = 0
                then
 -                  echo >&2 "Cannot $1: Your index contains uncommitted changes."
 +                      action=$1
 +                      case "$action" in
 +                      rebase)
 +                              gettextln "Cannot rebase: Your index contains uncommitted changes." >&2
 +                              ;;
 +                      "pull with rebase")
 +                              gettextln "Cannot pull with rebase: Your index contains uncommitted changes." >&2
 +                              ;;
 +                      *)
 +                              eval_gettextln "Cannot \$action: Your index contains uncommitted changes." >&2
 +                              ;;
 +                      esac
                else
 -                  echo >&2 "Additionally, your index contains uncommitted changes."
 +                  gettextln "Additionally, your index contains uncommitted changes." >&2
                fi
                err=1
        fi
  
 -      if [ $err = 1 ]
 +      if test $err = 1
        then
 -              test -n "$2" && echo >&2 "$2"
 +              test -n "$2" && echo "$2" >&2
                exit 1
        fi
  }
@@@ -367,12 -338,12 +369,12 @@@ git_dir_init () 
        then
                test -z "$(git rev-parse --show-cdup)" || {
                        exit=$?
 -                      echo >&2 "You need to run this command from the toplevel of the working tree."
 +                      gettextln "You need to run this command from the toplevel of the working tree." >&2
                        exit $exit
                }
        fi
        test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd) || {
 -              echo >&2 "Unable to determine absolute path of git directory"
 +              gettextln "Unable to determine absolute path of git directory" >&2
                exit 1
        }
        : "${GIT_OBJECT_DIRECTORY="$(git rev-parse --git-path objects)"}"