From c7a9ffcb9ca9c179d30af0dd27d817ec48c58a5a Mon Sep 17 00:00:00 2001 From: w0rp Date: Wed, 17 Jan 2018 18:08:17 +0000 Subject: [PATCH] Fix #1298 - Escape commands for PowerShell --- autoload/ale/job.vim | 2 +- test/smoke_test.vader | 62 +++++++++++++++++++++++++++++++++ test/test_history_saving.vader | 4 +-- test/test_prepare_command.vader | 2 +- 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/autoload/ale/job.vim b/autoload/ale/job.vim index e6a75c88..cad75309 100644 --- a/autoload/ale/job.vim +++ b/autoload/ale/job.vim @@ -174,7 +174,7 @@ function! ale#job#PrepareCommand(command) abort " but we'll do this explicitly, so we use thes same exact command for both " versions. if ale#Has('win32') - return 'cmd /c ' . a:command + return 'cmd /s/c "' . a:command . '"' endif if &shell =~? 'fish$' diff --git a/test/smoke_test.vader b/test/smoke_test.vader index 7635cbd9..f6d0be56 100644 --- a/test/smoke_test.vader +++ b/test/smoke_test.vader @@ -1,6 +1,7 @@ Before: Save g:ale_set_lists_synchronously Save g:ale_buffer_info + Save &shell let g:ale_buffer_info = {} let g:ale_set_lists_synchronously = 1 @@ -59,6 +60,67 @@ Execute(Linters should run with the default options): \ 'valid': 1, \ }], getloclist(0) +Execute(Linters should run in PowerShell too): + if has('win32') + set shell=powershell + + AssertEqual 'foobar', &filetype + + " Replace the callback to handle two lines. + function! TestCallback(buffer, output) + " Windows adds extra spaces to the text from echo. + return [ + \ { + \ 'lnum': 1, + \ 'col': 3, + \ 'text': substitute(a:output[0], ' *$', '', ''), + \ }, + \ { + \ 'lnum': 2, + \ 'col': 3, + \ 'text': substitute(a:output[1], ' *$', '', ''), + \ }, + \] + endfunction + + " Recreate the command string to use &&, which PowerShell does not support. + call ale#linter#Reset() + call ale#linter#Define('foobar', { + \ 'name': 'testlinter', + \ 'callback': 'TestCallback', + \ 'executable': 'cmd', + \ 'command': 'echo foo && echo bar', + \}) + + call ale#Lint() + call ale#engine#WaitForJobs(2000) + + AssertEqual [ + \ { + \ 'bufnr': bufnr('%'), + \ 'lnum': 1, + \ 'vcol': 0, + \ 'col': 3, + \ 'text': 'foo', + \ 'type': 'E', + \ 'nr': -1, + \ 'pattern': '', + \ 'valid': 1, + \ }, + \ { + \ 'bufnr': bufnr('%'), + \ 'lnum': 2, + \ 'vcol': 0, + \ 'col': 3, + \ 'text': 'bar', + \ 'type': 'E', + \ 'nr': -1, + \ 'pattern': '', + \ 'valid': 1, + \ }, + \], getloclist(0) + endif + Execute(Previous errors should be removed when linters change): call ale#Lint() call ale#engine#WaitForJobs(2000) diff --git a/test/test_history_saving.vader b/test/test_history_saving.vader index 020ceb53..7dabcd9d 100644 --- a/test/test_history_saving.vader +++ b/test/test_history_saving.vader @@ -76,7 +76,7 @@ Execute(History should be set when commands are run): AssertEqual sort(['status', 'exit_code', 'job_id', 'command']), sort(keys(g:history[0])) if has('win32') - AssertEqual 'cmd /c echo command history test', g:history[0].command + AssertEqual 'cmd /s/c "echo command history test"', g:history[0].command else AssertEqual ['/bin/sh', '-c', '/bin/sh -c ''echo command history test'''], g:history[0].command endif @@ -151,7 +151,7 @@ Execute(The history should be updated when fixers are run): AssertEqual ['finished'], map(copy(b:ale_history), 'v:val.status') if has('win32') - AssertEqual 'cmd /c echo foo ', split(b:ale_history[0].command, '<')[0] + AssertEqual 'cmd /s/c "echo foo ', split(b:ale_history[0].command, '<')[0] else AssertEqual '/bin/sh -c echo foo ', split(join(b:ale_history[0].command), '<')[0] endif diff --git a/test/test_prepare_command.vader b/test/test_prepare_command.vader index ebb9998d..4f88b1d0 100644 --- a/test/test_prepare_command.vader +++ b/test/test_prepare_command.vader @@ -35,4 +35,4 @@ Execute(cmd /c as a string should be used on Windows): let &shellcmdflag = 'whatever' let g:ale_has_override = {'win32': 1} - AssertEqual 'cmd /c foobar', ale#job#PrepareCommand('foobar') + AssertEqual 'cmd /s/c "foobar"', ale#job#PrepareCommand('foobar')