aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-core/installer
diff options
context:
space:
mode:
Diffstat (limited to 'lua/mason-core/installer')
-rw-r--r--lua/mason-core/installer/InstallHandle.lua24
-rw-r--r--lua/mason-core/installer/InstallRunner.lua6
-rw-r--r--lua/mason-core/installer/compiler/schemas.lua4
-rw-r--r--lua/mason-core/installer/compiler/util.lua10
-rw-r--r--lua/mason-core/installer/context/InstallContextSpawn.lua2
-rw-r--r--lua/mason-core/installer/context/init.lua4
-rw-r--r--lua/mason-core/installer/managers/cargo.lua2
-rw-r--r--lua/mason-core/installer/managers/composer.lua2
-rw-r--r--lua/mason-core/installer/managers/gem.lua28
-rw-r--r--lua/mason-core/installer/managers/golang.lua2
-rw-r--r--lua/mason-core/installer/managers/luarocks.lua2
-rw-r--r--lua/mason-core/installer/managers/npm.lua6
-rw-r--r--lua/mason-core/installer/managers/nuget.lua2
-rw-r--r--lua/mason-core/installer/managers/opam.lua2
-rw-r--r--lua/mason-core/installer/managers/pypi.lua10
-rw-r--r--lua/mason-core/installer/managers/std.lua6
16 files changed, 45 insertions, 67 deletions
diff --git a/lua/mason-core/installer/InstallHandle.lua b/lua/mason-core/installer/InstallHandle.lua
index f5a42c53..22c654a3 100644
--- a/lua/mason-core/installer/InstallHandle.lua
+++ b/lua/mason-core/installer/InstallHandle.lua
@@ -45,7 +45,7 @@ end
---@class InstallHandle : EventEmitter
---@field package AbstractPackage
---@field state InstallHandleState
----@field stdio { buffers: { stdout: string[], stderr: string[] }, sink: StdioSink }
+---@field stdio_sink BufferedSink
---@field is_terminated boolean
---@field location InstallLocation
---@field private spawn_handles InstallHandleSpawnHandle[]
@@ -53,33 +53,17 @@ local InstallHandle = {}
InstallHandle.__index = InstallHandle
setmetatable(InstallHandle, { __index = EventEmitter })
----@param handle InstallHandle
-local function new_sink(handle)
- local stdout, stderr = {}, {}
- return {
- buffers = { stdout = stdout, stderr = stderr },
- sink = {
- stdout = function(chunk)
- stdout[#stdout + 1] = chunk
- handle:emit("stdout", chunk)
- end,
- stderr = function(chunk)
- stderr[#stderr + 1] = chunk
- handle:emit("stderr", chunk)
- end,
- },
- }
-end
-
---@param pkg AbstractPackage
---@param location InstallLocation
function InstallHandle:new(pkg, location)
---@type InstallHandle
local instance = EventEmitter.new(self)
+ local sink = process.BufferedSink:new()
+ sink:connect_events(instance)
instance.state = "IDLE"
instance.package = pkg
instance.spawn_handles = {}
- instance.stdio = new_sink(instance)
+ instance.stdio_sink = sink
instance.is_terminated = false
instance.location = location
return instance
diff --git a/lua/mason-core/installer/InstallRunner.lua b/lua/mason-core/installer/InstallRunner.lua
index fa2b3fcf..342dc443 100644
--- a/lua/mason-core/installer/InstallRunner.lua
+++ b/lua/mason-core/installer/InstallRunner.lua
@@ -55,13 +55,13 @@ function InstallRunner:execute(opts, callback)
---@async
local function finalize_logs(success, result)
if not success then
- context.stdio_sink.stderr(tostring(result))
- context.stdio_sink.stderr "\n"
+ context.stdio_sink:stderr(tostring(result))
+ context.stdio_sink:stderr "\n"
end
if opts.debug then
context.fs:write_file("mason-debug.log", table.concat(tailed_output, ""))
- context.stdio_sink.stdout(("[debug] Installation directory retained at %q.\n"):format(context.cwd:get()))
+ context.stdio_sink:stdout(("[debug] Installation directory retained at %q.\n"):format(context.cwd:get()))
end
end
diff --git a/lua/mason-core/installer/compiler/schemas.lua b/lua/mason-core/installer/compiler/schemas.lua
index 5e578dbd..889a2ad9 100644
--- a/lua/mason-core/installer/compiler/schemas.lua
+++ b/lua/mason-core/installer/compiler/schemas.lua
@@ -20,7 +20,7 @@ local function download_lsp_schema(ctx, url)
if is_vscode_schema then
local url = unpack(_.match("^vscode:(.+)$", url))
- ctx.stdio_sink.stdout(("Downloading LSP configuration schema from %q…\n"):format(url))
+ ctx.stdio_sink:stdout(("Downloading LSP configuration schema from %q…\n"):format(url))
local json = try(fetch(url))
---@type { contributes?: { configuration?: table } }
@@ -34,7 +34,7 @@ local function download_lsp_schema(ctx, url)
return Result.failure "Unable to find LSP entry in VSCode schema."
end
else
- ctx.stdio_sink.stdout(("Downloading LSP configuration schema from %q…\n"):format(url))
+ ctx.stdio_sink:stdout(("Downloading LSP configuration schema from %q…\n"):format(url))
try(std.download_file(url, out_file))
ctx.links.share[share_file] = out_file
end
diff --git a/lua/mason-core/installer/compiler/util.lua b/lua/mason-core/installer/compiler/util.lua
index b3735c9c..c244cca8 100644
--- a/lua/mason-core/installer/compiler/util.lua
+++ b/lua/mason-core/installer/compiler/util.lua
@@ -44,7 +44,7 @@ function M.ensure_valid_version(versions_thunk)
local version = ctx.opts.version
if version and not ctx.opts.force then
- ctx.stdio_sink.stdout "Fetching available versions…\n"
+ ctx.stdio_sink:stdout "Fetching available versions…\n"
local all_versions = versions_thunk()
if all_versions:is_failure() then
log.warn("Failed to fetch versions for package", ctx.package)
@@ -54,10 +54,10 @@ function M.ensure_valid_version(versions_thunk)
all_versions = all_versions:get_or_else {}
if not _.any(_.equals(version), all_versions) then
- ctx.stdio_sink.stderr(("Tried to install invalid version %q. Available versions:\n"):format(version))
- ctx.stdio_sink.stderr(_.compose(_.join "\n", _.map(_.join ", "), _.split_every(15))(all_versions))
- ctx.stdio_sink.stderr "\n\n"
- ctx.stdio_sink.stderr(
+ ctx.stdio_sink:stderr(("Tried to install invalid version %q. Available versions:\n"):format(version))
+ ctx.stdio_sink:stderr(_.compose(_.join "\n", _.map(_.join ", "), _.split_every(15))(all_versions))
+ ctx.stdio_sink:stderr "\n\n"
+ ctx.stdio_sink:stderr(
("Run with --force flag to bypass version validation:\n :MasonInstall --force %s@%s\n\n"):format(
ctx.package.name,
version
diff --git a/lua/mason-core/installer/context/InstallContextSpawn.lua b/lua/mason-core/installer/context/InstallContextSpawn.lua
index f2ce8df2..29e62101 100644
--- a/lua/mason-core/installer/context/InstallContextSpawn.lua
+++ b/lua/mason-core/installer/context/InstallContextSpawn.lua
@@ -25,7 +25,7 @@ function InstallContextSpawn:__index(cmd)
---@param args JobSpawnOpts
return function(args)
args.cwd = args.cwd or self.cwd:get()
- args.stdio_sink = args.stdio_sink or self.handle.stdio.sink
+ args.stdio_sink = args.stdio_sink or self.handle.stdio_sink
local on_spawn = args.on_spawn
local captured_handle
args.on_spawn = function(handle, stdio, pid, ...)
diff --git a/lua/mason-core/installer/context/init.lua b/lua/mason-core/installer/context/init.lua
index 6f0d4c57..44490782 100644
--- a/lua/mason-core/installer/context/init.lua
+++ b/lua/mason-core/installer/context/init.lua
@@ -2,9 +2,9 @@ local InstallContextCwd = require "mason-core.installer.context.InstallContextCw
local InstallContextFs = require "mason-core.installer.context.InstallContextFs"
local InstallContextSpawn = require "mason-core.installer.context.InstallContextSpawn"
local Result = require "mason-core.result"
-local fetch = require "mason-core.fetch"
local _ = require "mason-core.functional"
local a = require "mason-core.async"
+local fetch = require "mason-core.fetch"
local fs = require "mason-core.fs"
local log = require "mason-core.log"
local path = require "mason-core.path"
@@ -39,7 +39,7 @@ function InstallContext:new(handle, opts)
package = handle.package, -- for convenience
fs = fs,
receipt = receipt.InstallReceiptBuilder:new(),
- stdio_sink = handle.stdio.sink,
+ stdio_sink = handle.stdio_sink,
links = {
bin = {},
share = {},
diff --git a/lua/mason-core/installer/managers/cargo.lua b/lua/mason-core/installer/managers/cargo.lua
index 8a3c35cf..22ec9ed6 100644
--- a/lua/mason-core/installer/managers/cargo.lua
+++ b/lua/mason-core/installer/managers/cargo.lua
@@ -15,7 +15,7 @@ function M.install(crate, version, opts)
opts = opts or {}
log.fmt_debug("cargo: install %s %s %s", crate, version, opts)
local ctx = installer.context()
- ctx.stdio_sink.stdout(("Installing crate %s@%s…\n"):format(crate, version))
+ ctx.stdio_sink:stdout(("Installing crate %s@%s…\n"):format(crate, version))
return ctx.spawn.cargo {
"install",
"--root",
diff --git a/lua/mason-core/installer/managers/composer.lua b/lua/mason-core/installer/managers/composer.lua
index a4a94270..3afd3ff8 100644
--- a/lua/mason-core/installer/managers/composer.lua
+++ b/lua/mason-core/installer/managers/composer.lua
@@ -14,7 +14,7 @@ local M = {}
function M.install(package, version)
log.fmt_debug("composer: install %s %s", package, version)
local ctx = installer.context()
- ctx.stdio_sink.stdout(("Installing composer package %s@%s…\n"):format(package, version))
+ ctx.stdio_sink:stdout(("Installing composer package %s@%s…\n"):format(package, version))
return Result.try(function(try)
try(ctx.spawn.composer {
"init",
diff --git a/lua/mason-core/installer/managers/gem.lua b/lua/mason-core/installer/managers/gem.lua
index e8723d7e..30bff29d 100644
--- a/lua/mason-core/installer/managers/gem.lua
+++ b/lua/mason-core/installer/managers/gem.lua
@@ -15,7 +15,7 @@ function M.install(pkg, version, opts)
opts = opts or {}
log.fmt_debug("gem: install %s %s %s", pkg, version, opts)
local ctx = installer.context()
- ctx.stdio_sink.stdout(("Installing gem %s@%s…\n"):format(pkg, version))
+ ctx.stdio_sink:stdout(("Installing gem %s@%s…\n"):format(pkg, version))
return ctx.spawn.gem {
"install",
"--no-user-install",
@@ -50,22 +50,16 @@ function M.create_bin_wrapper(bin)
return Result.failure(("Cannot link Gem executable %q because it doesn't exist."):format(bin))
end
- return Result.pcall(
- ctx.write_shell_exec_wrapper,
- ctx,
- bin,
- path.concat { ctx:get_install_path(), bin_path },
- {
- GEM_PATH = platform.when {
- unix = function()
- return ("%s:$GEM_PATH"):format(ctx:get_install_path())
- end,
- win = function()
- return ("%s;%%GEM_PATH%%"):format(ctx:get_install_path())
- end,
- },
- }
- )
+ return Result.pcall(ctx.write_shell_exec_wrapper, ctx, bin, path.concat { ctx:get_install_path(), bin_path }, {
+ GEM_PATH = platform.when {
+ unix = function()
+ return ("%s:$GEM_PATH"):format(ctx:get_install_path())
+ end,
+ win = function()
+ return ("%s;%%GEM_PATH%%"):format(ctx:get_install_path())
+ end,
+ },
+ })
end
return M
diff --git a/lua/mason-core/installer/managers/golang.lua b/lua/mason-core/installer/managers/golang.lua
index 2d7b9b0b..04b24741 100644
--- a/lua/mason-core/installer/managers/golang.lua
+++ b/lua/mason-core/installer/managers/golang.lua
@@ -15,7 +15,7 @@ function M.install(pkg, version, opts)
opts = opts or {}
log.fmt_debug("golang: install %s %s %s", pkg, version, opts)
local ctx = installer.context()
- ctx.stdio_sink.stdout(("Installing go package %s@%s…\n"):format(pkg, version))
+ ctx.stdio_sink:stdout(("Installing go package %s@%s…\n"):format(pkg, version))
local env = {
GOBIN = ctx.cwd:get(),
}
diff --git a/lua/mason-core/installer/managers/luarocks.lua b/lua/mason-core/installer/managers/luarocks.lua
index 7a2e2b45..f40124cd 100644
--- a/lua/mason-core/installer/managers/luarocks.lua
+++ b/lua/mason-core/installer/managers/luarocks.lua
@@ -15,7 +15,7 @@ function M.install(pkg, version, opts)
opts = opts or {}
log.fmt_debug("luarocks: install %s %s %s", pkg, version, opts)
local ctx = installer.context()
- ctx.stdio_sink.stdout(("Installing luarocks package %s@%s…\n"):format(pkg, version))
+ ctx.stdio_sink:stdout(("Installing luarocks package %s@%s…\n"):format(pkg, version))
ctx:promote_cwd() -- luarocks encodes absolute paths during installation
return ctx.spawn.luarocks {
"install",
diff --git a/lua/mason-core/installer/managers/npm.lua b/lua/mason-core/installer/managers/npm.lua
index df8ece35..d31fe768 100644
--- a/lua/mason-core/installer/managers/npm.lua
+++ b/lua/mason-core/installer/managers/npm.lua
@@ -50,7 +50,7 @@ function M.init()
end
end))
- ctx.stdio_sink.stdout "Initialized npm root.\n"
+ ctx.stdio_sink:stdout "Initialized npm root.\n"
end)
end
@@ -62,7 +62,7 @@ function M.install(pkg, version, opts)
opts = opts or {}
log.fmt_debug("npm: install %s %s %s", pkg, version, opts)
local ctx = installer.context()
- ctx.stdio_sink.stdout(("Installing npm package %s@%s…\n"):format(pkg, version))
+ ctx.stdio_sink:stdout(("Installing npm package %s@%s…\n"):format(pkg, version))
return ctx.spawn.npm {
"install",
("%s@%s"):format(pkg, version),
@@ -74,7 +74,7 @@ end
---@param pkg string
function M.uninstall(pkg)
local ctx = installer.context()
- ctx.stdio_sink.stdout(("Uninstalling npm package %s…\n"):format(pkg))
+ ctx.stdio_sink:stdout(("Uninstalling npm package %s…\n"):format(pkg))
return ctx.spawn.npm { "uninstall", pkg }
end
diff --git a/lua/mason-core/installer/managers/nuget.lua b/lua/mason-core/installer/managers/nuget.lua
index 9f1badc7..5a4021d0 100644
--- a/lua/mason-core/installer/managers/nuget.lua
+++ b/lua/mason-core/installer/managers/nuget.lua
@@ -12,7 +12,7 @@ local M = {}
function M.install(package, version)
log.fmt_debug("nuget: install %s %s", package, version)
local ctx = installer.context()
- ctx.stdio_sink.stdout(("Installing nuget package %s@%s…\n"):format(package, version))
+ ctx.stdio_sink:stdout(("Installing nuget package %s@%s…\n"):format(package, version))
return ctx.spawn.dotnet {
"tool",
"update",
diff --git a/lua/mason-core/installer/managers/opam.lua b/lua/mason-core/installer/managers/opam.lua
index 875ee12b..20990953 100644
--- a/lua/mason-core/installer/managers/opam.lua
+++ b/lua/mason-core/installer/managers/opam.lua
@@ -14,7 +14,7 @@ local M = {}
function M.install(package, version)
log.fmt_debug("opam: install %s %s", package, version)
local ctx = installer.context()
- ctx.stdio_sink.stdout(("Installing opam package %s@%s…\n"):format(package, version))
+ ctx.stdio_sink:stdout(("Installing opam package %s@%s…\n"):format(package, version))
return ctx.spawn.opam {
"install",
"--destdir=.",
diff --git a/lua/mason-core/installer/managers/pypi.lua b/lua/mason-core/installer/managers/pypi.lua
index 85fadc9f..e12b4561 100644
--- a/lua/mason-core/installer/managers/pypi.lua
+++ b/lua/mason-core/installer/managers/pypi.lua
@@ -116,14 +116,14 @@ local function create_venv(pkg)
and not pep440_check_version(tostring(target.version), supported_python_versions)
then
if ctx.opts.force then
- ctx.stdio_sink.stderr(
+ ctx.stdio_sink:stderr(
("Warning: The resolved python3 version %s is not compatible with the required Python versions: %s.\n"):format(
target.version,
supported_python_versions
)
)
else
- ctx.stdio_sink.stderr "Run with :MasonInstall --force to bypass this version validation.\n"
+ ctx.stdio_sink:stderr "Run with :MasonInstall --force to bypass this version validation.\n"
return Result.failure(
("Failed to find a python3 installation in PATH that meets the required versions (%s). Found version: %s."):format(
supported_python_versions,
@@ -134,7 +134,7 @@ local function create_venv(pkg)
end
log.fmt_debug("Found python3 installation version=%s, executable=%s", target.version, target.executable)
- ctx.stdio_sink.stdout "Creating virtual environment…\n"
+ ctx.stdio_sink:stdout "Creating virtual environment…\n"
return ctx.spawn[target.executable] { "-m", "venv", "--system-site-packages", VENV_DIR }
end
@@ -193,7 +193,7 @@ function M.init(opts)
try(create_venv(opts.package))
if opts.upgrade_pip then
- ctx.stdio_sink.stdout "Upgrading pip inside the virtual environment…\n"
+ ctx.stdio_sink:stdout "Upgrading pip inside the virtual environment…\n"
try(pip_install({ "pip" }, opts.install_extra_args))
end
end)
@@ -207,7 +207,7 @@ function M.install(pkg, version, opts)
opts = opts or {}
log.fmt_debug("pypi: install %s %s %s", pkg, version, opts or "")
local ctx = installer.context()
- ctx.stdio_sink.stdout(("Installing pip package %s@%s…\n"):format(pkg, version))
+ ctx.stdio_sink:stdout(("Installing pip package %s@%s…\n"):format(pkg, version))
return pip_install({
opts.extra and ("%s[%s]==%s"):format(pkg, opts.extra, version) or ("%s==%s"):format(pkg, version),
opts.extra_packages or vim.NIL,
diff --git a/lua/mason-core/installer/managers/std.lua b/lua/mason-core/installer/managers/std.lua
index b4eb11ab..701bb6c9 100644
--- a/lua/mason-core/installer/managers/std.lua
+++ b/lua/mason-core/installer/managers/std.lua
@@ -95,7 +95,7 @@ end
function M.download_file(url, out_file)
log.fmt_debug("std: downloading file %s", url, out_file)
local ctx = installer.context()
- ctx.stdio_sink.stdout(("Downloading file %q…\n"):format(url))
+ ctx.stdio_sink:stdout(("Downloading file %q…\n"):format(url))
return fetch(url, {
out_file = path.concat { ctx.cwd:get(), out_file },
}):map_err(function(err)
@@ -234,7 +234,7 @@ local unpack_by_filename = _.cond {
function M.unpack(rel_path)
log.fmt_debug("std: unpack %s", rel_path)
local ctx = installer.context()
- ctx.stdio_sink.stdout((("Unpacking %q…\n"):format(rel_path)))
+ ctx.stdio_sink:stdout((("Unpacking %q…\n"):format(rel_path)))
return unpack_by_filename(rel_path)
end
@@ -246,7 +246,7 @@ function M.clone(git_url, opts)
opts = opts or {}
log.fmt_debug("std: clone %s %s", git_url, opts)
local ctx = installer.context()
- ctx.stdio_sink.stdout((("Cloning git repository %q…\n"):format(git_url)))
+ ctx.stdio_sink:stdout((("Cloning git repository %q…\n"):format(git_url)))
return Result.try(function(try)
try(ctx.spawn.git {
"clone",