mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 19:38:20 +00:00
fix(vim.system): env=nil passes env=nil to uv.spawn
731e616a79
made it so passing `{env = nil, clear_env = true }` would pass `{env = {}}` to `vim.uv.spawn`. However this is not what `clear_env` is (arguably) supposed to do. If `env=nil` then that implies the uses wants `vim.uv.spawn()` to use the default environment. Adding `clear_env = true` simply prevents `NVIM` (the base environment) from being added. Fixes #34730 (cherry picked from commit4eebc46930
)
This commit is contained in:

committed by
github-actions[bot]
![github-actions[bot]](/assets/img/avatar_default.png)
parent
2d3517012a
commit
e732cbe36c
@@ -1778,7 +1778,9 @@ vim.system({cmd}, {opts}, {on_exit}) *vim.system()*
|
|||||||
the new process. Inherits the current environment with
|
the new process. Inherits the current environment with
|
||||||
`NVIM` set to |v:servername|.
|
`NVIM` set to |v:servername|.
|
||||||
• clear_env: (boolean) `env` defines the job environment
|
• clear_env: (boolean) `env` defines the job environment
|
||||||
exactly, instead of merging current environment.
|
exactly, instead of merging current environment. Note: if
|
||||||
|
`env` is `nil`, the current environment is used but
|
||||||
|
without `NVIM` set.
|
||||||
• stdin: (string|string[]|boolean) If `true`, then a pipe
|
• stdin: (string|string[]|boolean) If `true`, then a pipe
|
||||||
to stdin is opened and can be written to via the
|
to stdin is opened and can be written to via the
|
||||||
`write()` method to SystemObj. If string or string[] then
|
`write()` method to SystemObj. If string or string[] then
|
||||||
|
@@ -106,7 +106,7 @@ local utfs = {
|
|||||||
--- - env: table<string,string> Set environment variables for the new process. Inherits the
|
--- - env: table<string,string> Set environment variables for the new process. Inherits the
|
||||||
--- current environment with `NVIM` set to |v:servername|.
|
--- current environment with `NVIM` set to |v:servername|.
|
||||||
--- - clear_env: (boolean) `env` defines the job environment exactly, instead of merging current
|
--- - clear_env: (boolean) `env` defines the job environment exactly, instead of merging current
|
||||||
--- environment.
|
--- environment. Note: if `env` is `nil`, the current environment is used but without `NVIM` set.
|
||||||
--- - stdin: (string|string[]|boolean) If `true`, then a pipe to stdin is opened and can be written
|
--- - stdin: (string|string[]|boolean) If `true`, then a pipe to stdin is opened and can be written
|
||||||
--- to via the `write()` method to SystemObj. If string or string[] then will be written to stdin
|
--- to via the `write()` method to SystemObj. If string or string[] then will be written to stdin
|
||||||
--- and closed. Defaults to `false`.
|
--- and closed. Defaults to `false`.
|
||||||
|
@@ -210,13 +210,18 @@ end
|
|||||||
--- @param clear_env? boolean
|
--- @param clear_env? boolean
|
||||||
--- @return string[]?
|
--- @return string[]?
|
||||||
local function setup_env(env, clear_env)
|
local function setup_env(env, clear_env)
|
||||||
|
if not env and clear_env then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
env = env or {}
|
||||||
if not clear_env then
|
if not clear_env then
|
||||||
--- @type table<string,string|number>
|
--- @type table<string,string|number>
|
||||||
env = vim.tbl_extend('force', base_env(), env or {})
|
env = vim.tbl_extend('force', base_env(), env)
|
||||||
end
|
end
|
||||||
|
|
||||||
local renv = {} --- @type string[]
|
local renv = {} --- @type string[]
|
||||||
for k, v in pairs(env or {}) do
|
for k, v in pairs(env) do
|
||||||
renv[#renv + 1] = string.format('%s=%s', k, tostring(v))
|
renv[#renv + 1] = string.format('%s=%s', k, tostring(v))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -93,6 +93,27 @@ describe('vim.system', function()
|
|||||||
)
|
)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('can set environment with clear_env = true and env = nil', function()
|
||||||
|
exec_lua(function()
|
||||||
|
vim.env.TEST = 'TESTVAL'
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Not passing env with clear_env should not clear the environment
|
||||||
|
eq(
|
||||||
|
'TESTVAL',
|
||||||
|
system({ n.testprg('printenv-test'), 'TEST' }, { clear_env = true, text = true }).stdout
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Passing env = {} with clear_env should clear the environment
|
||||||
|
eq(
|
||||||
|
'',
|
||||||
|
system(
|
||||||
|
{ n.testprg('printenv-test'), 'TEST' },
|
||||||
|
{ env = {}, clear_env = true, text = true }
|
||||||
|
).stdout
|
||||||
|
)
|
||||||
|
end)
|
||||||
|
|
||||||
it('supports timeout', function()
|
it('supports timeout', function()
|
||||||
eq({
|
eq({
|
||||||
code = 124,
|
code = 124,
|
||||||
|
Reference in New Issue
Block a user