feat(lua): add vim.fs.abspath

Problem: There is currently no way to check if a given path is absolute or convert a relative path to an absolute path through the Lua stdlib. `vim.fs.joinpath` does not work when the path is absolute. There is also currently no way to resolve `C:foo\bar` style paths in Windows.

Solution: Add `vim.fs.abspath`, which allows converting any path to an absolute path. This also allows checking if current path is absolute by doing `vim.fs.abspath(path) == path`. It also has support for `C:foo\bar` style paths in Windows.
This commit is contained in:
Famiu Haque
2024-04-05 14:48:13 +06:00
committed by dundargoc
parent 48c09ed4d9
commit 5180707310
4 changed files with 110 additions and 8 deletions

View File

@@ -454,4 +454,38 @@ describe('vim.fs', function()
end)
end)
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()
it('works', function()
eq(cwd .. '/foo', vim.fs.abspath('foo'))
eq(cwd .. '/././foo', vim.fs.abspath('././foo'))
eq(cwd .. '/.././../foo', vim.fs.abspath('.././../foo'))
end)
it('works with absolute paths', function()
if is_os('win') then
eq([[C:/foo]], vim.fs.abspath([[C:\foo]]))
eq([[C:/foo/../.]], vim.fs.abspath([[C:\foo\..\.]]))
else
eq('/foo/../.', vim.fs.abspath('/foo/../.'))
eq('/foo/bar', vim.fs.abspath('/foo/bar'))
end
end)
it('expands ~', function()
eq(home .. '/foo', vim.fs.abspath('~/foo'))
eq(home .. '/./.././foo', vim.fs.abspath('~/./.././foo'))
end)
if is_os('win') then
it('works with drive-specific cwd on Windows', function()
local cwd_drive = cwd:match('^%w:')
eq(cwd .. '/foo', vim.fs.abspath(cwd_drive .. 'foo'))
end)
end
end)
end)