term_columns() checks for terminal width via ioctl(2). After redirecting, stdin is no longer terminal to get terminal width. Check terminal width and save it before redirecting stdin in setup_pager() by calling term_columns(). Move term_columns() to pager.c and export it in cache.h. Signed-off-by: Zbigniew Jędrzejewski-Szmek <zbyszek@xxxxxxxxx> --- cache.h | 1 + help.c | 22 ------------------- pager.c | 45 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 22 deletions(-) This replaces cb0850f (Save terminal width before setting up pager - 2012-02-04) from Nguyễn Thái Ngọc Duy and my previous patch to export term_columns(). This is directly on top of v1.7.9 as requested. I removed Signed-off-by from Nguyễn and Junio because the patch is substantially changed. diff --git a/cache.h b/cache.h index 10afd71..2f30b3a 100644 --- a/cache.h +++ b/cache.h @@ -1175,6 +1175,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; diff --git a/help.c b/help.c index cbbe966..14eefc9 100644 --- a/help.c +++ b/help.c @@ -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); diff --git a/pager.c b/pager.c index 975955b..b8049a4 100644 --- a/pager.c +++ b/pager.c @@ -76,6 +76,10 @@ void setup_pager(void) if (!pager) return; + /* prime the term_columns() cache before it is too + * late and stdout is replaced */ + (void) term_columns(); + setenv("GIT_PAGER_IN_USE", "true", 1); /* spawn the pager */ @@ -110,3 +114,44 @@ 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 (if set and positive) or + * ioctl(1, TIOCGWINSZ).ws_col (if positive) or 80. + * + * $COLUMNS even if set, is usually not exported, so + * the variable can be used to override autodection. + * This behaviour conforms to The Single UNIX Specification, Version 2 + * (http://pubs.opengroup.org/onlinepubs/7908799/xbd/envvar.html#tag_002_003). + */ +int term_columns(void) +{ + static int term_columns_cache; + + char *col_string; + int n_cols; + + if (term_columns_cache) + return term_columns_cache; + + col_string = getenv("COLUMNS"); + if (col_string && (n_cols = atoi(col_string)) > 0) { + term_columns_cache = n_cols; + return term_columns_cache; + } + +#ifdef TIOCGWINSZ + { + struct winsize ws; + if (!ioctl(1, TIOCGWINSZ, &ws)) { + if (ws.ws_col) { + term_columns_cache = ws.ws_col; + return term_columns_cache; + } + } + } +#endif + + term_columns_cache = 80; + return term_columns_cache; +} -- 1.7.9.3.g2429d.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html