mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	fix(vim.system): env=nil passes env=nil to uv.spawn
731e616a79made 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]
					
				
			
			
				
	
			
			
			
						parent
						
							2d3517012a
						
					
				
				
					commit
					e732cbe36c
				
			@@ -1778,7 +1778,9 @@ vim.system({cmd}, {opts}, {on_exit})                            *vim.system()*
 | 
			
		||||
                     the new process. Inherits the current environment with
 | 
			
		||||
                     `NVIM` set to |v:servername|.
 | 
			
		||||
                   • 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
 | 
			
		||||
                     to stdin is opened and can be written to via the
 | 
			
		||||
                     `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
 | 
			
		||||
---     current environment with `NVIM` set to |v:servername|.
 | 
			
		||||
---   - 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
 | 
			
		||||
---     to via the `write()` method to SystemObj. If string or string[] then will be written to stdin
 | 
			
		||||
---     and closed. Defaults to `false`.
 | 
			
		||||
 
 | 
			
		||||
@@ -210,13 +210,18 @@ end
 | 
			
		||||
--- @param clear_env? boolean
 | 
			
		||||
--- @return string[]?
 | 
			
		||||
local function setup_env(env, clear_env)
 | 
			
		||||
  if not env and clear_env then
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  env = env or {}
 | 
			
		||||
  if not clear_env then
 | 
			
		||||
    --- @type table<string,string|number>
 | 
			
		||||
    env = vim.tbl_extend('force', base_env(), env or {})
 | 
			
		||||
    env = vim.tbl_extend('force', base_env(), env)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  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))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -93,6 +93,27 @@ describe('vim.system', function()
 | 
			
		||||
        )
 | 
			
		||||
      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()
 | 
			
		||||
        eq({
 | 
			
		||||
          code = 124,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user