From 3a0d37681fcd04d092c2442caa346bb751e41bd0 Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Tue, 29 Apr 2025 10:48:18 +0100 Subject: [PATCH] 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. (cherry picked from commit 532610388bb09fef6d0de8929092d4dc32f781bf) --- runtime/lua/vim/_system.lua | 8 +++++++- test/functional/lua/system_spec.lua | 7 ++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/runtime/lua/vim/_system.lua b/runtime/lua/vim/_system.lua index 947aa5c86f..72de1288b1 100644 --- a/runtime/lua/vim/_system.lua +++ b/runtime/lua/vim/_system.lua @@ -245,7 +245,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 index 5abd901a9d..52206b7906 100644 --- 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()