1
0
Fork 0

mkdirP: don't throw errors if windows drive exists

pull/1423/head
Tushar Singh 2023-05-14 12:00:22 +05:30
parent 457303960f
commit ca990561d4
2 changed files with 30 additions and 1 deletions

View File

@ -864,6 +864,25 @@ describe('mkdirP', () => {
(await fs.lstat(path.join(realDirPath, 'sub_dir'))).isDirectory()
).toBe(true)
})
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:\\']) {
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
)
}
}
})
}
})
describe('which', () => {

View File

@ -141,7 +141,17 @@ export async function rmRF(inputPath: string): Promise<void> {
*/
export async function mkdirP(fsPath: string): Promise<void> {
ok(fsPath, 'a path argument must be provided')
await ioUtil.mkdir(fsPath, {recursive: true})
// 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})
}
}
/**