1
0
Fork 0

call mkdirP also when drive doesn't exist

pull/1423/head
Tushar Singh 2023-05-14 21:12:27 +05:30
parent ca990561d4
commit 0cf3629b9b
2 changed files with 15 additions and 17 deletions

View File

@ -867,17 +867,16 @@ describe('mkdirP', () => {
if (ioUtil.IS_WINDOWS) {
it('show error only if Windows drive does not exist', async () => {
let errMsg: string
const driveRoot = path.parse(getTestTemp()).root
// Assuming 'A:\' is not a common Windows drive lets us test for a non-existing drive
for (const testPath of [driveRoot, 'A:\\']) {
const root = path.parse(getTestTemp()).root
// Assuming A:\ isn't a common Windows drive letter lets us test for a non-existing drive
const testPaths = [root, 'A:\\']
for (const testPath of testPaths) {
if (await ioUtil.exists(testPath)) {
await io.mkdirP(testPath)
} else {
errMsg = `Drive '${testPath}' does not exist.`
await expect(io.mkdirP(testPath)).rejects.toHaveProperty(
'message',
errMsg
'code',
'ENOENT'
)
}
}

View File

@ -141,17 +141,16 @@ export async function rmRF(inputPath: string): Promise<void> {
*/
export async function mkdirP(fsPath: string): Promise<void> {
ok(fsPath, 'a path argument must be provided')
// mkdirP would throw EPERM error if `fsPath` is a Windows drive root dir, e.g. 'C:\'
// even when it exists. This aligns with node's fs.mkdir impl. However, mkdirP shouldn't
// throw errors if `fsPath` exists regardless of the underlying platform.
// In this case, we will only check if drive exists and throw an error if it doesn't.
if (ioUtil.IS_WINDOWS && path.parse(fsPath).root === fsPath) {
if (!(await ioUtil.exists(fsPath))) {
throw new Error(`Drive '${fsPath}' does not exist.`)
}
} else {
await ioUtil.mkdir(fsPath, {recursive: true})
// don't call mkdirP for root paths (e.g. C:\) on Windows. This leads to
// 'EPERM: operation not permitted' error when drive already exists.
if (
ioUtil.IS_WINDOWS &&
path.parse(fsPath).root === fsPath &&
(await ioUtil.exists(fsPath))
) {
return
}
await ioUtil.mkdir(fsPath, {recursive: true})
}
/**