Display not exists symbol correctly in Git repos

This commit fixes a bug, where untracked files in Git repos did not get the not
exists symbol displayed. The fix works by replacing the previous check for
whether currently edited file is a directory or not with a check based on
`findfile`. More detailed explanation follows.

VCS extension to vim-airline checks whether currently edited file is untracked.
The previous `s:get_git_untracked` implementation, which was used for the
aforementioned purpose for Git repos, was buggy, because it did not return the
untracked symbol in most situations, i.e. the edited file is untracked, but it
was treated as if it wasn't.
The root cause was the second clause in boolean expression checking the output
of `git status`:

    if output[0:1] is# '??' && output[3:-2] is? a:file

It was added to make sure we are not checking a directory, but at this point in
the program `a:file` is an absolute path, while output of `git status` is a
relative path from the root of git repo. So the `is?` expression failed in most
situations.
This commit is contained in:
Grzegorz Milka 2016-10-23 12:05:46 +02:00
parent 64d91665fe
commit 2af2bdb424

View File

@ -80,7 +80,7 @@ function! s:get_git_untracked(file)
else else
let output = system(s:git_cmd. shellescape(a:file)) let output = system(s:git_cmd. shellescape(a:file))
let untracked = '' let untracked = ''
if output[0:1] is# '??' && output[3:-2] is? a:file if output[0:1] is# '??'
let untracked = get(g:, 'airline#extensions#branch#notexists', g:airline_symbols.notexists) let untracked = get(g:, 'airline#extensions#branch#notexists', g:airline_symbols.notexists)
endif endif
let s:untracked_git[a:file] = untracked let s:untracked_git[a:file] = untracked
@ -174,18 +174,24 @@ function! airline#extensions#branch#head()
let l:hg_head = s:get_hg_branch() let l:hg_head = s:get_hg_branch()
let l:file = expand("%:p") let l:file = expand("%:p")
" Do not get untracked flag if we are modifying a directory.
let l:is_file_and_not_dir = !isdirectory(l:file)
if !empty(l:git_head) if !empty(l:git_head)
let found_fugitive_head = 1 let found_fugitive_head = 1
let l:heads.git = (!empty(l:hg_head) ? "git:" : '') . s:format_name(l:git_head) let l:heads.git = (!empty(l:hg_head) ? "git:" : '') . s:format_name(l:git_head)
if l:is_file_and_not_dir
call s:get_git_untracked(l:file) call s:get_git_untracked(l:file)
let l:heads.git .= get(s:untracked_git, l:file, '') let l:heads.git .= get(s:untracked_git, l:file, '')
endif endif
endif
if !empty(l:hg_head) if !empty(l:hg_head)
let l:heads.mercurial = (!empty(l:git_head) ? "hg:" : '') . s:format_name(l:hg_head) let l:heads.mercurial = (!empty(l:git_head) ? "hg:" : '') . s:format_name(l:hg_head)
if l:is_file_and_not_dir
call s:get_hg_untracked(l:file) call s:get_hg_untracked(l:file)
let l:heads.mercurial.= get(s:untracked_hg, l:file, '') let l:heads.mercurial.= get(s:untracked_hg, l:file, '')
endif endif
endif
if empty(l:heads) if empty(l:heads)
if s:has_vcscommand if s:has_vcscommand