fix(#3117): allow changing filename's casing

This commit is contained in:
Artur Roos 2025-04-28 23:12:51 +03:00 committed by Arthur Roos
parent 582ae48c9e
commit 7b5a28f602

View File

@ -289,11 +289,51 @@ function M.rename_loaded_buffers(old_path, new_path)
end
end
local is_windows_drive = function(path)
return (M.is_windows) and (path:match("^%a:\\$") ~= nil)
end
---@param path string path to file or directory
---@return boolean
function M.file_exists(path)
local _, error = vim.loop.fs_stat(path)
return error == nil
if not (M.is_windows or M.is_wsl) then
local _, error = vim.loop.fs_stat(path)
return error == nil
end
-- Windows is case-insensetive, but case-preserving
-- If a file's name is being changed into itself
-- with different casing, windows will falsely
-- report that file is already existing, so a hand-rolled
-- implementation of checking for existance is needed.
-- Same holds for WSL, since it can sometimes
-- access Windows files directly.
-- For more details see (#3117).
if is_windows_drive(path) then
return vim.fn.isdirectory(path) == 1
end
local parent = vim.fn.fnamemodify(path, ":h")
local filename = vim.fn.fnamemodify(path, ":t")
local handle = vim.loop.fs_scandir(parent)
if not handle then
-- File can not exist if its parent directory does not exist
return false
end
while true do
local name, _ = vim.loop.fs_scandir_next(handle)
if not name then
break
end
if name == filename then
return true
end
end
return false
end
---@param path string