pager: remove 'S' from $LESS by default

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 <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Matthieu Moy 2014-04-30 09:35:25 +02:00 committed by Junio C Hamano
parent d8779e1e25
commit b3275838d9
4 changed files with 13 additions and 8 deletions

View File

@ -558,14 +558,19 @@ core.pager::
configuration, then `$PAGER`, and then the default chosen at configuration, then `$PAGER`, and then the default chosen at
compile time (usually 'less'). compile time (usually 'less').
+ +
When the `LESS` environment variable is unset, Git sets it to `FRSX` When the `LESS` environment variable is unset, Git sets it to `FRX`
(if `LESS` environment variable is set, Git does not change it at (if `LESS` environment variable is set, Git does not change it at
all). If you want to selectively override Git's default setting all). If you want to selectively override Git's default setting
for `LESS`, you can set `core.pager` to e.g. `less -+S`. This will for `LESS`, you can set `core.pager` to e.g. `less -S`. This will
be passed to the shell by Git, which will translate the final be passed to the shell by Git, which will translate the final
command to `LESS=FRSX less -+S`. The environment tells the command command to `LESS=FRX less -S`. The environment does not set the
to set the `S` option to chop long lines but the command line `S` option but the command line does, instructing less to truncate
resets it to the default to fold long lines. long lines. Similarly, setting `core.pager` to `less -+F` will
deactivate the `F` option specified by the environment from the
command-line, deactivating the "quit if one screen" behavior of
`less`. One can specifically activate some flags for particular
commands: for example, setting `pager.blame` to `less -S` enables
line truncation only for `git blame`.
+ +
Likewise, when the `LV` environment variable is unset, Git sets it Likewise, when the `LV` environment variable is unset, Git sets it
to `-c`. You can override this setting by exporting `LV` with to `-c`. You can override this setting by exporting `LV` with

View File

@ -160,7 +160,7 @@ git_pager() {
else else
GIT_PAGER=cat GIT_PAGER=cat
fi fi
: ${LESS=-FRSX} : ${LESS=-FRX}
: ${LV=-c} : ${LV=-c}
export LESS LV export LESS LV

View File

@ -85,7 +85,7 @@ void setup_pager(void)
int i = 0; int i = 0;
if (!getenv("LESS")) if (!getenv("LESS"))
env[i++] = "LESS=FRSX"; env[i++] = "LESS=FRX";
if (!getenv("LV")) if (!getenv("LV"))
env[i++] = "LV=-c"; env[i++] = "LV=-c";
env[i] = NULL; env[i] = NULL;

View File

@ -116,7 +116,7 @@ sub run_pager {
return; return;
} }
open STDIN, '<&', $rfd or fatal "Can't redirect stdin: $!"; open STDIN, '<&', $rfd or fatal "Can't redirect stdin: $!";
$ENV{LESS} ||= 'FRSX'; $ENV{LESS} ||= 'FRX';
$ENV{LV} ||= '-c'; $ENV{LV} ||= '-c';
exec $pager or fatal "Can't run pager: $! ($pager)"; exec $pager or fatal "Can't run pager: $! ($pager)";
} }