From 7c736579b72a79d955d090db35adf8c751a79fd8 Mon Sep 17 00:00:00 2001 From: w0rp Date: Fri, 31 Mar 2017 20:14:53 +0100 Subject: [PATCH] Fix #438 Create Java .class files for javac in a temporary directory --- ale_linters/java/javac.vim | 4 +++ autoload/ale/engine.vim | 11 +++++++ doc/ale.txt | 10 ++++++ .../test_javac_command_callback.vader | 33 +++++++++++++++++++ test/test_temporary_file_management.vader | 20 +++++++++++ 5 files changed, 78 insertions(+) create mode 100644 test/command_callback/test_javac_command_callback.vader diff --git a/ale_linters/java/javac.vim b/ale_linters/java/javac.vim index 9df9577..d6cb6a4 100644 --- a/ale_linters/java/javac.vim +++ b/ale_linters/java/javac.vim @@ -9,8 +9,12 @@ function! ale_linters#java#javac#GetCommand(buffer) abort \ ? '-cp ' . g:ale_java_javac_classpath \ : '' + " Create .class files in a temporary directory, which we will delete later. + let l:class_file_directory = ale#engine#CreateDirectory(a:buffer) + return 'javac -Xlint ' \ . l:cp_option + \ . ' -d ' . fnameescape(l:class_file_directory) \ . ' ' . g:ale_java_javac_options \ . ' %t' endfunction diff --git a/autoload/ale/engine.vim b/autoload/ale/engine.vim index 3e440d1..f1b27bb 100644 --- a/autoload/ale/engine.vim +++ b/autoload/ale/engine.vim @@ -152,6 +152,17 @@ function! ale#engine#ManageDirectory(buffer, directory) abort call add(g:ale_buffer_info[a:buffer].temporary_directory_list, a:directory) endfunction +" Create a new temporary directory and manage it in one go. +function! ale#engine#CreateDirectory(buffer) abort + let l:temporary_directory = tempname() + " Create the temporary directory for the file, unreadable by 'other' + " users. + call mkdir(l:temporary_directory, '', 0750) + call ale#engine#ManageDirectory(a:buffer, l:temporary_directory) + + return l:temporary_directory +endfunction + function! ale#engine#RemoveManagedFiles(buffer) abort if !has_key(g:ale_buffer_info, a:buffer) return diff --git a/doc/ale.txt b/doc/ale.txt index b24e9a8..32e4d26 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -637,6 +637,16 @@ ale#Queue(delay, [linting_flag]) *ale#Queue()* run. Linters with `lint_file` set to `1` are not run by default. +ale#engine#CreateDirectory(buffer) *ale#engine#CreateDirectory()* + + Create a new temporary directory with a unique name, and manage that + directory with |ale#engine#ManageDirectory()|, so it will be removed as + soon as possible. + + It is advised to only call this function from a callback function for + returning a linter command to run. + + ale#engine#EscapeCommandPart(command_part) *ale#engine#EscapeCommandPart()* Given a |String|, return a |String| with all `%` characters replaced with diff --git a/test/command_callback/test_javac_command_callback.vader b/test/command_callback/test_javac_command_callback.vader new file mode 100644 index 0000000..52aeff4 --- /dev/null +++ b/test/command_callback/test_javac_command_callback.vader @@ -0,0 +1,33 @@ +Before: + runtime ale_linters/java/javac.vim + call ale#engine#InitBufferInfo(bufnr('')) + +After: + call ale#linter#Reset() + " We need to clean up the buffer to remove the temporary directories created + " for the command. + call ale#cleanup#Buffer(bufnr('')) + let g:ale_java_javac_options = '' + let g:ale_java_javac_classpath = '' + +Execute(The javac callback should return the correct default value): + let b:command = ale_linters#java#javac#GetCommand(bufnr('')) + + Assert match(b:command, '\v^javac +-Xlint +-d +/tmp/[0-9a-zA-Z/]+ +\%t$') >= 0, + \ 'Invalid command string: ' . b:command + +Execute(The javac callback should use g:ale_java_javac_classpath correctly): + let g:ale_java_javac_classpath = 'foo.jar' + + let b:command = ale_linters#java#javac#GetCommand(bufnr('')) + + Assert match(b:command, '\v^javac +-Xlint -cp foo\.jar +-d +/tmp/[0-9a-zA-Z/]+ +\%t$') >= 0, + \ 'Invalid command string: ' . b:command + +Execute(The javac callback should use g:ale_java_javac_options correctly): + let g:ale_java_javac_options = '--anything --else' + + let b:command = ale_linters#java#javac#GetCommand(bufnr('')) + + Assert match(b:command, '\v^javac +-Xlint +-d +/tmp/[0-9a-zA-Z/]+ --anything --else +\%t$') >= 0, + \ 'Invalid command string: ' . b:command diff --git a/test/test_temporary_file_management.vader b/test/test_temporary_file_management.vader index 17a375e..b66f3d1 100644 --- a/test/test_temporary_file_management.vader +++ b/test/test_temporary_file_management.vader @@ -81,3 +81,23 @@ Execute(ALE should delete managed files when the buffer is removed): Assert !filereadable(g:filename), 'The tempoary file was not deleted' Assert !isdirectory(g:directory), 'The tempoary directory was not deleted' Assert isdirectory(g:preserved_directory), 'The tempoary directory was not kept' + +Execute(ALE should create and delete directories for ale#engine#CreateDirectory()): + call ale#engine#InitBufferInfo(bufnr('%')) + + let b:dir = ale#engine#CreateDirectory(bufnr('%')) + let b:dir2 = ale#engine#CreateDirectory(bufnr('%')) + + Assert isdirectory(b:dir), 'The directory was not created' + + " We should get the correct file permissions. + " We want to ensure that the directory is not readable by 'other' + AssertEqual 'rwxr-x---', getfperm(b:dir) + + " The two directories shouldn't be the same. + AssertNotEqual b:dir2, b:dir + + call ale#cleanup#Buffer(bufnr('%')) + + Assert !isdirectory(b:dir), 'The directory was not deleted' + Assert !isdirectory(b:dir2), 'The second directory was not deleted'