feat: add vim.fs.relpath

This is needed to replace the nvim-lspconfig function is_descendant that
some lspconfg configurations still use.
This commit is contained in:
dundargoc
2024-12-30 16:01:00 +01:00
committed by dundargoc
parent a3ef29d570
commit 0631492f9c
5 changed files with 114 additions and 15 deletions

View File

@@ -168,8 +168,8 @@ describe('vim.fs', function()
local function run(dir, depth, skip)
return exec_lua(function()
local r = {}
local skip_f
local r = {} --- @type table<string, string>
local skip_f --- @type function
if skip then
skip_f = function(n0)
if vim.tbl_contains(skip or {}, n0) then
@@ -493,8 +493,8 @@ describe('vim.fs', function()
end)
describe('abspath()', function()
local cwd = is_os('win') and vim.uv.cwd():gsub('\\', '/') or vim.uv.cwd()
local home = is_os('win') and vim.uv.os_homedir():gsub('\\', '/') or vim.uv.os_homedir()
local cwd = assert(t.fix_slashes(assert(vim.uv.cwd())))
local home = t.fix_slashes(assert(vim.uv.os_homedir()))
it('works', function()
eq(cwd .. '/foo', vim.fs.abspath('foo'))
@@ -526,4 +526,57 @@ describe('vim.fs', function()
end)
end
end)
describe('relpath()', function()
it('works', function()
local cwd = assert(t.fix_slashes(assert(vim.uv.cwd())))
local my_dir = vim.fs.joinpath(cwd, 'foo')
eq(nil, vim.fs.relpath('/var/lib', '/var'))
eq(nil, vim.fs.relpath('/var/lib', '/bin'))
eq(nil, vim.fs.relpath(my_dir, 'bin'))
eq(nil, vim.fs.relpath(my_dir, './bin'))
eq(nil, vim.fs.relpath(my_dir, '././'))
eq(nil, vim.fs.relpath(my_dir, '../'))
eq(nil, vim.fs.relpath('/var/lib', '/'))
eq(nil, vim.fs.relpath('/var/lib', '//'))
eq(nil, vim.fs.relpath(' ', '/var'))
eq(nil, vim.fs.relpath(' ', '/var'))
eq('.', vim.fs.relpath('/var/lib', '/var/lib'))
eq('lib', vim.fs.relpath('/var/', '/var/lib'))
eq('var/lib', vim.fs.relpath('/', '/var/lib'))
eq('bar/package.json', vim.fs.relpath('/foo/test', '/foo/test/bar/package.json'))
eq('foo/bar', vim.fs.relpath(cwd, 'foo/bar'))
eq('foo/bar', vim.fs.relpath('.', vim.fs.joinpath(cwd, 'foo/bar')))
eq('bar', vim.fs.relpath('foo', 'foo/bar'))
eq(nil, vim.fs.relpath('/var/lib', '/var/library/foo'))
if is_os('win') then
eq(nil, vim.fs.relpath('/', ' '))
eq(nil, vim.fs.relpath('/', 'var'))
else
local cwd_rel_root = cwd:sub(2)
eq(cwd_rel_root .. '/ ', vim.fs.relpath('/', ' '))
eq(cwd_rel_root .. '/var', vim.fs.relpath('/', 'var'))
end
if is_os('win') then
eq(nil, vim.fs.relpath('c:/aaaa/', '/aaaa/cccc'))
eq(nil, vim.fs.relpath('c:/aaaa/', './aaaa/cccc'))
eq(nil, vim.fs.relpath('c:/aaaa/', 'aaaa/cccc'))
eq(nil, vim.fs.relpath('c:/blah\\blah', 'd:/games'))
eq(nil, vim.fs.relpath('c:/games', 'd:/games'))
eq(nil, vim.fs.relpath('c:/games', 'd:/games/foo'))
eq(nil, vim.fs.relpath('c:/aaaa/bbbb', 'c:/aaaa'))
eq('cccc', vim.fs.relpath('c:/aaaa/', 'c:/aaaa/cccc'))
eq('aaaa/bbbb', vim.fs.relpath('C:/', 'c:\\aaaa\\bbbb'))
eq('bar/package.json', vim.fs.relpath('C:\\foo\\test', 'C:\\foo\\test\\bar\\package.json'))
eq('baz', vim.fs.relpath('\\\\foo\\bar', '\\\\foo\\bar\\baz'))
eq(nil, vim.fs.relpath('a/b/c', 'a\\b'))
eq('d', vim.fs.relpath('a/b/c', 'a\\b\\c\\d'))
eq('.', vim.fs.relpath('\\\\foo\\bar\\baz', '\\\\foo\\bar\\baz'))
eq(nil, vim.fs.relpath('C:\\foo\\test', 'C:\\foo\\Test\\bar\\package.json'))
end
end)
end)
end)