From 0303a2552e21bac4a8952ba5e1f17a2692f2f544 Mon Sep 17 00:00:00 2001 From: surya panikkal Date: Fri, 22 Apr 2016 18:58:40 -0400 Subject: [PATCH] readline: allow history to be disabled 1. The `historySize` to default to `30` only if `undefined`. 2. If `historySize` is set to 0, then disable caching the line. 3. Added unit tests. 4. Updated documentation. Fixes: https://github.com/nodejs/node/issues/6336 PR-URL: https://github.com/nodejs/node/pull/6352 Reviewed-By: Anna Henningsen Reviewed-By: Colin Ihrig --- doc/api/readline.md | 3 ++- lib/readline.js | 8 +++++++- test/parallel/test-readline-interface.js | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/doc/api/readline.md b/doc/api/readline.md index db543d2306..f939368122 100644 --- a/doc/api/readline.md +++ b/doc/api/readline.md @@ -300,7 +300,8 @@ the following values: treated like a TTY, and have ANSI/VT100 escape codes written to it. Defaults to checking `isTTY` on the `output` stream upon instantiation. - - `historySize` - maximum number of history lines retained. Defaults to `30`. + - `historySize` - maximum number of history lines retained. To disable the + history set this value to `0`. Defaults to `30`. The `completer` function is given the current line entered by the user, and is supposed to return an Array with 2 entries: diff --git a/lib/readline.js b/lib/readline.js index 3948d99053..680ffbf2cd 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -53,12 +53,15 @@ function Interface(input, output, completer, terminal) { historySize = input.historySize; input = input.input; } - historySize = historySize || kHistorySize; if (completer && typeof completer !== 'function') { throw new TypeError('Argument "completer" must be a function'); } + if (historySize === undefined) { + historySize = kHistorySize; + } + if (typeof historySize !== 'number' || isNaN(historySize) || historySize < 0) { @@ -228,6 +231,9 @@ Interface.prototype._writeToOutput = function _writeToOutput(stringToWrite) { Interface.prototype._addHistory = function() { if (this.line.length === 0) return ''; + // if the history is disabled then return the line + if (this.historySize === 0) return this.line; + if (this.history.length === 0 || this.history[0] !== this.line) { this.history.unshift(this.line); diff --git a/test/parallel/test-readline-interface.js b/test/parallel/test-readline-interface.js index 02f6dc980a..ab0c6d8824 100644 --- a/test/parallel/test-readline-interface.js +++ b/test/parallel/test-readline-interface.js @@ -27,6 +27,25 @@ function isWarned(emitter) { var rli; var called; + // disable history + fi = new FakeInput(); + rli = new readline.Interface({ input: fi, output: fi, terminal: terminal, + historySize: 0 }); + assert.strictEqual(rli.historySize, 0); + + fi.emit('data', 'asdf\n'); + assert.deepStrictEqual(rli.history, terminal ? [] : undefined); + rli.close(); + + // default history size 30 + fi = new FakeInput(); + rli = new readline.Interface({ input: fi, output: fi, terminal: terminal}); + assert.strictEqual(rli.historySize, 30); + + fi.emit('data', 'asdf\n'); + assert.deepStrictEqual(rli.history, terminal ? ['asdf'] : undefined); + rli.close(); + // sending a full line fi = new FakeInput(); rli = new readline.Interface({ input: fi, output: fi, terminal: terminal });