diff --git a/moonbuild/_fs.moon b/moonbuild/_fs.moon index 386508d..f494d11 100644 --- a/moonbuild/_fs.moon +++ b/moonbuild/_fs.moon @@ -166,10 +166,16 @@ mkdir = (dir) -> clearentry parent dir mkdirs = (dir) -> - return if isdir dir - error "Can't mkdirs #{dir}: file exists" if exists dir + if attr = attributes normalizepath dir + return if attr.mode == 'directory' + error "Can't mkdirs #{dir}: file exists" mkdirs parent dir - mkdir dir + unless pcall -> actualmkdir dir + clearentry parent dir + clearentry dir + error "Failed to mkdirs #{dir}: last mkdir failed" unless isdir dir + clearentry parent dir + clearentry dir -- from the backend fs = {k, withcache fn for k, fn in pairs fs} diff --git a/out/moonbuild.lua b/out/moonbuild.lua index 483bc99..e9bd49f 100644 --- a/out/moonbuild.lua +++ b/out/moonbuild.lua @@ -973,14 +973,27 @@ mkdir = function(dir) end local mkdirs mkdirs = function(dir) - if isdir(dir) then - return - end - if exists(dir) then - error("Can't mkdirs " .. tostring(dir) .. ": file exists") + do + local attr = attributes(normalizepath(dir)) + if attr then + if attr.mode == 'directory' then + return + end + error("Can't mkdirs " .. tostring(dir) .. ": file exists") + end end mkdirs(parent(dir)) - return mkdir(dir) + if not (pcall(function() + return actualmkdir(dir) + end)) then + clearentry(parent(dir)) + clearentry(dir) + if not (isdir(dir)) then + error("Failed to mkdirs " .. tostring(dir) .. ": last mkdir failed") + end + end + clearentry(parent(dir)) + return clearentry(dir) end do local _tbl_0 = { }