commit 731e616a79d01e4797badbb4e18d167c51125151
parent 4369d7d9a7804b8f9c2254da9f153d428115334a
Author: Birdee <85372418+BirdeeHub@users.noreply.github.com>
Date: Wed, 25 Jun 2025 15:15:19 -0700
fix(vim.system): clear_env=true gives an invalid env to uv.spawn #33955
Problem:
In setup_env, some needed logic is bypassed when clear_env=true.
Solution:
Drop the early return in setup_env().
Co-authored-by: BirdeeHub <birdee@localhost>
Diffstat:
2 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/runtime/lua/vim/_system.lua b/runtime/lua/vim/_system.lua
@@ -208,15 +208,13 @@ end
--- @param clear_env? boolean
--- @return string[]?
local function setup_env(env, clear_env)
- if clear_env then
- return env
+ if not clear_env then
+ --- @type table<string,string|number>
+ env = vim.tbl_extend('force', base_env(), env or {})
end
- --- @type table<string,string|number>
- env = vim.tbl_extend('force', base_env(), env or {})
-
local renv = {} --- @type string[]
- for k, v in pairs(env) do
+ for k, v in pairs(env or {}) do
renv[#renv + 1] = string.format('%s=%s', k, tostring(v))
end
diff --git a/test/functional/lua/system_spec.lua b/test/functional/lua/system_spec.lua
@@ -73,6 +73,26 @@ describe('vim.system', function()
eq('hellocat', system({ 'cat' }, { stdin = 'hellocat', text = true }).stdout)
end)
+ it('can set environment', function()
+ eq(
+ 'TESTVAL',
+ system(
+ { n.testprg('printenv-test'), 'TEST' },
+ { env = { TEST = 'TESTVAL' }, text = true }
+ ).stdout
+ )
+ end)
+
+ it('can set environment with clear_env = true', function()
+ eq(
+ 'TESTVAL',
+ system(
+ { n.testprg('printenv-test'), 'TEST' },
+ { clear_env = true, env = { TEST = 'TESTVAL' }, text = true }
+ ).stdout
+ )
+ end)
+
it('supports timeout', function()
eq({
code = 124,