diff --git a/NEWS b/NEWS index e14501e77..ef65b4ab8 100644 --- a/NEWS +++ b/NEWS @@ -67,6 +67,9 @@ GNU coreutils NEWS -*- outline -*- dircolors takes a new --print-ls-colors option to display LS_COLORS entries, on separate lines, colored according to the entry color code. + dircolors will now also match COLORTERM in addition to TERM environment + variables. The default config will apply colors with any COLORTERM set. + ** Improvements cp, mv, and install now use openat-like syscalls when copying to a directory. diff --git a/src/dircolors.c b/src/dircolors.c index 8bb4abfc4..5c9229962 100644 --- a/src/dircolors.c +++ b/src/dircolors.c @@ -271,6 +271,7 @@ dc_parse_stream (FILE *fp, char const *filename) size_t input_line_size = 0; char const *line; char const *term; + char const *colorterm; bool ok = true; /* State for the parser. */ @@ -281,6 +282,11 @@ dc_parse_stream (FILE *fp, char const *filename) if (term == NULL || *term == '\0') term = "none"; + /* Also match $COLORTERM. */ + colorterm = getenv ("COLORTERM"); + if (colorterm == NULL) + colorterm = ""; /* Doesn't match default "?*" */ + while (true) { char *keywd, *arg; @@ -327,10 +333,17 @@ dc_parse_stream (FILE *fp, char const *filename) else if (state != ST_TERMSURE) state = ST_TERMNO; } + else if (c_strcasecmp (keywd, "COLORTERM") == 0) + { + if (fnmatch (arg, colorterm, 0) == 0) + state = ST_TERMSURE; + else if (state != ST_TERMSURE) + state = ST_TERMNO; + } else { if (state == ST_TERMSURE) - state = ST_TERMYES; /* Another TERM can cancel */ + state = ST_TERMYES; /* Another {COLOR,}TERM can cancel. */ if (state != ST_TERMNO) { diff --git a/src/dircolors.hin b/src/dircolors.hin index 0258cc067..673835201 100644 --- a/src/dircolors.hin +++ b/src/dircolors.hin @@ -8,8 +8,11 @@ # The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the # slackware version of dircolors) are recognized but ignored. -# Below are TERM entries, which can be a glob patterns, to match -# against the TERM environment variable to determine if it is colorable. +# Global config options can be specified before TERM or COLORTERM entries + +# Below are TERM or COLORTERM entries, which can be glob patterns, which +# restrict following config to systems with matching environment variables. +COLORTERM ?* TERM Eterm TERM ansi TERM *color* @@ -207,3 +210,6 @@ EXEC 01;32 .opus 00;36 .spx 00;36 .xspf 00;36 + +# Subsequent TERM or COLORTERM entries, can be used to add / override +# config specific to those matching environment variables. diff --git a/tests/misc/dircolors.pl b/tests/misc/dircolors.pl index 27fa2c5b6..6bb8b7463 100755 --- a/tests/misc/dircolors.pl +++ b/tests/misc/dircolors.pl @@ -42,6 +42,14 @@ my @Tests = ['term-4', '-b', {IN => "TERM N*match\nowt 40;33\n"}, {OUT => "LS_COLORS='';\nexport LS_COLORS\n"}], + ['colorterm-1', '-b', {ENV => 'COLORTERM=any'}, + {IN => "COLORTERM ?*\nowt 40;33\n"}, + {OUT => "LS_COLORS='tw=40;33:';\nexport LS_COLORS\n"}], + + ['colorterm-2', '-b', {ENV => 'COLORTERM='}, + {IN => "COLORTERM ?*\nowt 40;33\n"}, + {OUT => "LS_COLORS='';\nexport LS_COLORS\n"}], + ['print-clash1', '-p', '--print-ls', {ERR => "dircolors: options --print-database and --print-ls-colors " . "are mutually exclusive\n" .