summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorw0rp <devw0rp@gmail.com>2017-03-31 20:14:53 +0100
committerw0rp <devw0rp@gmail.com>2017-03-31 20:14:53 +0100
commit7c736579b72a79d955d090db35adf8c751a79fd8 (patch)
tree81a647646b6136bfebb6864461096f490b4af589
parent7a8dbe1139b698cff7c7e04e5e27a40a8ffec5f5 (diff)
downloadale-7c736579b72a79d955d090db35adf8c751a79fd8.zip
Fix #438 Create Java .class files for javac in a temporary directory
-rw-r--r--ale_linters/java/javac.vim4
-rw-r--r--autoload/ale/engine.vim11
-rw-r--r--doc/ale.txt10
-rw-r--r--test/command_callback/test_javac_command_callback.vader33
-rw-r--r--test/test_temporary_file_management.vader20
5 files changed, 78 insertions, 0 deletions
diff --git a/ale_linters/java/javac.vim b/ale_linters/java/javac.vim
index 9df95774..d6cb6a4b 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 3e440d1f..f1b27bb7 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 b24e9a8d..32e4d261 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 00000000..52aeff44
--- /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 17a375e1..b66f3d19 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'