Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tty: truecolor check moved before 256 check #30474

Closed
wants to merge 4 commits into from

Conversation

@duncanhealy
Copy link
Contributor

duncanhealy commented Nov 13, 2019

256 color would be return instead of 16m if both env variables were set
Test added to pseudo-tty/test-tty-color-support
Related Issue: #27609

Checklist
  • make -j4 test (UNIX), or vcbuild test (Windows) passes
  • tests and/or benchmarks are included
  • documentation is changed or added
  • commit message follows commit guidelines
Copy link
Member

BridgeAR left a comment

LGTM. Thanks for the fix!

@nodejs-github-bot

This comment has been minimized.

@@ -173,6 +173,11 @@ function getColorDepth(env = process.env) {
return COLORS_256;
}

if (env.COLORTERM) {

This comment has been minimized.

Copy link
@lpinca

lpinca Nov 15, 2019

Member

I looks like this if statement can be removed, if (env.COLORTERM === 'truecolor' || env.COLORTERM === '24bit') { /* ... */ } is sufficient.

This comment has been minimized.

Copy link
@duncanhealy

duncanhealy Nov 17, 2019

Author Contributor

Hi @lpinca this is to catch the case when no TERM environment variable is set
without this COLORS_2 is returned which fails an existing test

This comment has been minimized.

Copy link
@lpinca

lpinca Nov 17, 2019

Member

I don't get it, if env.COLORTERM is truthy, COLORS_16m is returned only if env.COLORTERM === 'truecolor' || env.COLORTERM === '24bit' otherwise nothing is done so why not using only

if (env.COLORTERM === 'truecolor' || env.COLORTERM === '24bit')
  return COLORS_16m;

This comment has been minimized.

Copy link
@duncanhealy

duncanhealy Nov 17, 2019

Author Contributor

COLORTERM can be set to values other than truecolor and 24bit . yes no gnome-terminal are other values used. We want to return the higest spec tty capability available first. If you remove the second check for env.COLORTERM you miss the case when TERM is not set but COLORTERM is not truecolor or 24bit. If you leave the code as it was before you get 256 color terminal when your terminal is capable of 16M. Basically we are moving the COLORS_256 check inbetween the COLORS_16m and the COLORS_16 checks

This comment has been minimized.

Copy link
@lpinca

lpinca Nov 17, 2019

Member

FWIW this is what I'm suggesting

diff --git a/lib/internal/tty.js b/lib/internal/tty.js
index faf5df9b42..63832ef220 100644
--- a/lib/internal/tty.js
+++ b/lib/internal/tty.js
@@ -173,6 +173,9 @@ function getColorDepth(env = process.env) {
       return COLORS_256;
   }
 
+  if (env.COLORTERM === 'truecolor' || env.COLORTERM === '24bit')
+    return COLORS_16m;
+
   if (env.TERM) {
     if (/^xterm-256/.test(env.TERM))
       return COLORS_256;
@@ -188,13 +191,10 @@ function getColorDepth(env = process.env) {
       }
     }
   }
-
+  // Move 16 color COLORTERM below 16m and 256
   if (env.COLORTERM) {
-    if (env.COLORTERM === 'truecolor' || env.COLORTERM === '24bit')
-      return COLORS_16m;
     return COLORS_16;
   }
-
   return COLORS_2;
 }
 
diff --git a/test/pseudo-tty/test-tty-color-support.js b/test/pseudo-tty/test-tty-color-support.js
index b2cfc804c3..57ed640d4d 100644
--- a/test/pseudo-tty/test-tty-color-support.js
+++ b/test/pseudo-tty/test-tty-color-support.js
@@ -71,6 +71,7 @@ const writeStream = new WriteStream(fd);
   [{ NO_COLOR: '', COLORTERM: '24bit' }, 1],
   [{ TMUX: '1', FORCE_COLOR: 0 }, 1],
   [{ NO_COLOR: 'true', FORCE_COLOR: 0, COLORTERM: 'truecolor' }, 1],
+  [{ TERM: 'xterm-256color', COLORTERM: 'truecolor' }, 24],
 ].forEach(([env, depth], i) => {
   const actual = writeStream.getColorDepth(env);
   assert.strictEqual(

This comment has been minimized.

Copy link
@lpinca

lpinca Nov 17, 2019

Member
if (env.COLORTERM) {
  if (env.COLORTERM === 'truecolor' || env.COLORTERM === '24bit')
    return COLORS_16m;
}

is equal to

if (
  env.COLORTERM &&
  (env.COLORTERM === 'truecolor' || env.COLORTERM === '24bit')
) {
  return COLORS_16m;
}

which is equal to

if (env.COLORTERM === 'truecolor' || env.COLORTERM === '24bit') {
  return COLORS_16m;
}

This comment has been minimized.

Copy link
@duncanhealy

duncanhealy Nov 17, 2019

Author Contributor

if you remove the bottom if and make test you can see the case when it fails

This comment has been minimized.

Copy link
@lpinca

lpinca Nov 17, 2019

Member

I've applied the patch in my previous comment and tests pass.

What you mean with bottom if? The one on line 197? If so I'm not suggesting to remove it. I never did. Anyway it does not matter, it is not very important :)

This comment has been minimized.

Copy link
@duncanhealy

duncanhealy Nov 17, 2019

Author Contributor

ok yes we can remove the nested if - I thought you were talking about the second if (env.COLORTERM) - I'll update the pull request now

@lpinca
lpinca approved these changes Nov 17, 2019
@nodejs-github-bot

This comment has been minimized.

@addaleax

This comment has been minimized.

Copy link
Member

addaleax commented Nov 27, 2019

Landed in 80ac428, thanks for the PR! 🎉

addaleax added a commit that referenced this pull request Nov 27, 2019
256 color would be return instead of 16m if both env variables were set

* tty: improve color check order highest spec first
* tty: add test for TERM and COLORTERM set
* tty: move COLORTERM check outside TERM closure
* tty: remove extra if check for COLORTERM

Refs: #27609

PR-URL: #30474
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
@addaleax addaleax closed this Nov 27, 2019
addaleax added a commit that referenced this pull request Nov 30, 2019
256 color would be return instead of 16m if both env variables were set

* tty: improve color check order highest spec first
* tty: add test for TERM and COLORTERM set
* tty: move COLORTERM check outside TERM closure
* tty: remove extra if check for COLORTERM

Refs: #27609

PR-URL: #30474
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
targos added a commit that referenced this pull request Dec 1, 2019
256 color would be return instead of 16m if both env variables were set

* tty: improve color check order highest spec first
* tty: add test for TERM and COLORTERM set
* tty: move COLORTERM check outside TERM closure
* tty: remove extra if check for COLORTERM

Refs: #27609

PR-URL: #30474
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
bmeck added a commit to bmeck/node that referenced this pull request Dec 2, 2019
256 color would be return instead of 16m if both env variables were set

* tty: improve color check order highest spec first
* tty: add test for TERM and COLORTERM set
* tty: move COLORTERM check outside TERM closure
* tty: remove extra if check for COLORTERM

Refs: nodejs#27609

PR-URL: nodejs#30474
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
@BridgeAR BridgeAR mentioned this pull request Dec 3, 2019
@BethGriggs BethGriggs mentioned this pull request Dec 9, 2019
Sebastien-Ahkrin added a commit to Sebastien-Ahkrin/node that referenced this pull request Dec 11, 2019
256 color would be return instead of 16m if both env variables were set

* tty: improve color check order highest spec first
* tty: add test for TERM and COLORTERM set
* tty: move COLORTERM check outside TERM closure
* tty: remove extra if check for COLORTERM

Refs: nodejs#27609

PR-URL: nodejs#30474
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
MylesBorins added a commit that referenced this pull request Dec 17, 2019
256 color would be return instead of 16m if both env variables were set

* tty: improve color check order highest spec first
* tty: add test for TERM and COLORTERM set
* tty: move COLORTERM check outside TERM closure
* tty: remove extra if check for COLORTERM

Refs: #27609

PR-URL: #30474
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
@BethGriggs BethGriggs mentioned this pull request Dec 23, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
8 participants
You can’t perform that action at this time.