aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-core
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
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')
-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
-rw-r--r--lua/mason-core/package.lua7
-rw-r--r--lua/mason-core/path.lua40
5 files changed, 64 insertions, 57 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
diff --git a/lua/mason-core/package.lua b/lua/mason-core/package.lua
index 1c9eee96..58ad9b46 100644
--- a/lua/mason-core/package.lua
+++ b/lua/mason-core/package.lua
@@ -184,7 +184,7 @@ function Package:unlink(receipt)
-- 1. Unlink
local linker = require "mason-core.installer.linker"
- linker.unlink(self, receipt):get_or_throw()
+ linker.unlink(self, receipt, InstallLocation.global()):get_or_throw()
-- 2. Remove installation artifacts
fs.sync.rmrf(install_path)
@@ -199,7 +199,7 @@ function Package:get_handle()
end
function Package:get_install_path()
- return path.package_prefix(self.name)
+ return InstallLocation.global():package(self.name)
end
---@return Optional # Optional<InstallReceipt>
@@ -254,7 +254,8 @@ function Package:get_all_versions()
end
function Package:get_lsp_settings_schema()
- local schema_file = path.share_prefix(path.concat { "mason-schemas", "lsp", ("%s.json"):format(self.name) })
+ local schema_file = InstallLocation.global()
+ :share(path.concat { "mason-schemas", "lsp", ("%s.json"):format(self.name) })
if fs.sync.file_exists(schema_file) then
return Result.pcall(vim.json.decode, fs.sync.read_file(schema_file), {
luanil = { object = true, array = true },
diff --git a/lua/mason-core/path.lua b/lua/mason-core/path.lua
index 3d7c8668..9eeed3ba 100644
--- a/lua/mason-core/path.lua
+++ b/lua/mason-core/path.lua
@@ -27,44 +27,4 @@ function M.is_subdirectory(root_path, path)
return root_path == path or path:sub(1, #root_path + 1) == root_path .. sep
end
----@param dir string?
-function M.install_prefix(dir)
- local settings = require "mason.settings"
- return M.concat { settings.current.install_root_dir, dir }
-end
-
----@param executable string?
-function M.bin_prefix(executable)
- return M.concat { M.install_prefix "bin", executable }
-end
-
----@param file string?
-function M.share_prefix(file)
- return M.concat { M.install_prefix "share", file }
-end
-
----@param file string?
-function M.opt_prefix(file)
- return M.concat { M.install_prefix "opt", file }
-end
-
----@param name string?
-function M.package_prefix(name)
- return M.concat { M.install_prefix "packages", name }
-end
-
----@param name string?
-function M.package_build_prefix(name)
- return M.concat { M.install_prefix "staging", name }
-end
-
----@param name string
-function M.package_lock(name)
- return M.package_build_prefix(("%s.lock"):format(name))
-end
-
-function M.registry_prefix()
- return M.install_prefix "registries"
-end
-
return M