From c12ae40ea4b58283a311498d48a0949da3c54e7b Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Fri, 31 Jan 2020 13:55:22 -0500 Subject: [PATCH] Make stat call on parent directory instead of first checking exists --- lib/ensure/file.js | 61 ++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/lib/ensure/file.js b/lib/ensure/file.js index 49b17c94..b8b2495c 100644 --- a/lib/ensure/file.js +++ b/lib/ensure/file.js @@ -4,38 +4,38 @@ const u = require('universalify').fromCallback const path = require('path') const fs = require('graceful-fs') const mkdir = require('../mkdirs') -const pathExists = require('../path-exists').pathExists function createFile (file, callback) { function makeFile () { - const dir = path.dirname(file) - - fs.stat(dir, (err, stats) => { + fs.writeFile(file, '', err => { if (err) return callback(err) - if (!stats.isDirectory()) { - // This is just to cause an internal ENOTDIR error to be thrown - fs.readdir(dir, err => { - if (err) return callback(err) - }) - } else { - fs.writeFile(file, '', err => { - if (err) return callback(err) - callback() - }) - } + callback() }) } fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err if (!err && stats.isFile()) return callback() const dir = path.dirname(file) - pathExists(dir, (err, dirExists) => { - if (err) return callback(err) - if (dirExists) return makeFile() - mkdir.mkdirs(dir, err => { - if (err) return callback(err) - makeFile() - }) + fs.stat(dir, (err, stats) => { + if (err) { + // if the directory doesn't exist, make it + if (err.code === 'ENOENT') { + return mkdir.mkdirs(dir, err => { + if (err) return callback(err) + makeFile() + }) + } + return callback(err) + } + + if (stats.isDirectory()) makeFile() + else { + // parent is not a directory + // This is just to cause an internal ENOTDIR error to be thrown + fs.readdir(dir, err => { + if (err) return callback(err) + }) + } }) }) } @@ -48,13 +48,16 @@ function createFileSync (file) { if (stats && stats.isFile()) return const dir = path.dirname(file) - if (!fs.existsSync(dir)) { - mkdir.mkdirsSync(dir) - } - - if (!fs.statSync(dir).isDirectory()) { - // This is just to cause an internal ENOTDIR error to be thrown - fs.readdirSync(dir) + try { + if (!fs.statSync(dir).isDirectory()) { + // parent is not a directory + // This is just to cause an internal ENOTDIR error to be thrown + fs.readdirSync(dir) + } + } catch (err) { + // If the stat call above failed because the directory doesn't exist, create it + if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir) + else throw err } fs.writeFileSync(file, '')