Skip to content

Commit

Permalink
pager: find out the terminal width before spawning the pager
Browse files Browse the repository at this point in the history
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 <zbyszek@in.waw.pl>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
keszybz authored and gitster committed Feb 13, 2012
1 parent d0482e8 commit ad6c373
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 22 deletions.
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -1172,6 +1172,7 @@ extern void setup_pager(void);
extern const char *pager_program;
extern int pager_in_use(void);
extern int pager_use_color;
extern int term_columns(void);

extern const char *editor_program;
extern const char *askpass_program;
Expand Down
22 changes: 0 additions & 22 deletions help.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,6 @@
#include "help.h"
#include "common-cmds.h"

/* most GUI terminals set COLUMNS (although some don't export it) */
static int term_columns(void)
{
char *col_string = getenv("COLUMNS");
int n_cols;

if (col_string && (n_cols = atoi(col_string)) > 0)
return n_cols;

#ifdef TIOCGWINSZ
{
struct winsize ws;
if (!ioctl(1, TIOCGWINSZ, &ws)) {
if (ws.ws_col)
return ws.ws_col;
}
}
#endif

return 80;
}

void add_cmdname(struct cmdnames *cmds, const char *name, int len)
{
struct cmdname *ent = xmalloc(sizeof(*ent) + len + 1);
Expand Down
37 changes: 37 additions & 0 deletions pager.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@ void setup_pager(void)
if (!pager)
return;

/*
* force computing the width of the terminal before we redirect
* the standard output to the pager.
*/
(void) term_columns();

setenv("GIT_PAGER_IN_USE", "true", 1);

/* spawn the pager */
Expand Down Expand Up @@ -110,3 +116,34 @@ int pager_in_use(void)
env = getenv("GIT_PAGER_IN_USE");
return env ? git_config_bool("GIT_PAGER_IN_USE", env) : 0;
}

/*
* Return cached value (if set) or $COLUMNS environment variable (if
* set and positive) or ioctl(1, TIOCGWINSZ).ws_col (if positive),
* and default to 80 if all else fails.
*/
int term_columns(void)
{
static int term_columns_at_startup;

char *col_string;
int n_cols;

if (term_columns_at_startup)
return term_columns_at_startup;

term_columns_at_startup = 80;

col_string = getenv("COLUMNS");
if (col_string && (n_cols = atoi(col_string)) > 0)
term_columns_at_startup = n_cols;
#ifdef TIOCGWINSZ
else {
struct winsize ws;
if (!ioctl(1, TIOCGWINSZ, &ws) && ws.ws_col)
term_columns_at_startup = ws.ws_col;
}
#endif

return term_columns_at_startup;
}

0 comments on commit ad6c373

Please sign in to comment.