On 12/02/2022 21:54, Arsen Arsenović wrote:
COLORTERM is an environment used usually to expose truecolor support in
terminal emulators. If a terminal emulator supports truecolor, it is
surely reasonable to assume it also supports 8/16/256 colors.

This implicitly supports foot, alacritty and any other truecolor
terminal emulator with unmatched $TERM.
---
Good evening,

I've noticed dircolors does not work in foot and alacritty, and on previously
raised patches about adding a TERM entry for them the concern of a nongeneric
solution was brought up. This is a valid concern, and as many terminals
(including these two) export COLORTERM to advertise 24-bit color support, it'd
appear to be a good way to pick up on color support.

COLORTERM does seem to be a way to advertise truecolor support:
https://gitlab.com/gnachman/iterm2/-/issues/5294

Note dircolors supports config files for multiple terminals like:

  global config
  ...
  TERM should_not_match
  specific config
  ...
  TERM should_match
  ...

Your change could break this setup if there were
entries in "specific config" that weren't overridden later,
and even if they were, it would result in larger LS_COLORS env vars.

How about the attached patch to allow matching COLORTERM
just like TERM, and set the pattern in the default config
to match against any COLORTERM value.
This also has the advantage of handling specific COLORTERM values.
We would have to add the default COLORTERM entry to distro config
(when supported by the installed dircolors), but that should be easy enough to 
do.

I've also attached a patch to avoid needless calls to fnmatch().

cheers,
Pádraig
From 9f9a9fccb836b5933d4479d0eb274a80ffe5ad37 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <p...@draigbrady.com>
Date: Mon, 14 Feb 2022 17:25:04 +0000
Subject: [PATCH 2/2] dircolors: speed up processing of TERM entries

* src/dircolors.c (main): Avoid glob matching
when we've already matched in a group of {COLOR,}TERM entries.
---
 src/dircolors.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/src/dircolors.c b/src/dircolors.c
index da0e1aed3..b543e8568 100644
--- a/src/dircolors.c
+++ b/src/dircolors.c
@@ -328,17 +328,13 @@ dc_parse_stream (FILE *fp, char const *filename)
       unrecognized = false;
       if (c_strcasecmp (keywd, "TERM") == 0)
         {
-          if (fnmatch (arg, term, 0) == 0)
-            state = ST_TERMSURE;
-          else if (state != ST_TERMSURE)
-            state = ST_TERMNO;
+          if (state != ST_TERMSURE)
+            state = fnmatch (arg, term, 0) == 0 ? ST_TERMSURE : 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;
+          if (state != ST_TERMSURE)
+            state = fnmatch (arg, colorterm, 0) == 0 ? ST_TERMSURE : ST_TERMNO;
         }
       else
         {
-- 
2.26.2

From b8472a9dbe91ce577d71c098eb947b9425053905 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <p...@draigbrady.com>
Date: Sat, 12 Feb 2022 22:54:07 +0100
Subject: [PATCH 1/2] dircolors: consider COLORTERM as well as TERM env vars

COLORTERM is an environment used usually to expose truecolor support in
terminal emulators.  Therefore support matches on that in addition
to TERM.  Also set the default COLORTERM match pattern so that
we apply colors if COLORTERM is any value.

This implicitly supports a terminal like "foot"
without a need for an explicit TERM entry.

* NEWS: Mention the new feature.
* src/dircolors.c (main): Match COLORTERM like we do for TERM.
* src/dircolors.hin: Add default config to match any COLORTERM.
* tests/misc/dircolors.pl: Add test cases.
---
 NEWS                    |  3 +++
 src/dircolors.c         | 15 ++++++++++++++-
 src/dircolors.hin       | 10 ++++++++--
 tests/misc/dircolors.pl |  8 ++++++++
 4 files changed, 33 insertions(+), 3 deletions(-)

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..da0e1aed3 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";
 
+  /* Match all items if $COLORTERM set.  */
+  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" .
-- 
2.26.2

Reply via email to