repl: don't use tty control codes when $TERM is set to "dumb"

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
This commit is contained in:
Salman Aljammaz 2015-09-05 18:03:46 +03:00 committed by Roman Reiss
parent 79d2c4e1bf
commit ccea33df62
2 changed files with 59 additions and 1 deletions

View File

@ -34,7 +34,10 @@ function createRepl(env, opts, cb) {
if (parseInt(env.NODE_NO_READLINE)) { if (parseInt(env.NODE_NO_READLINE)) {
opts.terminal = false; 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; opts.useColors = false;
} }

View File

@ -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);