commit: 297e49f62a6520fce353b8e82f3bba430f1ea613 Author: Fabian Groffen <grobian <AT> gentoo <DOT> org> AuthorDate: Thu Dec 23 12:53:42 2021 +0000 Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org> CommitDate: Thu Dec 23 12:53:42 2021 +0000 URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=297e49f6
main: ensure default colouring is respected Introduced in v0.93, a regression on picking up colour default. We were setting nocolor variable, but before it was acted on, it was overwritten with a default. So now instead set the default based on having a tty or not, and let profiles, env and flags override from there. Bug: https://bugs.gentoo.org/829837 Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org> applets.h | 14 +++++++++++--- main.c | 13 ++++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/applets.h b/applets.h index 6070fe4..16e7d9f 100644 --- a/applets.h +++ b/applets.h @@ -153,8 +153,16 @@ static const struct applet_t { case 'q': setup_quiet(); break; \ case 'V': version_barf(); break; \ case 'h': applet ## _usage(EXIT_SUCCESS); break; \ - case 'C': color_clear(); setenv("NOCOLOR", "true", 1); break; \ - case 0x2: color_remap(); unsetenv("NOCOLOR"); break; \ + case 'C': if (!nocolor) { \ + nocolor = 1; \ + color_clear(); \ + setenv("NOCOLOR", "true", 1); \ + } break; \ + case 0x2: if (nocolor) { \ + nocolor = 0; \ + color_remap(); \ + setenv("NOCOLOR", "false", 1); \ + } break; \ default: applet ## _usage(EXIT_FAILURE); break; extern char *portarch; @@ -178,8 +186,8 @@ extern DEFINE_ARRAY(overlay_names); extern DEFINE_ARRAY(overlay_src); extern char *main_overlay; extern int twidth; +extern bool nocolor; -void no_colors(void); void setup_quiet(void); void version_barf(void); void usage(int status, const char *flags, struct option const opts[], diff --git a/main.c b/main.c index 06c52b7..b3f2f6d 100644 --- a/main.c +++ b/main.c @@ -30,6 +30,7 @@ char *module_name = NULL; int verbose = 0; int quiet = 0; int twidth; +bool nocolor; char pretend = 0; char *portarch; char *portroot; @@ -672,7 +673,6 @@ read_portage_profile(const char *profile, env_vars vars[], set *masks) read_portage_file(profile_file, PMASK_FILE, masks); } -static bool nocolor = 0; env_vars vars_to_read[] = { #define _Q_EV(t, V, set, lset, d) \ { \ @@ -1091,7 +1091,7 @@ initialize_portage_env(void) } /* Make sure ROOT always ends in a slash */ - var = &vars_to_read[0]; + var = &vars_to_read[0]; /* ROOT */ if (var->value_len == 0 || (*var->value.s)[var->value_len - 1] != '/') { portroot = xrealloc(portroot, var->value_len + 2); portroot[var->value_len] = '/'; @@ -1134,7 +1134,7 @@ initialize_portage_env(void) setenv("NOCOLOR", "true", 1); } else { color_remap(); - unsetenv("NOCOLOR"); + setenv("NOCOLOR", "false", 1); } } @@ -1151,7 +1151,11 @@ int main(int argc, char **argv) bindtextdomain(argv0, CONFIG_EPREFIX "usr/share/locale"); textdomain(argv0); + /* note: setting nocolor here is pointless, since + * initialize_portage_env is going to re-init nocolor, so make + * sure we modify the default instead. */ twidth = 0; + nocolor = 0; if (fstat(fileno(stdout), &st) != -1) { if (!isatty(fileno(stdout))) { nocolor = 1; @@ -1162,7 +1166,10 @@ int main(int argc, char **argv) if (ioctl(0, TIOCGWINSZ, &winsz) == 0 && winsz.ws_col > 0) twidth = (int)winsz.ws_col; } + } else { + nocolor = 1; } + vars_to_read[7].default_value = (char *)nocolor; /* NOCOLOR */ initialize_portage_env(); optind = 0;
