diff --git a/lua/lazy/async.lua b/lua/lazy/async.lua index 8a0a798..9f39a5c 100644 --- a/lua/lazy/async.lua +++ b/lua/lazy/async.lua @@ -37,6 +37,7 @@ function Async:sleep(ms) vim.defer_fn(function() self.sleeping = false end, ms) + coroutine.yield() end function Async:suspend() diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 7c568cb..03becf2 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -197,7 +197,21 @@ function M.exec(cmd, opts) lines = _lines end, }) - vim.fn.jobwait({ job }) + + if job <= 0 then + error("Failed to start job: " .. vim.inspect(cmd)) + end + + local Async = require("lazy.async") + local async = Async.current + if async then + while vim.fn.jobwait({ job }, 0)[1] == -1 do + async:sleep(10) + end + else + vim.fn.jobwait({ job }) + end + return lines end diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index a142cf4..989f362 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -217,16 +217,13 @@ function Task:spawn(cmd, opts) self._running:suspend() local running = true - local ret = true + local ret = { ok = true, output = "" } ---@param output string function opts.on_exit(ok, output) if not headless then self:log(vim.trim(output), ok and vim.log.levels.DEBUG or vim.log.levels.ERROR) end - if on_exit then - pcall(on_exit, ok, output) - end - ret = ok + ret = { ok = ok, output = output } running = false self._running:resume() end @@ -241,7 +238,11 @@ function Task:spawn(cmd, opts) Process.spawn(cmd, opts) coroutine.yield() assert(not running, "process still running?") - return ret + if on_exit then + pcall(on_exit, ret.ok, ret.output) + end + coroutine.yield() + return ret.ok end function Task:prefix()