Fix #2525 - Convert Windows paths in a Unix environment

This commit is contained in:
w0rp 2019-06-05 14:16:43 +01:00
parent 381fff0e4c
commit 7b78f2b846
No known key found for this signature in database
GPG key ID: 0FC1ECAA8C81CD83
3 changed files with 37 additions and 3 deletions

View file

@ -3,13 +3,20 @@
" simplify a path, and fix annoying issues with paths on Windows.
"
" Forward slashes are changed to back slashes so path equality works better.
" Forward slashes are changed to back slashes so path equality works better
" on Windows. Back slashes are changed to forward slashes on Unix.
"
" Unix paths can technically contain back slashes, but in practice no path
" should, and replacing back slashes with forward slashes makes linters work
" in environments like MSYS.
"
" Paths starting with more than one forward slash are changed to only one
" forward slash, to prevent the paths being treated as special MSYS paths.
function! ale#path#Simplify(path) abort
if has('unix')
return substitute(simplify(a:path), '^//\+', '/', 'g') " no-custom-checks
let l:unix_path = substitute(a:path, '\\', '/', 'g')
return substitute(simplify(l:unix_path), '^//\+', '/', 'g') " no-custom-checks
endif
let l:win_path = substitute(a:path, '/', '\\', 'g')

View file

@ -78,7 +78,7 @@ Execute(The mypy handler should handle Windows names with spaces):
\ {
\ 'lnum': 4,
\ 'col': 0,
\ 'filename': 'C:\something\with spaces.py',
\ 'filename': ale#path#Simplify('C:\something\with spaces.py'),
\ 'type': 'E',
\ 'text': 'No library stub file for module ''django.db''',
\ },

View file

@ -6,6 +6,22 @@ Before:
After:
delfunction CheckPath
Execute(ale#path#Simplify should adjust paths correctly):
if has('unix')
" Multiple slashes should be removed correctly.
AssertEqual '/foo/bar/baz', ale#path#Simplify('////foo///bar///baz')
" Back slashes should be converted to forward slashes.
" This means some valid filenames are adjusted incorrectly, but in practice
" no filenames for code should contain back slashes, and adjusting slashes
" like this makes ALE work in MSYS.
AssertEqual 'foo/bar/baz', ale#path#Simplify('foo\bar\baz')
else
" Multiple slashes should be removed correctly.
AssertEqual '\foo\bar\baz', ale#path#Simplify('\\\foo\bar\baz')
" Forward slashes should be replaced with back slashes.
AssertEqual 'foo\bar\baz', ale#path#Simplify('foo/bar/baz')
endif
Execute(ale#path#IsBufferPath should match simple relative paths):
call ale#test#SetFilename('app/foo.txt')
@ -53,3 +69,14 @@ Execute(ale#path#IsBufferPath should match files in /tmp):
call ale#test#SetFilename('app/test.ts')
Assert ale#path#IsBufferPath(bufnr(''), tempname() . '/test.ts')
Execute(ale#path#IsBufferPath should match Windows paths on Unix):
" This test should pass Unix.
"
" Back slashes in paths should be replaced with forward slashes, even though
" back slashes are valid in filenames on Unix.
if has('unix')
call ale#test#SetFilename('app/foo/test.ts')
Assert ale#path#IsBufferPath(bufnr(''), 'foo\test.ts')
endif