Skip to content

Commit

Permalink
Make stat call on parent directory instead of first checking exists
Browse files Browse the repository at this point in the history
  • Loading branch information
RyanZim committed Jan 31, 2020
1 parent 07ca291 commit c12ae40
Showing 1 changed file with 32 additions and 29 deletions.
61 changes: 32 additions & 29 deletions lib/ensure/file.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
})
}
})
})
}
Expand All @@ -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, '')
Expand Down

0 comments on commit c12ae40

Please sign in to comment.