From 3bc4b74f12303319e088c963a7c13486c4e4e776 Mon Sep 17 00:00:00 2001 From: William Boman Date: Fri, 13 Oct 2023 15:40:24 +0200 Subject: feat(path): add relative(from, to) --- lua/mason-core/path.lua | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'lua/mason-core/path.lua') diff --git a/lua/mason-core/path.lua b/lua/mason-core/path.lua index 9eeed3ba..66f0f964 100644 --- a/lua/mason-core/path.lua +++ b/lua/mason-core/path.lua @@ -24,7 +24,38 @@ end ---@path root_path string ---@path path string function M.is_subdirectory(root_path, path) - return root_path == path or path:sub(1, #root_path + 1) == root_path .. sep + local root_path_normalized = vim.fs.normalize(root_path) + local path_normalized = vim.fs.normalize(path) + if path_normalized == root_path_normalized then + return true + end + for dir in vim.fs.parents(path_normalized) do + if root_path_normalized == dir then + return true + end + end + return false +end + +local function find_closest_common_parent(from, to) + local distance = 0 + for parent in vim.fs.parents(from) do + if to:find(parent, 1, true) then + return parent, distance + else + distance = distance + 1 + end + end + return "/", distance +end + +function M.relative(from, to) + local from_normalized = vim.fs.normalize(from) + local to_normalized = vim.fs.normalize(to) + + local common_parent, distance = find_closest_common_parent(from_normalized, to_normalized) + local relative_path_component = distance == 0 and "." or (".."):rep(distance, "/") + return vim.fs.joinpath(relative_path_component, to_normalized:sub(#common_parent + 1)) end return M -- cgit v1.2.3-70-g09d2