Skip to content

Commit

Permalink
repl: don't use tty control codes when $TERM is set to "dumb"
Browse files Browse the repository at this point in the history
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: nodejs/node-v0.x-archive#5344
Related: nodejs/node-v0.x-archive#25506
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: Roman Reiss <me@silverwind.io>
PR-URL: #2712
  • Loading branch information
saljam authored and rvagg committed Sep 22, 2015
1 parent f68fed2 commit 9760e04
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 1 deletion.
5 changes: 4 additions & 1 deletion lib/internal/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
55 changes: 55 additions & 0 deletions test/parallel/test-repl-envvars.js
Original file line number Diff line number Diff line change
@@ -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);

0 comments on commit 9760e04

Please sign in to comment.