diff --git a/autoload/sy.vim b/autoload/sy.vim index c58ddf1..2ed2b70 100644 --- a/autoload/sy.vim +++ b/autoload/sy.vim @@ -55,12 +55,52 @@ function! sy#start() abort " register buffer as active let b:sy.active = 1 - let [ diff, b:sy.type ] = sy#repo#detect() - if b:sy.type == 'unknown' - call sy#disable() - return - endif + call sy#repo#detect(1) + " let [ diff, b:sy.type ] = sy#repo#detect() + " if b:sy.type == 'unknown' + " call sy#disable() + " return + " endif + " " register file as active with found VCS + " let b:sy.stats = [0, 0, 0] + + " let dir = fnamemodify(b:sy.path, ':h') + " if !has_key(g:sy_cache, dir) + " let g:sy_cache[dir] = b:sy.type + " endif + + " if empty(diff) + " " no changes found + " return + " endif + + " inactive buffer.. bail out + elseif !b:sy.active + return + + " retry detecting VCS + elseif b:sy.type == 'unknown' + call sy#repo#detect(0) + + " update signs + else + let diff = sy#repo#get_diff_{b:sy.type}()[1] + let b:sy.id_top = g:id_top + endif + + call sy#update_signs(diff, type) +endfunction + +function! sy#update_signs(diff, type, do_register) abort + if b:sy.type == 'unknown' + echomsg 'DEBUG: type unknown' + " no VCS found + call sy#disable() + return + endif + + if do_register " register file as active with found VCS let b:sy.stats = [0, 0, 0] @@ -73,24 +113,6 @@ function! sy#start() abort " no changes found return endif - - " inactive buffer.. bail out - elseif !b:sy.active - return - - " retry detecting VCS - elseif b:sy.type == 'unknown' - let [ diff, b:sy.type ] = sy#repo#detect() - if b:sy.type == 'unknown' - " no VCS found - call sy#disable() - return - endif - - " update signs - else - let diff = sy#repo#get_diff_{b:sy.type}()[1] - let b:sy.id_top = g:id_top endif if get(g:, 'signify_line_highlight') @@ -99,7 +121,7 @@ function! sy#start() abort call sy#highlight#line_disable() endif - call sy#sign#process_diff(diff) + call sy#sign#process_diff(a:diff) let b:sy.id_top = (g:id_top - 1) diff --git a/autoload/sy/repo.vim b/autoload/sy/repo.vim index c71b1f8..ac00ecf 100644 --- a/autoload/sy/repo.vim +++ b/autoload/sy/repo.vim @@ -16,19 +16,53 @@ function! sy#repo#detect() abort endif for type in vcs_list - let [istype, diff] = sy#repo#get_diff_{type}() - if istype - return [diff, type] - endif + call sy#repo#get_diff_{type}() endfor + " let [istype, diff] = sy#repo#get_diff_{type}() + " if istype + " return [diff, type] + " endif + " endfor - return ['', 'unknown'] + " return ['', 'unknown'] +endfunction + +" Function: s:callback_stdout_nvim {{{1 +function! s:callback_stdout_nvim(_job_id, data, _event) dict abort + if empty(self.stdoutbuf) || empty(self.stdoutbuf[-1]) + let self.stdoutbuf += a:data + else + let self.stdoutbuf = self.stdoutbuf[:2] + \ + [self.stdoutbuf[-1] . get(a:data, 0, '') + \ + a:data[1:] + endif +endfunction + +" Function: s:callback_exit {{{1 +function! s:callback_exit(_job_id, exitcode, _event) dict abort + let [found_diff, diff] = a:exitcode ? [0, ''] : [1, diff] + call sy#update_signs(found_diff, diff) endfunction " Function: #get_diff_git {{{1 function! sy#repo#get_diff_git() abort - let diff = s:run(g:signify_vcs_cmds.git, b:sy_info.file) - return v:shell_error ? [0, ''] : [1, diff] + let cmd = (has('win32') && &shell =~ 'cmd') + \ ? g:signify_vcs_cmds.git + \ : ['sh', '-c', g:signify_vcs_cmds.git] + let cmd = s:expand_cmd(cmd, b:sy_info.file) + if exists('s:job_id_git') + silent! call jobstop(s:job_id_git) + endif + execute b:sy_info.chdir fnameescape(b:sy_info.dir) + try + let s:job_id_git = jobstart(cmd, { + \ 'stdoutbuf': [], + \ 'on_stdout': function('s:callback_stdout_nvim'), + \ 'on_exit': function('s:callback_exit'), + \ }) + finally + execute b:sy_info.chdir b:sy_info.cwd + endtry endfunction " Function: #get_diff_hg {{{1