diff options
| author | William Boman <william@redwill.se> | 2023-04-02 00:15:48 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-02 00:15:48 +0200 |
| commit | 2e35781f5ee020fac6182b4494fdf2f12f3a9bbf (patch) | |
| tree | 007649bea851c2b65d04fc685fb7a7ff4b16ff30 /lua/mason-registry | |
| parent | fix(ui): remove new lines from error (#1167) (diff) | |
| download | mason-2e35781f5ee020fac6182b4494fdf2f12f3a9bbf.tar mason-2e35781f5ee020fac6182b4494fdf2f12f3a9bbf.tar.gz mason-2e35781f5ee020fac6182b4494fdf2f12f3a9bbf.tar.bz2 mason-2e35781f5ee020fac6182b4494fdf2f12f3a9bbf.tar.lz mason-2e35781f5ee020fac6182b4494fdf2f12f3a9bbf.tar.xz mason-2e35781f5ee020fac6182b4494fdf2f12f3a9bbf.tar.zst mason-2e35781f5ee020fac6182b4494fdf2f12f3a9bbf.zip | |
fix(registry): use oneshot channel for updating registry (#1168)
Diffstat (limited to 'lua/mason-registry')
| -rw-r--r-- | lua/mason-registry/init.lua | 21 | ||||
| -rw-r--r-- | lua/mason-registry/installer.lua | 38 |
2 files changed, 40 insertions, 19 deletions
diff --git a/lua/mason-registry/init.lua b/lua/mason-registry/init.lua index 67a63976..93472ef3 100644 --- a/lua/mason-registry/init.lua +++ b/lua/mason-registry/init.lua @@ -150,25 +150,8 @@ end ---@param callback? fun(success: boolean, updated_registries: RegistrySource[]) function M.update(callback) local a = require "mason-core.async" - local Result = require "mason-core.result" - return a.run(function() - return Result.try(function(try) - local updated_sources = {} - for source in sources.iter { include_uninstalled = true } do - source:get_installer():if_present(function(installer) - try(installer():map_err(function(err) - return ("%s failed to install: %s"):format(source, err) - end)) - table.insert(updated_sources, source) - end) - end - return updated_sources - end):on_success(function(updated_sources) - if #updated_sources > 0 then - M:emit("update", updated_sources) - end - end) - end, function(success, result) + + return a.run(require("mason-registry.installer").run, function(success, result) if not callback then return end diff --git a/lua/mason-registry/installer.lua b/lua/mason-registry/installer.lua new file mode 100644 index 00000000..31fe0d85 --- /dev/null +++ b/lua/mason-registry/installer.lua @@ -0,0 +1,38 @@ +local a = require "mason-core.async" +local OneShotChannel = require("mason-core.async.control").OneShotChannel +local Result = require "mason-core.result" +local sources = require "mason-registry.sources" + +local M = {} + +---@type OneShotChannel? +local update_channel + +---@async +function M.run() + if not update_channel or update_channel:is_closed() then + update_channel = OneShotChannel.new() + a.run(function() + update_channel:send(Result.try(function(try) + local updated_sources = {} + for source in sources.iter { include_uninstalled = true } do + source:get_installer():if_present(function(installer) + try(installer():map_err(function(err) + return ("%s failed to install: %s"):format(source, err) + end)) + table.insert(updated_sources, source) + end) + end + return updated_sources + end):on_success(function(updated_sources) + if #updated_sources > 0 then + require("mason-registry"):emit("update", updated_sources) + end + end)) + end, function() end) + end + + return update_channel:receive() +end + +return M |
