Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Commits on Aug 31, 2015
  1. @gitster

    Merge branch 'jk/fix-alias-pager-config-key-warnings'

    gitster authored
    Because the configuration system does not allow "alias.0foo" and
    "pager.0foo" as the configuration key, the user cannot use '0foo'
    as a custom command name anyway, but "git 0foo" tried to look these
    keys up and emitted useless warnings before saying '0foo is not a
    git command'.  These warning messages have been squelched.
    * jk/fix-alias-pager-config-key-warnings:
      config: silence warnings for command names with invalid keys
Commits on Aug 24, 2015
  1. @peff @gitster

    config: silence warnings for command names with invalid keys

    peff authored gitster committed
    When we are running the git command "foo", we may have to
    look up the config keys "" and "". These
    config schemes are mis-designed, as the command names can be
    anything, but the config syntax has some restrictions. For
      $ git foo_bar
      error: invalid key: pager.foo_bar
      error: invalid key: alias.foo_bar
      git: 'foo_bar' is not a git command. See 'git --help'.
    You cannot name an alias with an underscore. And if you have
    an external command with one, you cannot configure its
    In the long run, we may develop a different config scheme
    for these features. But in the near term (and because we'll
    need to support the existing scheme indefinitely), we should
    at least squelch the error messages shown above.
    These errors come from git_config_parse_key. Ideally we
    would pass a "quiet" flag to the config machinery, but there
    are many layers between the pager code and the key parsing.
    Passing a flag through all of those would be an invasive
    Instead, let's provide a config function to report on
    whether a key is syntactically valid, and have the pager and
    alias code skip lookup for bogus keys. We can build this
    easily around the existing git_config_parse_key, with two
    minor modifications:
      1. We now handle a NULL store_key, to validate but not
         write out the normalized key.
      2. We accept a "quiet" flag to avoid writing to stderr.
         This doesn't need to be a full-blown public "flags"
         field, because we can make the existing implementation
         a static helper function, keeping the mess contained
         inside config.c.
    Signed-off-by: Jeff King <>
    Signed-off-by: Junio C Hamano <>
Commits on Jul 13, 2015
  1. @gitster

    Merge branch 'jc/unexport-git-pager-in-use-in-pager'

    gitster authored
    When you say "!<ENTER>" while running say "git log", you'd confuse
    yourself in the resulting shell, that may look as if you took
    control back to the original shell you spawned "git log" from but
    that isn't what is happening.  To that new shell, we leaked
    GIT_PAGER_IN_USE environment variable that was meant as a local
    communication between the original "Git" and subprocesses that was
    spawned by it after we launched the pager, which caused many
    "interesting" things to happen, e.g. "git diff | cat" still paints
    its output in color by default.
    Stop leaking that environment variable to the pager's half of the
    fork; we only need it on "Git" side when we spawn the pager.
    * jc/unexport-git-pager-in-use-in-pager:
      pager: do not leak "GIT_PAGER_IN_USE" to the pager
Commits on Jul 4, 2015
  1. @gitster

    pager: do not leak "GIT_PAGER_IN_USE" to the pager

    gitster authored
    Since 2e6c012 (setup_pager: set GIT_PAGER_IN_USE, 2011-08-17), we
    export GIT_PAGER_IN_USE so that a process that becomes the upstream
    of the spawned pager can still tell that we have spawned the pager
    and decide to do colored output even when its output no longer goes
    to a terminal (i.e. isatty(1)).
    But we forgot to clear it from the enviornment of the spawned pager.
    This is not a problem in a sane world, but if you have a handful of
    thousands Git users in your organization, somebody is bound to do
    strange things, e.g. typing "!<ENTER>" instead of 'q' to get control
    back from $LESS.  GIT_PAGER_IN_USE is still set in that subshell
    spawned by "less", and all sorts of interesting things starts
    happening, e.g. "git diff | cat" starts coloring its output.
    We can clear the environment variable in the half of the fork that
    runs the pager to avoid the confusion.
    Signed-off-by: Junio C Hamano <>
    Acked-by: Jeff King <>
    Signed-off-by: Junio C Hamano <>
Commits on Feb 18, 2015
  1. @gitster

    Merge branch 'jk/decimal-width-for-uintmax'

    gitster authored
    We didn't format an integer that wouldn't fit in "int" but in
    "uintmax_t" correctly.
    * jk/decimal-width-for-uintmax:
      decimal_width: avoid integer overflow
Commits on Feb 5, 2015
  1. @peff @gitster

    decimal_width: avoid integer overflow

    peff authored gitster committed
    The decimal_width function originally appeared in blame.c as
    "lineno_width", and was designed for calculating the
    print-width of small-ish integer values (line numbers in
    text files). In ec7ff5b, it was made into a reusable
    function, and in dc801e7, we started using it to align
    Binary files in a diffstat show byte counts rather than line
    numbers, meaning they can be quite large (e.g., consider
    adding or removing a 2GB file). decimal_width is not up to
    the challenge for two reasons:
      1. It takes the value as an "int", whereas large files may
         easily surpass this. The value may be truncated, in
         which case we will produce an incorrect value.
      2. It counts "up" by repeatedly multiplying another
         integer by 10 until it surpasses the value.  This can
         cause an infinite loop when the value is close to the
         largest representable integer.
         For example, consider using a 32-bit signed integer,
         and a value of 2,140,000,000 (just shy of 2^31-1).
         We will count up and eventually see that 1,000,000,000
         is smaller than our value. The next step would be to
         multiply by 10 and see that 10,000,000,000 is too
         large, ending the loop. But we can't represent that
         value, and we have signed overflow.
         This is technically undefined behavior, but a common
         behavior is to lose the high bits, in which case our
         iterator will certainly be less than the number. So
         we'll keep multiplying, overflow again, and so on.
    This patch changes the argument to a uintmax_t (the same
    type we use to store the diffstat information for binary
    filese), and counts "down" by repeatedly dividing our value
    by 10.
    Signed-off-by: Jeff King <>
    Signed-off-by: Junio C Hamano <>
Commits on Oct 19, 2014
  1. @gitster

    use env_array member of struct child_process

    René Scharfe authored gitster committed
    Convert users of struct child_process to using the managed env_array for
    specifying environment variables instead of supplying an array on the
    stack or bringing their own argv_array.  This shortens and simplifies
    the code and ensures automatically that the allocated memory is freed
    after use.
    Signed-off-by: Rene Scharfe <>
    Signed-off-by: Junio C Hamano <>
Commits on Sep 11, 2014
  1. @gitster

    Merge branch 'rs/child-process-init'

    gitster authored
    Code clean-up.
    * rs/child-process-init:
      run-command: inline prepare_run_command_v_opt()
      run-command: call run_command_v_opt_cd_env() instead of duplicating it
      run-command: introduce child_process_init()
      run-command: introduce CHILD_PROCESS_INIT
Commits on Aug 20, 2014
  1. @gitster

    run-command: introduce CHILD_PROCESS_INIT

    René Scharfe authored gitster committed
    Most struct child_process variables are cleared using memset first after
    declaration.  Provide a macro, CHILD_PROCESS_INIT, that can be used to
    initialize them statically instead.  That's shorter, doesn't require a
    function call and is slightly more readable (especially given that we
    already have STRBUF_INIT, ARGV_ARRAY_INIT etc.).
    Helped-by: Johannes Sixt <>
    Signed-off-by: Rene Scharfe <>
    Signed-off-by: Junio C Hamano <>
Commits on Aug 7, 2014
  1. @tanayabh @gitster

    pager.c: replace `git_config()` with `git_config_get_value()`

    tanayabh authored gitster committed
    Use `git_config_get_value()` instead of `git_config()` to take advantage of
    the config-set API which provides a cleaner control flow.
    Signed-off-by: Tanay Abhra <>
    Reviewed-by: Matthieu Moy <>
    Signed-off-by: Junio C Hamano <>
Commits on Jun 6, 2014
  1. @gitster

    Merge branch 'je/pager-do-not-recurse'

    gitster authored
    We used to unconditionally disable the pager in the pager process
    we spawn to feed out output, but that prevented people who want to
    run "less" within "less" from doing so.
    * je/pager-do-not-recurse:
      pager: do allow spawning pager recursively
Commits on May 7, 2014
  1. @moy @gitster

    pager: remove 'S' from $LESS by default

    moy authored gitster committed
    By default, Git used to set $LESS to -FRSX if $LESS was not set by
    the user. The FRX flags actually make sense for Git (F and X because
    sometimes the output Git pipes to less is short, and R because Git
    pipes colored output). The S flag (chop long lines), on the other
    hand, is not related to Git and is a matter of user preference. Git
    should not decide for the user to change LESS's default.
    More specifically, the S flag harms users who review untrusted code
    within a pager, since a patch looking like:
        -old code;
        +new good code; [... lots of tabs ...] malicious code;
    would appear identical to:
        -old code;
        +new good code;
    Users who prefer the old behavior can still set the $LESS environment
    variable to -FRSX explicitly, or set core.pager to 'less -S'.
    The documentation in config.txt is made a bit longer to keep both an
    example setting the 'S' flag (needed to recover the old behavior)
    and an example showing how to unset a flag set by Git.
    Signed-off-by: Matthieu Moy <>
    Signed-off-by: Junio C Hamano <>
Commits on Apr 28, 2014
  1. @gitster

    pager: do allow spawning pager recursively

    Jörn Engel authored gitster committed
    This reverts commit 88e8f90, which
    tried to allow
        GIT_PAGER="git -p column --mode='dense color'" git -p branch
    and still wanted to avoid "git -p column" to invoke itself.  However,
    this falls into "don't do that -p then" category.
    In particular, inside "git log", with results going through less, a
    potentially interesting commit may be found and from there inside
    "less", the user may want to execute "git show <commit>".  Before
    the commit being reverted, this used to show the patch in less but
    it no longer does.
    Signed-off-by: Jörn Engel <>
    Reviewed-by: Jeff King <>
    Reviewed-by: Matthieu Moy <>
    Acked-by: Duy Nguyen <>
    Signed-off-by: Junio C Hamano <>
Commits on Jan 13, 2014
  1. @gitster

    Merge branch 'jn/pager-lv-default-env'

    gitster authored
    Just like we give a reasonable default for "less" via the LESS
    environment variable, specify a reasonable default for "lv" via the
    "LV" environment variable when spawning the pager.
    * jn/pager-lv-default-env:
      pager: set LV=-c alongside LESS=FRSX
Commits on Jan 7, 2014
  1. @jrn @gitster

    pager: set LV=-c alongside LESS=FRSX

    jrn authored gitster committed
    On systems with lv configured as the preferred pager (i.e.,
    DEFAULT_PAGER=lv at build time, or PAGER=lv exported in the
    environment) git commands that use color show control codes instead of
    color in the pager:
    	$ git diff
    	^[[1mdiff --git a/.mailfilter b/.mailfilter^[[m
    	^[[1mindex aa4f0b2..17e113e 100644^[[m
    	^[[1m--- a/.mailfilter^[[m
    	^[[1m+++ b/.mailfilter^[[m
    	^[[36m@@ -1,11 +1,58 @@^[[m
    "less" avoids this problem because git uses the LESS environment
    variable to pass the -R option ('output ANSI color escapes in raw
    form') by default.  Use the LV environment variable to pass 'lv' the
    -c option ('allow ANSI escape sequences for text decoration / color')
    to fix it for lv, too.
    Noticed when the default value for color.ui flipped to 'auto' in
    v1.8.4-rc0~36^2~1 (2013-06-10).
    Reported-by: Olaf Meeuwissen <>
    Signed-off-by: Jonathan Nieder <>
    Signed-off-by: Junio C Hamano <>
Commits on Dec 5, 2013
  1. @chriscool @gitster

    replace {pre,suf}fixcmp() with {starts,ends}_with()

    chriscool authored gitster committed
    Leaving only the function definitions and declarations so that any
    new topic in flight can still make use of the old functions, replace
    existing uses of the prefixcmp() and suffixcmp() with new API
    The change can be recreated by mechanically applying this:
        $ git grep -l -e prefixcmp -e suffixcmp -- \*.c |
          grep -v strbuf\\.c |
          xargs perl -pi -e '
    on the result of preparatory changes in this series.
    Signed-off-by: Christian Couder <>
    Signed-off-by: Junio C Hamano <>
Commits on Sep 3, 2013
  1. @peff @gitster

    pager: turn on "cat" optimization for DEFAULT_PAGER

    peff authored gitster committed
    If the user specifies a pager of "cat" (or the empty
    string), whether it is in the environment or from config, we
    automagically optimize it out to mean "no pager" and avoid
    forking at all. We treat an empty pager variable similary.
    However, we did not apply this optimization when
    DEFAULT_PAGER was set to "cat" (or the empty string). There
    is no reason to treat DEFAULT_PAGER any differently. The
    optimization should not be user-visible (unless the user has
    a bizarre "cat" in their PATH). And even if it is, we are
    better off behaving consistently between the compile-time
    default and the environment and config settings.
    The stray "else" we are removing from this code was
    introduced by 402461a (pager: do not fork a pager if PAGER
    is set to empty., 2006-04-16). At that time, the line
    directly above used:
       if (!pager)
    	   pager = "less";
    as a fallback, meaning that it could not possibly trigger
    the optimization. Later, a3d023d (Provide a build time
    default-pager setting, 2009-10-30) turned that constant into
    a build-time setting which could be anything, but didn't
    loosen the "else" to let DEFAULT_PAGER use the optimization.
    Noticed-by: Dale R. Worley <>
    Suggested-by: Matthieu Moy <>
    Signed-off-by: Jeff King <>
    Signed-off-by: Junio C Hamano <>
Commits on Oct 29, 2012
  1. @pclouds @peff

    Move setup_diff_pager to libgit.a

    pclouds authored peff committed
    This is used by diff-no-index.c, part of libgit.a while it stays in
    builtin/diff.c. Move it to diff.c so that we won't get undefined
    reference if a program that uses libgit.a happens to pull it in.
    While at it, move check_pager from git.c to pager.c. It makes more
    sense there and pager.c is also part of libgit.a
    Signed-off-by: Nguyễn Thái Ngọc Duy <>
    Signed-off-by: Jeff King <>
Commits on Jun 5, 2012
  1. @peff @gitster

    pager: drop "wait for output to run less" hack

    peff authored gitster committed
    Commit 35ce862 (pager: Work around window resizing bug in
    'less', 2007-01-24) causes git's pager sub-process to wait
    to receive input after forking but before exec-ing the
    pager. To handle this, run-command had to grow a "pre-exec
    callback" feature. Unfortunately, this feature does not work
    at all on Windows (where we do not fork), and interacts
    poorly with run-command's parent notification system. Its
    use should be discouraged.
    The bug in less was fixed in version 406, which was released
    in June 2007. It is probably safe at this point to remove
    our workaround. That lets us rip out the preexec_cb feature
    Signed-off-by: Jeff King <>
    Signed-off-by: Junio C Hamano <>
Commits on Apr 27, 2012
  1. @pclouds @gitster

    Stop starting pager recursively

    pclouds authored gitster committed
    git-column can be used as a pager for other git commands, something
    like this:
        GIT_PAGER="git -p column --mode='dense color'" git -p branch
    The problem with this is that "git -p column" also has $GIT_PAGER set so
    the pager runs itself again as another pager. The end result is an
    infinite loop of forking. Other git commands have the same problem if
    being abused this way.
    Check if $GIT_PAGER is already set and stop launching another pager.
    Signed-off-by: Nguyễn Thái Ngọc Duy <>
    Signed-off-by: Junio C Hamano <>
Commits on Feb 20, 2012
  1. @gitster

    Merge branch 'zj/decimal-width'

    gitster authored
    * zj/decimal-width:
      make lineno_width() from blame reusable for others
Commits on Feb 15, 2012
  1. @keszybz @gitster

    make lineno_width() from blame reusable for others

    keszybz authored gitster committed
    builtin/blame.c has a helper function to compute how many columns
    we need to show a line-number, whose implementation is reusable as
    a more generic helper function to count the number of columns
    necessary to show any cardinal number.
    Rename it to decimal_width(), move it to pager.c and export it for
    use by future callers.
    Signed-off-by: Zbigniew Jędrzejewski-Szmek <>
    Signed-off-by: Junio C Hamano <>
Commits on Feb 13, 2012
  1. @keszybz @gitster

    pager: find out the terminal width before spawning the pager

    keszybz authored gitster committed
    term_columns() checks for terminal width via ioctl(2) on the standard
    output, but we spawn the pager too early for this check to be useful.
    The effect of this buglet can be observed by opening a wide terminal and
    running "git -p help --all", which still shows 80-column output, while
    "git help --all" uses the full terminal width. Run the check before we
    spawn the pager to fix this.
    While at it, move term_columns() to pager.c and export it from cache.h so
    that callers other than the help subsystem can use it.
    Signed-off-by: Zbigniew Jędrzejewski-Szmek <>
    Signed-off-by: Junio C Hamano <>
Commits on Aug 18, 2011
  1. @peff @gitster

    setup_pager: set GIT_PAGER_IN_USE

    peff authored gitster committed
    We have always set a global "spawned_pager" variable when we
    start the pager. This lets us make the auto-color decision
    later in the program as as "we are outputting to a terminal,
    or to a pager which can handle colors".
    Commit 6e9af86 added support for the GIT_PAGER_IN_USE
    environment variable. An external program calling git (e.g.,
    git-svn) could set this variable to indicate that it had
    already started the pager, and that the decision about
    auto-coloring should take that into account.
    However, 6e9af86 failed to do the reverse, which is to tell
    external programs when git itself has started the pager.
    Thus a git command implemented as an external script that
    has the pager turned on (e.g., "git -p stash show") would
    not realize it was going to a pager, and would suppress
    This patch remedies that; we always set GIT_PAGER_IN_USE
    when we start the pager, and the value is respected by both
    this program and any spawned children.
    Signed-off-by: Jeff King <>
    Signed-off-by: Junio C Hamano <>
Commits on Feb 15, 2010
  1. @jrn @gitster

    Make 'git var GIT_PAGER' always print the configured pager

    jrn authored gitster committed
    Scripted commands that want to use git’s configured pager know better
    than ‘git var’ does whether stdout is going to be a tty at the
    appropriate time.  Checking isatty(1) as git_pager() does now won’t
    cut it, since the output of git var itself is almost never a terminal.
    The symptom is that when used by humans, ‘git var GIT_PAGER’ behaves
    as it should, but when used by scripts, it always returns ‘cat’!
    So avoid tricks with isatty() and just always print the configured
    This does not fix the callers to check isatty(1) themselves yet.
    Nevertheless, this patch alone is enough to fix 'am --interactive'.
    Thanks to Sebastian Celis for the report and Jeff King for the
    Reported-by: Sebastian Celis <>
    Signed-off-by: Jonathan Nieder <>
    Signed-off-by: Junio C Hamano <>
Commits on Jan 6, 2010
  1. @peff @gitster

    run-command: convert simple callsites to use_shell

    peff authored gitster committed
    Now that we have the use_shell feature, these callsites can
    all be converted with small changes.
    Signed-off-by: Jeff King <>
    Signed-off-by: Junio C Hamano <>
Commits on Nov 13, 2009
  1. @gitster

    Provide a build time default-pager setting

    gitster authored
    Provide a DEFAULT_PAGER knob so packagers can set the fallback
    pager to something appropriate during the build.
    On (old) solaris systems, /usr/bin/less (typically the first less
    found) doesn't understand the default arguments (FXRS), which
    forces users to alter their environment (PATH, GIT_PAGER, LESS,
    etc) or have a local or global gitconfig before paging works as
    On Debian systems, by policy packages must fall back to the
    'pager' command, so that changing the target of the
    /usr/bin/pager symlink changes the default pager for all packages
    at once.
    Signed-off-by: Jonathan Nieder <>
    Signed-off-by: Ben Walton <>
    Signed-off-by: Jonathan Nieder <>
    Signed-off-by: Junio C Hamano <>
  2. @jrn @gitster

    Teach git var about GIT_PAGER

    jrn authored gitster committed
    Expose the command found by setup_pager() for scripts to use.
    Scripts can use this to avoid repeating the logic to look for a
    proper pager in each command.
    Signed-off-by: Jonathan Nieder <>
    Signed-off-by: Junio C Hamano <>
Commits on Sep 19, 2009
  1. @lznuaa @gitster

    Test for WIN32 instead of __MINGW32_

    lznuaa authored gitster committed
    The code which is conditional on MinGW32 is actually conditional on Windows.
    Use the WIN32 symbol, which is defined by the MINGW32 and MSVC environments,
    but not by Cygwin.
    Define SNPRINTF_SIZE_CORR=1 for MSVC too, as its vsnprintf function does
    not add NUL at the end of the buffer if the result fits the buffer size
    Signed-off-by: Frank Li <>
    Signed-off-by: Marius Storm-Olsen <>
    Acked-by: Johannes Sixt <>
    Signed-off-by: Junio C Hamano <>
Commits on Sep 11, 2009
  1. @gitster

    pager: set LESS=FRSX also on Windows

    Johannes Sixt authored gitster committed
    Previously, this environment variable was set in the pager_preexec
    callback, which is conditionally-compiled only on Unix, because it is not,
    and cannot be, called on Windows.
    With this patch the env member of struct child_process is used to set
    the environment variable, which also works on Windows.
    Noticed by Alexey Borzenkov.
    Signed-off-by: Johannes Sixt <>
    Signed-off-by: Junio C Hamano <>
Commits on Jan 22, 2009
  1. @peff @gitster

    pager: do wait_for_pager on signal death

    peff authored gitster committed
    Since ea27a18 (spawn pager via run_command interface), the
    original git process actually does git work, and the pager
    is a child process (actually, on Windows it has always been
    that way, since Windows lacks fork). After spawning the
    pager, we register an atexit() handler that waits for the
    pager to finish.
    Unfortunately, that handler does not always run. In
    particular, if git is killed by a signal, then we exit
    immediately. The calling shell then thinks that git is done;
    however, the pager is still trying to run and impact the
    terminal. The result can be seen by running a long git
    process with a pager (e.g., "git log -p") and hitting ^C.
    Depending on your config, you should see the shell prompt,
    but pressing a key causes the pager to do any terminal
    de-initialization sequence.
    This patch just intercepts any death-dealing signals and
    waits for the pager before dying. Under typical less
    configuration, that means hitting ^C will cause git to stop
    generating output, but the pager will keep running.
    Signed-off-by: Jeff King <>
    Signed-off-by: Junio C Hamano <>
Commits on Dec 16, 2008
  1. @gitster

    Merge branch 'maint'

    gitster authored
    * maint:
      fast-import: close pack before unlinking it
      pager: do not dup2 stderr if it is already redirected
      git-show: do not segfault when showing a bad tag
Commits on Dec 15, 2008
  1. @gitster

    pager: do not dup2 stderr if it is already redirected

    gitster authored
    An earlier commit 61b8050 (sending errors to stdout under $PAGER,
    2008-02-16) avoided losing the error messages that are sent to the
    standard error when $PAGER is in effect by dup2'ing fd 2 to the pager.
    his way, showing a tag object that points to a bad object:
        $ git show tag-foo
    would give the error message to the pager.  However, it was not quite
    right if the user did:
        $ git show 2>error.log tag-foo
    i.e. use the pager but store the errors in a separate file.
    Signed-off-by: Junio C Hamano <>
Commits on Jul 26, 2008
  1. @peff @gitster

    spawn pager via run_command interface

    peff authored gitster committed
    This has two important effects:
     1. The pager is now the _child_ process, instead of the
        parent. This means that whatever spawned git (e.g., the
        shell) will see the exit code of the git process, and
        not the pager.
     2. The mingw and regular code are now unified, which makes
        the setup_pager function much simpler.
    There are two caveats:
     1. We used to call execlp directly on the pager, followed
        by trying to exec it via the shall. We now just use the
        shell (which is what mingw has always done). This may
        have different results for pager names which contain
        shell metacharacters.
        It is also slightly less efficient because we
        unnecessarily run the shell; however, pager spawning is
        by definition an interactive task, so it shouldn't be
        a huge problem.
     2. The git process will remain in memory while the user
        looks through the pager. This is potentially wasteful.
        We could get around this by turning the parent into a
        meta-process which spawns _both_ git and the pager,
        collects the exit status from git, waits for both to
        end, and then exits with git's exit code.
    Signed-off-by: Jeff King <>
    Signed-off-by: Junio C Hamano <>
Commits on Jun 26, 2008
  1. Windows: Make the pager work.

    Johannes Sixt authored
    Since we have neither fork() nor exec(), we have to spawn the pager and
    feed it with the program's output.
    Signed-off-by: Johannes Sixt <>
Something went wrong with that request. Please try again.