commit 532610388bb09fef6d0de8929092d4dc32f781bf
parent cc264d51aba802d7f536cc3680b3af2d13ed1889
Author: Lewis Russell <lewis6991@gmail.com>
Date: Tue, 29 Apr 2025 10:48:18 +0100
fix(vim.system): improve error message when cwd does not exist
Problem:
vim.uv.spawn will emit ENOENT for either when the cmd or cwd do not
exist and does not tell you which.
Solution:
If an error occurs, check if cwd was supplied and included in the error
message if it does not exist.
Diffstat:
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/runtime/lua/vim/_system.lua b/runtime/lua/vim/_system.lua
@@ -246,7 +246,13 @@ local function spawn(cmd, opts, on_exit, on_error)
local handle, pid_or_err = uv.spawn(cmd, opts, on_exit)
if not handle then
on_error()
- error(('%s: "%s"'):format(pid_or_err, cmd))
+ if opts.cwd and not uv.fs_stat(opts.cwd) then
+ error(("%s (cwd): '%s'"):format(pid_or_err, opts.cwd))
+ elseif vim.fn.executable(cmd) == 0 then
+ error(("%s (cmd): '%s'"):format(pid_or_err, cmd))
+ else
+ error(pid_or_err)
+ end
end
return handle, pid_or_err --[[@as integer]]
end
diff --git a/test/functional/lua/system_spec.lua b/test/functional/lua/system_spec.lua
@@ -55,9 +55,14 @@ describe('vim.system', function()
describe('(' .. name .. ')', function()
it('failure modes', function()
t.matches(
- 'ENOENT%: no such file .*: "non%-existent%-cmd"',
+ "ENOENT%: no such file .* %(cmd%): 'non%-existent%-cmd'",
t.pcall_err(system, { 'non-existent-cmd', 'arg1', 'arg2' }, { text = true })
)
+
+ t.matches(
+ "ENOENT%: no such file .* %(cwd%): 'non%-existent%-cwd'",
+ t.pcall_err(system, { 'echo', 'hello' }, { cwd = 'non-existent-cwd', text = true })
+ )
end)
it('can run simple commands', function()