summaryrefslogtreecommitdiff
path: root/lib/internal/repl.js
diff options
context:
space:
mode:
authorRuben Bridgewater <ruben@bridgewater.de>2017-06-17 02:51:23 +0200
committerTobias Nießen <tniessen@tnie.de>2017-06-30 19:21:23 +0200
commite6b69b9418be8e94d81c1f74055d1772507f27ab (patch)
tree7b336ed04048b8266ae94ec755264acf1e62006c /lib/internal/repl.js
parent027960205f92694a7b9e6507fe18d20896681db3 (diff)
downloadandroid-node-v8-e6b69b9418be8e94d81c1f74055d1772507f27ab.tar.gz
android-node-v8-e6b69b9418be8e94d81c1f74055d1772507f27ab.tar.bz2
android-node-v8-e6b69b9418be8e94d81c1f74055d1772507f27ab.zip
repl: fix old history error handling
PR-URL: https://github.com/nodejs/node/pull/13733 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de>
Diffstat (limited to 'lib/internal/repl.js')
-rw-r--r--lib/internal/repl.js67
1 files changed, 39 insertions, 28 deletions
diff --git a/lib/internal/repl.js b/lib/internal/repl.js
index ee2a1544de..1564dfd370 100644
--- a/lib/internal/repl.js
+++ b/lib/internal/repl.js
@@ -7,8 +7,6 @@ const fs = require('fs');
const os = require('os');
const util = require('util');
const debug = util.debuglog('repl');
-const errors = require('internal/errors');
-
module.exports = Object.create(REPL);
module.exports.createInternalRepl = createRepl;
@@ -16,6 +14,11 @@ module.exports.createInternalRepl = createRepl;
// The debounce is to guard against code pasted into the REPL.
const kDebounceHistoryMS = 15;
+function _writeToOutput(repl, message) {
+ repl._writeToOutput(message);
+ repl._refreshLine();
+}
+
function createRepl(env, opts, cb) {
if (typeof opts === 'function') {
cb = opts;
@@ -81,9 +84,8 @@ function setupHistory(repl, historyPath, oldHistoryPath, ready) {
try {
historyPath = path.join(os.homedir(), '.node_repl_history');
} catch (err) {
- repl._writeToOutput('\nError: Could not get the home directory.\n' +
- 'REPL session history will not be persisted.\n');
- repl._refreshLine();
+ _writeToOutput(repl, '\nError: Could not get the home directory.\n' +
+ 'REPL session history will not be persisted.\n');
debug(err.stack);
repl._historyPrev = _replHistoryMessage;
@@ -104,9 +106,8 @@ function setupHistory(repl, historyPath, oldHistoryPath, ready) {
if (err) {
// Cannot open history file.
// Don't crash, just don't persist history.
- repl._writeToOutput('\nError: Could not open history file.\n' +
- 'REPL session history will not be persisted.\n');
- repl._refreshLine();
+ _writeToOutput(repl, '\nError: Could not open history file.\n' +
+ 'REPL session history will not be persisted.\n');
debug(err.stack);
repl._historyPrev = _replHistoryMessage;
@@ -133,18 +134,13 @@ function setupHistory(repl, historyPath, oldHistoryPath, ready) {
} else if (oldHistoryPath === historyPath) {
// If pre-v3.0, the user had set NODE_REPL_HISTORY_FILE to
// ~/.node_repl_history, warn the user about it and proceed.
- repl._writeToOutput(
- '\nThe old repl history file has the same name and location as ' +
+ _writeToOutput(
+ repl,
+ '\nThe old repl history file has the same name and location as ' +
`the new one i.e., ${historyPath} and is empty.\nUsing it as is.\n`);
- repl._refreshLine();
} else if (oldHistoryPath) {
- // Grab data from the older pre-v3.0 JSON NODE_REPL_HISTORY_FILE format.
- repl._writeToOutput(
- '\nConverting old JSON repl history to line-separated history.\n' +
- `The new repl history file can be found at ${historyPath}.\n`);
- repl._refreshLine();
-
+ let threw = false;
try {
// Pre-v3.0, repl history was stored as JSON.
// Try and convert it to line separated history.
@@ -153,16 +149,31 @@ function setupHistory(repl, historyPath, oldHistoryPath, ready) {
// Only attempt to use the history if there was any.
if (oldReplJSONHistory) repl.history = JSON.parse(oldReplJSONHistory);
- if (!Array.isArray(repl.history)) {
- throw new errors.TypeError('ERR_INVALID_ARG_TYPE',
- typeof repl.history, 'Array');
+ if (Array.isArray(repl.history)) {
+ repl.history = repl.history.slice(0, repl.historySize);
+ } else {
+ threw = true;
+ _writeToOutput(
+ repl,
+ '\nError: The old history file data has to be an Array.\n' +
+ 'REPL session history will not be persisted.\n');
}
- repl.history = repl.history.slice(0, repl.historySize);
} catch (err) {
- if (err.code !== 'ENOENT') {
- return ready(
- new errors.Error('ERR_PARSE_HISTORY_DATA', oldHistoryPath));
- }
+ // Cannot open or parse history file.
+ // Don't crash, just don't persist history.
+ threw = true;
+ const type = err instanceof SyntaxError ? 'parse' : 'open';
+ _writeToOutput(repl, `\nError: Could not ${type} old history file.\n` +
+ 'REPL session history will not be persisted.\n');
+ }
+ if (!threw) {
+ // Grab data from the older pre-v3.0 JSON NODE_REPL_HISTORY_FILE format.
+ _writeToOutput(
+ repl,
+ '\nConverted old JSON repl history to line-separated history.\n' +
+ `The new repl history file can be found at ${historyPath}.\n`);
+ } else {
+ repl.history = [];
}
}
@@ -225,12 +236,12 @@ function setupHistory(repl, historyPath, oldHistoryPath, ready) {
function _replHistoryMessage() {
if (this.history.length === 0) {
- this._writeToOutput(
- '\nPersistent history support disabled. ' +
+ _writeToOutput(
+ this,
+ '\nPersistent history support disabled. ' +
'Set the NODE_REPL_HISTORY environment\nvariable to ' +
'a valid, user-writable path to enable.\n'
);
- this._refreshLine();
}
this._historyPrev = Interface.prototype._historyPrev;
return this._historyPrev();