diff options
author | Nick Diego Yamane <nick.diego@gmail.com> | 2017-12-20 06:10:07 -0400 |
---|---|---|
committer | w0rp <w0rp@users.noreply.github.com> | 2017-12-20 10:10:07 +0000 |
commit | d4b43d23f4a9f277a482fdad4ea3a3e951d80eab (patch) | |
tree | 0d66493a39ced077df4c978b0f1b1f3f30db80ba | |
parent | 1568bf81281507aaaa8c71af85e244e94bd2924c (diff) | |
download | ale-d4b43d23f4a9f277a482fdad4ea3a3e951d80eab.zip |
Add support for linting git commit message files (#1233)
-rw-r--r-- | README.md | 1 | ||||
-rw-r--r-- | ale_linters/gitcommit/gitlint.vim | 51 | ||||
-rw-r--r-- | doc/ale-gitcommit.txt | 42 | ||||
-rw-r--r-- | doc/ale.txt | 3 | ||||
-rw-r--r-- | test/command_callback/python_paths/no_virtualenv/subdir/foo/COMMIT_EDITMSG | 0 | ||||
-rwxr-xr-x | test/command_callback/python_paths/with_virtualenv/env/Scripts/gitlint.exe | 0 | ||||
-rwxr-xr-x | test/command_callback/python_paths/with_virtualenv/env/bin/gitlint | 0 | ||||
-rw-r--r-- | test/command_callback/python_paths/with_virtualenv/subdir/foo/COMMIT_EDITMSG | 0 | ||||
-rw-r--r-- | test/command_callback/test_gitlint_command_callback.vader | 84 | ||||
-rw-r--r-- | test/handler/test_gitlint_handler.vader | 37 |
10 files changed, 218 insertions, 0 deletions
@@ -100,6 +100,7 @@ formatting. | Erlang | [erlc](http://erlang.org/doc/man/erlc.html), [SyntaxErl](https://github.com/ten0s/syntaxerl) | | Fortran | [gcc](https://gcc.gnu.org/) | | FusionScript | [fusion-lint](https://github.com/RyanSquared/fusionscript) | +| Git Commit Messages | [gitlint](https://github.com/jorisroovers/gitlint) | | GLSL | [glslang](https://github.com/KhronosGroup/glslang), [glslls](https://github.com/svenstaro/glsl-language-server) | | Go | [gofmt](https://golang.org/cmd/gofmt/), [goimports](https://godoc.org/golang.org/x/tools/cmd/goimports), [go vet](https://golang.org/cmd/vet/), [golint](https://godoc.org/github.com/golang/lint), [gometalinter](https://github.com/alecthomas/gometalinter) !!, [go build](https://golang.org/cmd/go/) !!, [gosimple](https://github.com/dominikh/go-tools/tree/master/cmd/gosimple) !!, [staticcheck](https://github.com/dominikh/go-tools/tree/master/cmd/staticcheck) !! | | GraphQL | [eslint](http://eslint.org/), [gqlint](https://github.com/happylinks/gqlint) | diff --git a/ale_linters/gitcommit/gitlint.vim b/ale_linters/gitcommit/gitlint.vim new file mode 100644 index 00000000..991d5a1a --- /dev/null +++ b/ale_linters/gitcommit/gitlint.vim @@ -0,0 +1,51 @@ +" Author: Nick Yamane <nick.diego@gmail.com> +" Description: gitlint for git commit message files + +let g:ale_gitcommit_gitlint_executable = +\ get(g:, 'ale_gitcommit_gitlint_executable', 'gitlint') +let g:ale_gitcommit_gitlint_options = get(g:, 'ale_gitcommit_gitlint_options', '') +let g:ale_gitcommit_gitlint_use_global = get(g:, 'ale_gitcommit_gitlint_use_global', 0) + + +function! ale_linters#gitcommit#gitlint#GetExecutable(buffer) abort + return ale#python#FindExecutable(a:buffer, 'gitcommit_gitlint', ['gitlint']) +endfunction + +function! ale_linters#gitcommit#gitlint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'gitcommit_gitlint_options') + let l:executable = ale_linters#gitcommit#gitlint#GetExecutable(a:buffer) + return ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' lint' +endfunction + + +function! ale_linters#gitcommit#gitlint#Handle(buffer, lines) abort + " Matches patterns line the following: + let l:pattern = '\v^(\d+): (\w+) (.*)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:code = l:match[2] + + let l:item = { + \ 'lnum': l:match[1] + 0, + \ 'text': l:code . ': ' . l:match[3], + \ 'type': 'E', + \} + + call add(l:output, l:item) + endfor + + return l:output +endfunction + + +call ale#linter#Define('gitcommit', { +\ 'name': 'gitlint', +\ 'output_stream': 'stderr', +\ 'executable_callback': 'ale_linters#gitcommit#gitlint#GetExecutable', +\ 'command_callback': 'ale_linters#gitcommit#gitlint#GetCommand', +\ 'callback': 'ale_linters#gitcommit#gitlint#Handle', +\}) + diff --git a/doc/ale-gitcommit.txt b/doc/ale-gitcommit.txt new file mode 100644 index 00000000..71813dd0 --- /dev/null +++ b/doc/ale-gitcommit.txt @@ -0,0 +1,42 @@ +=============================================================================== +ALE Git Commit Integration *ale-gitcommit-options* + + +=============================================================================== +gitlint *ale-gitcommit-gitlint* + +g:ale_gitcommit_gitlint_executable *g:ale_gitcommit_gitlint_executable* + *b:ale_gitcommit_gitlint_executable* + Type: |String| + Default: `'gitlint'` + + This variable can be changed to modify the executable used for gitlint. + + +g:ale_gitcommit_gitlint_options *g:ale_gitcommit_gitlint_options* + *b:ale_gitcommit_gitlint_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the gitlint + invocation. + + For example, to dinamically set the gitlint configuration file path, you + may want to set > + + let g:ale_gitcommit_gitlint_options = '-C /home/user/.config/gitlint.ini' +< + +g:ale_gitcommit_gitlint_use_global *g:ale_gitcommit_gitlint_use_global* + *b:ale_gitcommit_gitlint_use_global* + Type: |Number| + Default: `0` + + This variable controls whether or not ALE will search for gitlint in a + virtualenv directory first. If this variable is set to `1`, then ALE will + always use |g:ale_gitcommit_gitlint_executable| for the executable path. + + Both variables can be set with `b:` buffer variables instead. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/doc/ale.txt b/doc/ale.txt index bdcb39fe..7cc6b22a 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -68,6 +68,8 @@ CONTENTS *ale-contents* gcc.................................|ale-fortran-gcc| fusionscript..........................|ale-fuse-options| fusion-lint.........................|ale-fuse-fusionlint| + git commit............................|ale-gitcommit-options| + gitlint.............................|ale-gitcommit-gitlint| glsl..................................|ale-glsl-options| glslang.............................|ale-glsl-glslang| glslls..............................|ale-glsl-glslls| @@ -300,6 +302,7 @@ Notes: * Erlang: `erlc`, `SyntaxErl` * Fortran: `gcc` * FusionScript: `fusion-lint` +* Git Commit Messages: `gitlint` * GLSL: glslang, `glslls` * Go: `gofmt`, `goimports`, `go vet`, `golint`, `gometalinter`!!, `go build`!!, `gosimple`!!, `staticcheck`!! * GraphQL: `eslint`, `gqlint` diff --git a/test/command_callback/python_paths/no_virtualenv/subdir/foo/COMMIT_EDITMSG b/test/command_callback/python_paths/no_virtualenv/subdir/foo/COMMIT_EDITMSG new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/test/command_callback/python_paths/no_virtualenv/subdir/foo/COMMIT_EDITMSG diff --git a/test/command_callback/python_paths/with_virtualenv/env/Scripts/gitlint.exe b/test/command_callback/python_paths/with_virtualenv/env/Scripts/gitlint.exe new file mode 100755 index 00000000..e69de29b --- /dev/null +++ b/test/command_callback/python_paths/with_virtualenv/env/Scripts/gitlint.exe diff --git a/test/command_callback/python_paths/with_virtualenv/env/bin/gitlint b/test/command_callback/python_paths/with_virtualenv/env/bin/gitlint new file mode 100755 index 00000000..e69de29b --- /dev/null +++ b/test/command_callback/python_paths/with_virtualenv/env/bin/gitlint diff --git a/test/command_callback/python_paths/with_virtualenv/subdir/foo/COMMIT_EDITMSG b/test/command_callback/python_paths/with_virtualenv/subdir/foo/COMMIT_EDITMSG new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/test/command_callback/python_paths/with_virtualenv/subdir/foo/COMMIT_EDITMSG diff --git a/test/command_callback/test_gitlint_command_callback.vader b/test/command_callback/test_gitlint_command_callback.vader new file mode 100644 index 00000000..1a40ea7b --- /dev/null +++ b/test/command_callback/test_gitlint_command_callback.vader @@ -0,0 +1,84 @@ +Before: + Save g:ale_gitcommit_gitlint_executable + Save g:ale_gitcommit_gitlint_options + Save g:ale_gitcommit_gitlint_use_global + + unlet! g:ale_gitcommit_gitlint_executable + unlet! g:ale_gitcommit_gitlint_options + unlet! g:ale_gitcommit_gitlint_use_global + + runtime ale_linters/gitcommit/gitlint.vim + call ale#test#SetDirectory('/testplugin/test/command_callback') + + let b:bin_dir = has('win32') ? 'Scripts' : 'bin' + let b:command_tail = ' lint' + +After: + Restore + + call ale#test#RestoreDirectory() + call ale#linter#Reset() + + unlet! b:bin_dir + unlet! b:executable + +Execute(The gitlint callbacks should return the correct default values): + AssertEqual + \ 'gitlint', + \ ale_linters#gitcommit#gitlint#GetExecutable(bufnr('')) + AssertEqual + \ ale#Escape('gitlint') . b:command_tail, + \ ale_linters#gitcommit#gitlint#GetCommand(bufnr('')) + +Execute(The gitlint executable should be configurable, and escaped properly): + let g:ale_gitcommit_gitlint_executable = 'executable with spaces' + + AssertEqual + \ 'executable with spaces', + \ ale_linters#gitcommit#gitlint#GetExecutable(bufnr('')) + AssertEqual + \ ale#Escape('executable with spaces') . b:command_tail, + \ ale_linters#gitcommit#gitlint#GetCommand(bufnr('')) + +Execute(The gitlint command callback should let you set options): + let g:ale_gitcommit_gitlint_options = '--some-option' + + AssertEqual + \ ale#Escape('gitlint') . ' --some-option' . b:command_tail, + \ ale_linters#gitcommit#gitlint#GetCommand(bufnr('')) + +Execute(The gitlint callbacks shouldn't detect virtualenv directories where they don't exist): + silent execute 'file ' . fnameescape(g:dir . '/python_paths/no_virtualenv/subdir/foo/COMMIT_EDITMSG') + + AssertEqual + \ 'gitlint', + \ ale_linters#gitcommit#gitlint#GetExecutable(bufnr('')) + AssertEqual + \ ale#Escape('gitlint') . b:command_tail, + \ ale_linters#gitcommit#gitlint#GetCommand(bufnr('')) + +Execute(The gitlint callbacks should detect virtualenv directories): + silent execute 'file ' . fnameescape(g:dir . '/python_paths/with_virtualenv/subdir/foo/COMMIT_EDITMSG') + + let b:executable = ale#path#Winify( + \ g:dir . '/python_paths/with_virtualenv/env/' . b:bin_dir . '/gitlint' + \) + + AssertEqual + \ b:executable, + \ ale_linters#gitcommit#gitlint#GetExecutable(bufnr('')) + + AssertEqual + \ ale#Escape(b:executable) . b:command_tail, + \ ale_linters#gitcommit#gitlint#GetCommand(bufnr('')) + +Execute(You should able able to use the global gitlint instead): + silent execute 'file ' . fnameescape(g:dir . '/python_paths/with_virtualenv/subdir/foo/COMMIT_EDITMSG') + let g:ale_gitcommit_gitlint_use_global = 1 + + AssertEqual + \ 'gitlint', + \ ale_linters#gitcommit#gitlint#GetExecutable(bufnr('')) + AssertEqual + \ ale#Escape('gitlint') . b:command_tail, + \ ale_linters#gitcommit#gitlint#GetCommand(bufnr('')) diff --git a/test/handler/test_gitlint_handler.vader b/test/handler/test_gitlint_handler.vader new file mode 100644 index 00000000..58f5e67d --- /dev/null +++ b/test/handler/test_gitlint_handler.vader @@ -0,0 +1,37 @@ +Before: + runtime ale_linters/gitcommit/gitlint.vim + +After: + call ale#linter#Reset() + +Execute(The gitlint handler should handle basic warnings and syntax errors): + AssertEqual + \ [ + \ { + \ 'lnum': 1, + \ 'type': 'E', + \ 'text': 'B6: Body message is missing', + \ }, + \ { + \ 'lnum': 2, + \ 'type': 'E', + \ 'text': 'B4: Second line is not empty: "to send to upstream"', + \ }, + \ { + \ 'lnum': 3, + \ 'type': 'E', + \ 'text': 'B5: Body message is too short (19<20): "to send to upstream"', + \ }, + \ { + \ 'lnum': 8, + \ 'type': 'E', + \ 'text': 'T1: Title exceeds max length (92>72): "some very long commit subject line where the author can''t wait to explain what he just fixed"' + \ }, + \ ], + \ ale_linters#gitcommit#gitlint#Handle(1, [ + \ '1: B6 Body message is missing', + \ '2: B4 Second line is not empty: "to send to upstream"', + \ '3: B5 Body message is too short (19<20): "to send to upstream"', + \ '8: T1 Title exceeds max length (92>72): "some very long commit subject line where the author can''t wait to explain what he just fixed"' + \ ]) + |