From d4cd5ac40796d2ab8bd70ee43ccbc96d21daed10 Mon Sep 17 00:00:00 2001 From: Matt Harrison Date: Fri, 11 Sep 2015 15:47:41 +0100 Subject: [PATCH] readline: fix tab completion bug This fixes a problem where tab completion is empty when the input stream column size is undefined. As a solution we can force maxColumns to 1 in this scenario. PR-URL: https://github.com/nodejs/node/pull/2816 Fixes: https://github.com/nodejs/node/issues/2396 Reviewed-By: Roman Reiss --- lib/readline.js | 5 +++- test/parallel/test-readline-undefined-columns.js | 36 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-readline-undefined-columns.js diff --git a/lib/readline.js b/lib/readline.js index 6164bcc..0bdf5c1 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -390,7 +390,10 @@ Interface.prototype._tabComplete = function() { var width = completions.reduce(function(a, b) { return a.length > b.length ? a : b; }).length + 2; // 2 space padding - var maxColumns = Math.floor(self.columns / width) || 1; + var maxColumns = Math.floor(self.columns / width); + if (!maxColumns || maxColumns === Infinity) { + maxColumns = 1; + } var group = [], c; for (var i = 0, compLen = completions.length; i < compLen; i++) { c = completions[i]; diff --git a/test/parallel/test-readline-undefined-columns.js b/test/parallel/test-readline-undefined-columns.js new file mode 100644 index 0000000..f2baf92 --- /dev/null +++ b/test/parallel/test-readline-undefined-columns.js @@ -0,0 +1,36 @@ +'use strict'; + +const assert = require('assert'); +const PassThrough = require('stream').PassThrough; +const readline = require('readline'); + +// Checks that tab completion still works +// when output column size is undefined + +const iStream = new PassThrough(); +const oStream = new PassThrough(); + +const rli = readline.createInterface({ + terminal: true, + input: iStream, + output: oStream, + completer: function(line, cb) { + cb(null, [['process.stdout', 'process.stdin', 'process.stderr'], line]); + } +}); + +var output = ''; + +oStream.on('data', function(data) { + output += data; +}); + +oStream.on('end', function() { + const expect = 'process.stdout\r\n' + + 'process.stdin\r\n' + + 'process.stderr'; + assert(new RegExp(expect).test(output)); +}); + +iStream.write('process.std\t'); +oStream.end(); -- 2.7.4