repl: don't use tty control codes when $TERM is set to "dumb"
authorSalman Aljammaz <s@0x65.net>
Sat, 5 Sep 2015 15:03:46 +0000 (18:03 +0300)
committerRod Vagg <rod@vagg.org>
Tue, 22 Sep 2015 22:39:33 +0000 (08:39 +1000)
This change stops the REPL from using ANSI control codes for colours
when the TERM environment variable is set to "dumb".

"dumb" is the terminal type with the smallest set of capabilities as
described by terminfo. See:

http://invisible-island.net/ncurses/terminfo.ti.html#toc-_Specials

Related: https://github.com/nodejs/node-v0.x-archive/issues/5344
Related: https://github.com/nodejs/node-v0.x-archive/pull/25506
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: Roman Reiss <me@silverwind.io>
PR-URL: https://github.com/nodejs/node/pull/2712

lib/internal/repl.js
test/parallel/test-repl-envvars.js [new file with mode: 0644]

index b2c74e1..c1beb85 100644 (file)
@@ -34,7 +34,10 @@ function createRepl(env, opts, cb) {
   if (parseInt(env.NODE_NO_READLINE)) {
     opts.terminal = false;
   }
-  if (parseInt(env.NODE_DISABLE_COLORS)) {
+  // the "dumb" special terminal, as defined by terminfo, doesn't support
+  // ANSI colour control codes.
+  // see http://invisible-island.net/ncurses/terminfo.ti.html#toc-_Specials
+  if (parseInt(env.NODE_DISABLE_COLORS) || env.TERM === 'dumb') {
     opts.useColors = false;
   }
 
diff --git a/test/parallel/test-repl-envvars.js b/test/parallel/test-repl-envvars.js
new file mode 100644 (file)
index 0000000..6073144
--- /dev/null
@@ -0,0 +1,55 @@
+'use strict';
+
+// Flags: --expose-internals
+
+const common = require('../common');
+const stream = require('stream');
+const REPL = require('internal/repl');
+const assert = require('assert');
+const inspect = require('util').inspect;
+
+const tests = [{
+  env: {},
+  expected: { terminal: true, useColors: true }
+},
+{
+  env: { NODE_DISABLE_COLORS: '1' },
+  expected: { terminal: true, useColors: false }
+},
+{
+  env: { NODE_NO_READLINE: '1' },
+  expected: { terminal: false, useColors: false }
+},
+{
+  env: { TERM: 'dumb' },
+  expected: { terminal: true, useColors: false }
+},
+{
+  env: { NODE_NO_READLINE: '1', NODE_DISABLE_COLORS: '1' },
+  expected: { terminal: false, useColors: false }
+},
+{
+  env: { NODE_NO_READLINE: '0' },
+  expected: { terminal: true, useColors: true }
+}];
+
+function run(test) {
+  const env = test.env;
+  const expected = test.expected;
+  const opts = {
+    terminal: true,
+    input: new stream.Readable({ read() {} }),
+    output: new stream.Writable({ write() {} })
+  };
+
+  REPL.createInternalRepl(env, opts, function(err, repl) {
+    if (err) throw err;
+    assert.equal(expected.terminal, repl.terminal,
+                 'Expected ' + inspect(expected) + ' with ' + inspect(env));
+    assert.equal(expected.useColors, repl.useColors,
+                 'Expected ' + inspect(expected) + ' with ' + inspect(env));
+    repl.close();
+  });
+}
+
+tests.forEach(run);