Skip to content

Commit

Permalink
Merge pull request neomake#1867 from neomake/fix-args
Browse files Browse the repository at this point in the history
Fix args handling
  • Loading branch information
blueyed authored Feb 24, 2018
2 parents 3bbc80f + 2cc4b43 commit 9437f88
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 20 deletions.
4 changes: 0 additions & 4 deletions autoload/neomake.vim
Original file line number Diff line number Diff line change
Expand Up @@ -698,10 +698,6 @@ function! s:command_maker_base._bind_args() abort dict
else
let args = copy(self.args)
endif
let args_is_list = type(args) == type([])
if args_is_list
call neomake#utils#ExpandArgs(args)
endif
let self.args = args
endfunction

Expand Down
17 changes: 10 additions & 7 deletions autoload/neomake/compat.vim
Original file line number Diff line number Diff line change
Expand Up @@ -163,17 +163,18 @@ if has('nvim')
if neomake#utils#IsRunningWindows()
function! neomake#compat#get_argv(exe, args, args_is_list) abort
if a:args_is_list
let args = neomake#utils#ExpandArgs(a:args)
" Convert it to a string to handle PATHEXT (e.g. .cmd files).
" This might be skipped when `exepath(a:exe)[-4:] == '.exe'`,
" but not worth it probably (and more fragile in the end?!).
return join(map(copy([a:exe] + a:args), 'neomake#utils#shellescape(v:val)'))
return join(map(copy([a:exe] + args), 'neomake#utils#shellescape(v:val)'))
endif
return a:exe . (empty(a:args) ? '' : ' '.a:args)
endfunction
else
function! neomake#compat#get_argv(exe, args, args_is_list) abort
if a:args_is_list
return [a:exe] + a:args
return [a:exe] + neomake#utils#ExpandArgs(a:args)
endif
return a:exe . (empty(a:args) ? '' : ' '.a:args)
endfunction
Expand All @@ -184,11 +185,12 @@ elseif neomake#has_async_support() " Vim-async.
function! neomake#compat#get_argv(exe, args, args_is_list) abort
let prefix = &shell.' '.&shellcmdflag.' '
if a:args_is_list
if a:exe ==# &shell && get(a:args, 0) ==# &shellcmdflag
let args = neomake#utils#ExpandArgs(a:args)
if a:exe ==# &shell && get(args, 0) ==# &shellcmdflag
" Remove already existing &shell/&shellcmdflag from e.g. NeomakeSh.
let argv = join(map(copy(a:args[1:]), 'neomake#utils#shellescape(v:val)'))
let argv = join(map(copy(args[1:]), 'neomake#utils#shellescape(v:val)'))
else
let argv = join(map(copy([a:exe] + a:args), 'neomake#utils#shellescape(v:val)'))
let argv = join(map(copy([a:exe] + args), 'neomake#utils#shellescape(v:val)'))
endif
else
let argv = a:exe . (empty(a:args) ? '' : ' '.a:args)
Expand All @@ -201,7 +203,7 @@ elseif neomake#has_async_support() " Vim-async.
else
function! neomake#compat#get_argv(exe, args, args_is_list) abort
if a:args_is_list
return [a:exe] + a:args
return [a:exe] + neomake#utils#ExpandArgs(a:args)
endif
" Use a shell to handle argv properly (Vim splits at spaces).
let argv = a:exe . (empty(a:args) ? '' : ' '.a:args)
Expand All @@ -212,7 +214,8 @@ else
" Vim (synchronously), via system().
function! neomake#compat#get_argv(exe, args, args_is_list) abort
if a:args_is_list
return join(map(copy([a:exe] + a:args), 'neomake#utils#shellescape(v:val)'))
let args = neomake#utils#ExpandArgs(a:args)
return join(map(copy([a:exe] + args), 'neomake#utils#shellescape(v:val)'))
endif
return a:exe . (empty(a:args) ? '' : ' '.a:args)
endfunction
Expand Down
2 changes: 1 addition & 1 deletion autoload/neomake/utils.vim
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,7 @@ function! neomake#utils#ExpandArgs(args) abort
" \\% is expanded to \\file.ext
" %% becomes %
" % must be followed with an expansion keyword
let ret = map(a:args,
let ret = map(copy(a:args),
\ 'substitute(v:val, '
\ . '''\(\%(\\\@<!\\\)\@<!%\%(%\|\%(:[phtre]\+\)*\)\ze\)\w\@!'', '
\ . '''\=(submatch(1) == "%%" ? "%" : expand(submatch(1)))'', '
Expand Down
8 changes: 5 additions & 3 deletions tests/stdin.vader
Original file line number Diff line number Diff line change
Expand Up @@ -118,15 +118,17 @@ Execute (stdin maker: supports_stdin can be a callback adding args):
Execute (stdin maker: supports_stdin can be a callback adding args, and setting tempfile_name):
let maker = {'exe': 'printf', 'args': ['%s\n']}
function maker.supports_stdin(jobinfo)
let self.args += ['added_arg']
let self.args += ['added_arg', '%:p']
let self.tempfile_name = 'custom_tempfile'
return 1
endfunction
let fname = tempname()
new
exe 'file '.fname
set buftype=nofile
CallNeomake 1, [maker]
AssertNeomakeMessage 'Using stdin for unnamed buffer.'
AssertEqual map(getloclist(0), 'v:val.text'), ['added_arg', 'custom_tempfile']
AssertNeomakeMessage 'Using stdin for unreadable buffer.'
AssertEqual map(getloclist(0), 'v:val.text'), ['added_arg', fname, 'custom_tempfile']
bwipe

Execute (stdin maker: supports_stdin can be a callback returning 0):
Expand Down
42 changes: 37 additions & 5 deletions tests/utils.vader
Original file line number Diff line number Diff line change
Expand Up @@ -328,8 +328,7 @@ Execute (neomake#utils#ExpandArgs):
\ '\~',
\ ]

call neomake#utils#ExpandArgs(args)
AssertEqual expected_args, args
AssertEqual expected_args, neomake#utils#ExpandArgs(args)
AssertEqual isk, &iskeyword
bwipe

Expand Down Expand Up @@ -404,6 +403,24 @@ Execute (neomake#utils#MakerFromCommand splits shell/shellcmdflag):
let bound_maker = neomake#GetMaker(maker).fn(jobinfo)
AssertEqual bound_maker._get_argv(jobinfo), expected_argv

Execute (neomake#utils#MakerFromCommand copies args):
new
exe 'file file_with_escaped_\%:p'
let maker = neomake#utils#MakerFromCommand('echo "%" 1')
let maker.tempfile_name = 'tempfile'
let jobinfo = NeomakeTestsFakeJobinfo()
let bound_maker = neomake#GetMaker(maker).fn(jobinfo)
let argv = bound_maker._get_argv(jobinfo)
let shell_argv = split(&shell) + split(&shellcmdflag)
if type(argv) == type([])
AssertEqual argv, shell_argv + ['echo "file_with_escaped_%:p" 1 tempfile']
else
AssertEqual argv, join(shell_argv)." 'echo \"file_with_escaped_%:p\" 1 tempfile'"
endif
let again_argv = bound_maker._get_argv(jobinfo)
AssertEqual argv, again_argv
bwipe

Execute (neomake#utils#MakerFromCommand appends args for file_mode (string)):
let maker = neomake#utils#MakerFromCommand('echo "%" 1')

Expand All @@ -428,7 +445,16 @@ Execute (neomake#utils#MakerFromCommand appends args for file_mode (string)):
AssertEqual bound_maker.remove_invalid_entries, 0

call bound_maker._bind_args()
AssertEqual bound_maker.args, shell_argv[1:] + ['echo "'.bufname('%').'" 1 '.fname]
AssertEqual bound_maker.args, shell_argv[1:] + ['echo "%" 1 '.fname]

let argv = bound_maker._get_argv(jobinfo)
if type(argv) == type([])
AssertEqual argv, shell_argv + ['echo "'.bufname('%').'" 1 '.fname]
else
AssertEqual argv, join(shell_argv)." 'echo \"".bufname('%').'" 1 '.fname."'"
endif
" self.args is not changed.
AssertEqual bound_maker.args, shell_argv[1:] + ['echo "%" 1 '.fname]

CallNeomake 0, [maker]
AssertEqual getqflist()[0].text, 'tests/fixtures/a filename with spaces 1'
Expand All @@ -455,8 +481,14 @@ Execute (neomake#utils#MakerFromCommand appends args for file_mode (list)):
AssertEqual bound_maker.exe, 'echo'
AssertEqual bound_maker.remove_invalid_entries, 0

call bound_maker._bind_args()
AssertEqual bound_maker.args, [bufname('%'), '1', fname]

let argv = bound_maker._get_argv(jobinfo)
if type(argv) == type([])
AssertEqual argv, ['echo', bufname('%'), '1', fname]
else
AssertEqual argv, printf("echo '%s' 1 '%s'", bufname('%'), fname)
endif
AssertEqual bound_maker.args, ['%', '1', fname]

CallNeomake 0, [maker]
AssertEqual getqflist()[0].text, 'tests/fixtures/a filename with spaces 1'
Expand Down

0 comments on commit 9437f88

Please sign in to comment.