Extract helper for setting job environment

This commit is contained in:
Tim Pope
2020-02-02 15:57:33 -05:00
parent df3ac9d278
commit e144a9f559

View File

@@ -45,13 +45,23 @@ function! s:winshell() abort
return has('win32') && &shellcmdflag !~# '^-' return has('win32') && &shellcmdflag !~# '^-'
endfunction endfunction
function! s:WinShellEsc(arg) abort
if type(a:arg) == type([])
return join(map(copy(a:arg), 's:shellesc(v:val)'))
elseif a:arg =~# '^[A-Za-z0-9_/:.-]\+$'
return a:arg
else
return '"' . s:gsub(s:gsub(a:arg, '"', '""'), '\%', '"%"') . '"'
endif
endfunction
function! s:shellesc(arg) abort function! s:shellesc(arg) abort
if type(a:arg) == type([]) if type(a:arg) == type([])
return join(map(copy(a:arg), 's:shellesc(v:val)')) return join(map(copy(a:arg), 's:shellesc(v:val)'))
elseif a:arg =~ '^[A-Za-z0-9_/:.-]\+$' elseif a:arg =~# '^[A-Za-z0-9_/:.-]\+$'
return a:arg return a:arg
elseif s:winshell() elseif s:winshell()
return '"'.s:gsub(s:gsub(a:arg, '"', '""'), '\%', '"%"').'"' return '"' . s:gsub(s:gsub(a:arg, '"', '""'), '\%', '"%"') . '"'
else else
return shellescape(a:arg) return shellescape(a:arg)
endif endif
@@ -447,6 +457,25 @@ function! s:BuildEnvPrefix(env) abort
endif endif
endfunction endfunction
function! s:JobOpts(cmd, env) abort
if empty(a:env)
return [a:cmd, {}]
elseif has('patch-8.1.0902') && !has('nvim') && (!has('win32') || empty(filter(keys(a:env), 'exists("$" . v:val)')))
return [a:cmd, {'env': a:env}]
endif
let envlist = map(items(a:env), 'join(v:val, "=")')
if !has('win32')
return [['env'] + envlist + a:cmd, {}]
else
let pre = join(map(envlist, '"set " . substitute(v:val, "[&|<>^]", "^^^&", "g") . "& "'), '')
if len(a:cmd) == 3 && a:cmd[0] ==# 'cmd.exe' && a:cmd[1] ==# '/c'
return [a:cmd[0:1] + [pre . a:cmd[2]], {}]
else
return [['cmd.exe', '/c', pre . s:WinShellEsc(a:cmd)], {}]
endif
endif
endfunction
function! s:BuildShell(dir, env, args) abort function! s:BuildShell(dir, env, args) abort
let cmd = copy(a:args) let cmd = copy(a:args)
let tree = s:Tree(a:dir) let tree = s:Tree(a:dir)
@@ -2408,42 +2437,26 @@ function! fugitive#Command(line1, line2, range, bang, mods, arg) abort
\ 'PAGER': 'cat'}, 'keep') \ 'PAGER': 'cat'}, 'keep')
let args = s:disable_colors + flags + ['-c', 'advice.waitingForEditor=false'] + args let args = s:disable_colors + flags + ['-c', 'advice.waitingForEditor=false'] + args
let argv = s:UserCommandList(dir) + args let argv = s:UserCommandList(dir) + args
if !has('patch-8.0.0902') || has('nvim') let [argv, jobopts] = s:JobOpts(argv, env)
let envlist = map(items(env), 'join(v:val, "=")')
if s:executable('env')
let argv = ['env'] + envlist + argv
elseif has('win32')
let argv = ['cmd.exe', '/c',
\ join(map(envlist, { _, v -> 'set ' . substitute(v, '[&|<>^]', '^^^&', 'g') }) +
\ [s:shellesc(argv)], '& ')]
else
return 'echoerr ' . string('fugitive: "env" command missing')
endif
let env = {}
endif
let state.cmd = argv let state.cmd = argv
let g:_fugitive_last_job = state let g:_fugitive_last_job = state
if &autowrite || &autowriteall | silent! wall | endif if &autowrite || &autowriteall | silent! wall | endif
if exists('*job_start') if exists('*job_start')
let jobopts = { call extend(jobopts, {
\ 'mode': 'raw', \ 'mode': 'raw',
\ 'callback': function('s:RunReceive', [state]), \ 'callback': function('s:RunReceive', [state]),
\ } \ })
if state.pty if state.pty
let jobopts.pty = 1 let jobopts.pty = 1
endif endif
if len(env)
let jobopts.env = env
endif
let job = job_start(argv, jobopts) let job = job_start(argv, jobopts)
else else
let job = jobstart(argv, { let job = jobstart(argv, extend(jobopts, {
\ 'pty': state.pty, \ 'pty': state.pty,
\ 'env': env,
\ 'TERM': 'dumb', \ 'TERM': 'dumb',
\ 'on_stdout': function('s:RunReceive', [state]), \ 'on_stdout': function('s:RunReceive', [state]),
\ 'on_stderr': function('s:RunReceive', [state]), \ 'on_stderr': function('s:RunReceive', [state]),
\ }) \ }))
endif endif
let state.job = job let state.job = job
call s:RunWait(state, job) call s:RunWait(state, job)