From 6daa74748ff63efcf24fb66112412c03df08be72 Mon Sep 17 00:00:00 2001 From: William Boman Date: Sat, 30 May 2026 15:52:15 +0200 Subject: refactor(fs): implement mkdirp natively via libuv (#2100) --- lua/mason-core/fs.lua | 16 ++++++++++------ lua/mason-core/installer/context/InstallContextFs.lua | 2 +- lua/mason-core/installer/linker.lua | 2 +- lua/mason-registry/sources/github.lua | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) (limited to 'lua') diff --git a/lua/mason-core/fs.lua b/lua/mason-core/fs.lua index 5decd3ca..597ba3fa 100644 --- a/lua/mason-core/fs.lua +++ b/lua/mason-core/fs.lua @@ -1,5 +1,5 @@ local Path = require "mason-core.path" -local a = require "mason-core.async" +local _ = require "mason-core.functional" local log = require "mason-core.log" local settings = require "mason.settings" @@ -123,12 +123,16 @@ local function make_module(uv) ---@param path string function M.mkdirp(path) log.debug("fs: mkdirp", path) - if vim.in_fast_event() then - a.scheduler() + local normalized_path = vim.fs.normalize(path) + local path_components = vim.split(normalized_path, "/", { plain = true }) + if vim.fn.has "win32" ~= 1 then + path_components[1] = "/" end - if vim.fn.mkdir(path, "p") ~= 1 then - log.debug "fs: mkdirp failed" - error(("mkdirp: Could not create directory %q."):format(path)) + for i = 1, #path_components, 1 do + local current_path = vim.fs.joinpath(unpack(_.take(i, path_components))) + if not M.dir_exists(current_path) then + M.mkdir(current_path) + end end end diff --git a/lua/mason-core/installer/context/InstallContextFs.lua b/lua/mason-core/installer/context/InstallContextFs.lua index c473c0a9..a36d8410 100644 --- a/lua/mason-core/installer/context/InstallContextFs.lua +++ b/lua/mason-core/installer/context/InstallContextFs.lua @@ -76,7 +76,7 @@ end ---@async ---@param dir_path string function InstallContextFs:mkdirp(dir_path) - return fs.async.mkdirp(path.concat { self.cwd:get(), dir_path }) + return fs.sync.mkdirp(path.concat { self.cwd:get(), dir_path }) end ---@async diff --git a/lua/mason-core/installer/linker.lua b/lua/mason-core/installer/linker.lua index 415f61eb..7fff6d89 100644 --- a/lua/mason-core/installer/linker.lua +++ b/lua/mason-core/installer/linker.lua @@ -122,7 +122,7 @@ local function link(context, link_context, link_fn) a.scheduler() local dir = vim.fn.fnamemodify(new_abs_path, ":h") if not fs.async.dir_exists(dir) then - try(Result.pcall(fs.async.mkdirp, dir)) + try(Result.pcall(fs.sync.mkdirp, dir)) end -- 2. Ensure source file exists and target doesn't yet exist OR if --force unlink target if it already diff --git a/lua/mason-registry/sources/github.lua b/lua/mason-registry/sources/github.lua index 7b650ae8..73c9d285 100644 --- a/lua/mason-registry/sources/github.lua +++ b/lua/mason-registry/sources/github.lua @@ -95,7 +95,7 @@ function GitHubRegistrySource:install() if not fs.async.dir_exists(self.root_dir) then log.debug("Creating registry directory", self) - try(Result.pcall(fs.async.mkdirp, self.root_dir)) + try(Result.pcall(fs.sync.mkdirp, self.root_dir)) end if version == nil then -- cgit v1.3.1