in node/task.ts [643:703]
export function mkdirP(p: string): void {
if (!p) {
throw new Error(loc('LIB_ParameterIsRequired', 'p'));
}
// build a stack of directories to create
let stack: string[] = [];
let testDir: string = p;
while (true) {
// validate the loop is not out of control
if (stack.length >= (process.env['TASKLIB_TEST_MKDIRP_FAILSAFE'] || 1000)) {
// let the framework throw
debug('loop is out of control');
fs.mkdirSync(p);
return;
}
debug(`testing directory '${testDir}'`);
let stats: fs.Stats;
try {
stats = fs.statSync(testDir);
} catch (err) {
if (err.code == 'ENOENT') {
// validate the directory is not the drive root
let parentDir = path.dirname(testDir);
if (testDir == parentDir) {
throw new Error(loc('LIB_MkdirFailedInvalidDriveRoot', p, testDir)); // Unable to create directory '{p}'. Root directory does not exist: '{testDir}'
}
// push the dir and test the parent
stack.push(testDir);
testDir = parentDir;
continue;
}
else if (err.code == 'UNKNOWN') {
throw new Error(loc('LIB_MkdirFailedInvalidShare', p, testDir)) // Unable to create directory '{p}'. Unable to verify the directory exists: '{testDir}'. If directory is a file share, please verify the share name is correct, the share is online, and the current process has permission to access the share.
}
else {
throw err;
}
}
if (!stats.isDirectory()) {
throw new Error(loc('LIB_MkdirFailedFileExists', p, testDir)); // Unable to create directory '{p}'. Conflicting file exists: '{testDir}'
}
// testDir exists
break;
}
// create each directory
while (stack.length) {
let dir = stack.pop()!; // non-null because `stack.length` was truthy
debug(`mkdir '${dir}'`);
try {
fs.mkdirSync(dir);
} catch (err) {
throw new Error(loc('LIB_MkdirFailed', p, err.message)); // Unable to create directory '{p}'. {err.message}
}
}
}