From 57126a7973442230c64147023e5130f7cecf9d8d Mon Sep 17 00:00:00 2001 From: Codinget Date: Sun, 10 Jan 2021 22:19:10 +0100 Subject: [PATCH] fixed mkdirs sometimes failing due to race condition when multiprocess builds are running --- moonbuild/_fs.moon | 12 +++++++++--- out/moonbuild.lua | 25 +++++++++++++++++++------ 2 files changed, 28 insertions(+), 9 deletions(-) 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 = { }