repl: support hidden history file on Windows
On Windows when REPL history file has the hidden attribute node will fail when trying to open it in 'w' mode. This changes the mode to 'r+'. The file is guaranteed to exists because of earlier open call with 'a+'. Fixes: https://github.com/nodejs/node/issues/5261 PR-URL: https://github.com/nodejs/node/pull/12207 Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
f3f9dd73aa
commit
bb041ea5a0
@ -164,10 +164,19 @@ function setupHistory(repl, historyPath, oldHistoryPath, ready) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fs.open(historyPath, 'w', onhandle);
|
fs.open(historyPath, 'r+', onhandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onhandle(err, hnd) {
|
function onhandle(err, hnd) {
|
||||||
|
if (err) {
|
||||||
|
return ready(err);
|
||||||
|
}
|
||||||
|
fs.ftruncate(hnd, 0, (err) => {
|
||||||
|
return onftruncate(err, hnd);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function onftruncate(err, hnd) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return ready(err);
|
return ready(err);
|
||||||
}
|
}
|
||||||
|
0
test/fixtures/.empty-hidden-repl-history-file
vendored
Normal file
0
test/fixtures/.empty-hidden-repl-history-file
vendored
Normal file
@ -76,6 +76,8 @@ const oldHistoryPath = path.join(fixtures, 'old-repl-history-file.json');
|
|||||||
const enoentHistoryPath = path.join(fixtures, 'enoent-repl-history-file.json');
|
const enoentHistoryPath = path.join(fixtures, 'enoent-repl-history-file.json');
|
||||||
const emptyHistoryPath = path.join(fixtures, '.empty-repl-history-file');
|
const emptyHistoryPath = path.join(fixtures, '.empty-repl-history-file');
|
||||||
const defaultHistoryPath = path.join(common.tmpDir, '.node_repl_history');
|
const defaultHistoryPath = path.join(common.tmpDir, '.node_repl_history');
|
||||||
|
const emptyHiddenHistoryPath = path.join(fixtures,
|
||||||
|
'.empty-hidden-repl-history-file');
|
||||||
|
|
||||||
const tests = [
|
const tests = [
|
||||||
{
|
{
|
||||||
@ -163,6 +165,19 @@ const tests = [
|
|||||||
test: [UP],
|
test: [UP],
|
||||||
expected: [prompt, replFailedRead, prompt, replDisabled, prompt]
|
expected: [prompt, replFailedRead, prompt, replDisabled, prompt]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
before: function before() {
|
||||||
|
if (common.isWindows) {
|
||||||
|
const execSync = require('child_process').execSync;
|
||||||
|
execSync(`ATTRIB +H "${emptyHiddenHistoryPath}"`, (err) => {
|
||||||
|
assert.ifError(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
env: { NODE_REPL_HISTORY: emptyHiddenHistoryPath },
|
||||||
|
test: [UP],
|
||||||
|
expected: [prompt]
|
||||||
|
},
|
||||||
{ // Make sure this is always the last test, since we change os.homedir()
|
{ // Make sure this is always the last test, since we change os.homedir()
|
||||||
before: function before() {
|
before: function before() {
|
||||||
// Mock os.homedir() failure
|
// Mock os.homedir() failure
|
||||||
|
Loading…
x
Reference in New Issue
Block a user