aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-core/installer
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2023-10-13 01:53:41 +0200
committerWilliam Boman <william@redwill.se>2025-02-19 09:23:19 +0100
commitf1e58d3ce7ab3bdb3036b791811896a0220703ad (patch)
treece44529583dcf72844b206fe8578f0ada5ef153f /lua/mason-core/installer
parentrefactor(installer): move initializations to InstallContext constructor (diff)
downloadmason-f1e58d3ce7ab3bdb3036b791811896a0220703ad.tar
mason-f1e58d3ce7ab3bdb3036b791811896a0220703ad.tar.gz
mason-f1e58d3ce7ab3bdb3036b791811896a0220703ad.tar.bz2
mason-f1e58d3ce7ab3bdb3036b791811896a0220703ad.tar.lz
mason-f1e58d3ce7ab3bdb3036b791811896a0220703ad.tar.xz
mason-f1e58d3ce7ab3bdb3036b791811896a0220703ad.tar.zst
mason-f1e58d3ce7ab3bdb3036b791811896a0220703ad.zip
refactor(path): use InstallLocation to produce paths, remove static path methods
Diffstat (limited to 'lua/mason-core/installer')
-rw-r--r--lua/mason-core/installer/linker.lua45
-rw-r--r--lua/mason-core/installer/location.lua27
-rw-r--r--lua/mason-core/installer/runner.lua2
3 files changed, 60 insertions, 14 deletions
diff --git a/lua/mason-core/installer/linker.lua b/lua/mason-core/installer/linker.lua
index 83b1f4a5..5ab6044a 100644
--- a/lua/mason-core/installer/linker.lua
+++ b/lua/mason-core/installer/linker.lua
@@ -8,18 +8,40 @@ local platform = require "mason-core.platform"
local M = {}
----@alias LinkContext { type: '"bin"' | '"opt"' | '"share"', prefix: fun(path: string): string }
+---@alias LinkContext { type: '"bin"' | '"opt"' | '"share"', prefix: fun(path: string, location: InstallLocation): string }
---@type table<'"BIN"' | '"OPT"' | '"SHARE"', LinkContext>
local LinkContext = {
- BIN = { type = "bin", prefix = path.bin_prefix },
- OPT = { type = "opt", prefix = path.opt_prefix },
- SHARE = { type = "share", prefix = path.share_prefix },
+ BIN = {
+ type = "bin",
+ ---@param path string
+ ---@param location InstallLocation
+ prefix = function(path, location)
+ return location:bin(path)
+ end,
+ },
+ OPT = {
+ type = "opt",
+ ---@param path string
+ ---@param location InstallLocation
+ prefix = function(path, location)
+ return location:opt(path)
+ end,
+ },
+ SHARE = {
+ type = "share",
+ ---@param path string
+ ---@param location InstallLocation
+ prefix = function(path, location)
+ return location:share(path)
+ end,
+ },
}
---@param receipt InstallReceipt
---@param link_context LinkContext
-local function unlink(receipt, link_context)
+---@param location InstallLocation
+local function unlink(receipt, link_context, location)
return Result.pcall(function()
local links = receipt:get_links()[link_context.type]
if not links then
@@ -29,7 +51,7 @@ local function unlink(receipt, link_context)
if receipt:get_schema_version() == "1.0" and link_context == LinkContext.BIN and platform.is.win then
linked_file = linked_file .. ".cmd"
end
- local share_path = link_context.prefix(linked_file)
+ local share_path = link_context.prefix(linked_file, location)
fs.sync.unlink(share_path)
end
end)
@@ -37,13 +59,14 @@ end
---@param pkg Package
---@param receipt InstallReceipt
+---@param location InstallLocation
---@nodiscard
-function M.unlink(pkg, receipt)
+function M.unlink(pkg, receipt, location)
log.fmt_debug("Unlinking %s", pkg, receipt:get_links())
return Result.try(function(try)
- try(unlink(receipt, LinkContext.BIN))
- try(unlink(receipt, LinkContext.SHARE))
- try(unlink(receipt, LinkContext.OPT))
+ try(unlink(receipt, LinkContext.BIN, location))
+ try(unlink(receipt, LinkContext.SHARE, location))
+ try(unlink(receipt, LinkContext.OPT, location))
end)
end
@@ -58,7 +81,7 @@ local function link(context, link_context, link_fn)
if platform.is.win and link_context == LinkContext.BIN then
name = ("%s.cmd"):format(name)
end
- local new_abs_path = link_context.prefix(name)
+ local new_abs_path = link_context.prefix(name, context.location)
local target_abs_path = path.concat { context.package:get_install_path(), rel_path }
do
diff --git a/lua/mason-core/installer/location.lua b/lua/mason-core/installer/location.lua
index 694ae0f4..a77e2915 100644
--- a/lua/mason-core/installer/location.lua
+++ b/lua/mason-core/installer/location.lua
@@ -1,6 +1,5 @@
local Path = require "mason-core.path"
-local Result = require "mason-core.result"
-local fs = require "mason-core.fs"
+local platform = require "mason-core.platform"
local settings = require "mason.settings"
---@class InstallLocation
@@ -25,6 +24,9 @@ end
---@async
function InstallLocation:initialize()
+ local Result = require "mason-core.result"
+ local fs = require "mason-core.fs"
+
return Result.try(function(try)
for _, p in ipairs {
self.dir,
@@ -51,6 +53,11 @@ function InstallLocation:share(path)
end
---@param path string?
+function InstallLocation:opt(path)
+ return Path.concat { self.dir, "opt", path }
+end
+
+---@param path string?
function InstallLocation:package(path)
return Path.concat { self.dir, "packages", path }
end
@@ -65,4 +72,20 @@ function InstallLocation:lockfile(name)
return self:staging(("%s.lock"):format(name))
end
+---@param path string
+function InstallLocation:registry(path)
+ return Path.concat { self.dir, "registry", path }
+end
+
+---@param opts { PATH: '"append"' | '"prepend"' | '"skip"' }
+function InstallLocation:set_env(opts)
+ vim.env.MASON = self.dir
+
+ if opts.PATH == "prepend" then
+ vim.env.PATH = self:bin() .. platform.path_sep .. vim.env.PATH
+ elseif opts.PATH == "append" then
+ vim.env.PATH = vim.env.PATH .. platform.path_sep .. self:bin()
+ end
+end
+
return InstallLocation
diff --git a/lua/mason-core/installer/runner.lua b/lua/mason-core/installer/runner.lua
index 8a03b724..3e3580e5 100644
--- a/lua/mason-core/installer/runner.lua
+++ b/lua/mason-core/installer/runner.lua
@@ -130,7 +130,7 @@ function InstallRunner:execute(opts, callback)
context:build_receipt():on_success(
---@param receipt InstallReceipt
function(receipt)
- linker.unlink(handle.package, receipt):on_failure(function(err)
+ linker.unlink(handle.package, receipt, self.location):on_failure(function(err)
log.error("Failed to unlink failed installation.", err)
end)
end