From 373ad7337b973af149276d67694c543b8cadee6a Mon Sep 17 00:00:00 2001 From: Andy Stewart Date: Tue, 13 Sep 2016 16:11:42 +0100 Subject: [PATCH] Handle buffers which have since been closed in async callbacks. --- autoload/gitgutter/async.vim | 52 +++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/autoload/gitgutter/async.vim b/autoload/gitgutter/async.vim index 91a4511..8243328 100644 --- a/autoload/gitgutter/async.vim +++ b/autoload/gitgutter/async.vim @@ -80,29 +80,34 @@ endfunction function! gitgutter#async#handle_diff_job_nvim(job_id, data, event) abort call gitgutter#debug#log('job_id: '.a:job_id.', event: '.a:event.', buffer: '.self.buffer) - let current_buffer = gitgutter#utility#bufnr() - call gitgutter#utility#set_buffer(self.buffer) + let job_bufnr = self.buffer + if bufexists(job_bufnr) + let current_buffer = gitgutter#utility#bufnr() + call gitgutter#utility#set_buffer(job_bufnr) - if a:event == 'stdout' - " a:data is a list - call s:job_finished(a:job_id) - call gitgutter#handle_diff(gitgutter#utility#stringify(a:data)) - - elseif a:event == 'exit' - " If the exit event is triggered without a preceding stdout event, - " the diff was empty. - if s:is_job_started(a:job_id) - call gitgutter#handle_diff("") + if a:event == 'stdout' + " a:data is a list call s:job_finished(a:job_id) + call gitgutter#handle_diff(gitgutter#utility#stringify(a:data)) + + elseif a:event == 'exit' + " If the exit event is triggered without a preceding stdout event, + " the diff was empty. + if s:is_job_started(a:job_id) + call gitgutter#handle_diff("") + call s:job_finished(a:job_id) + endif + + else " a:event is stderr + call gitgutter#hunk#reset() + call s:job_finished(a:job_id) + endif - else " a:event is stderr - call gitgutter#hunk#reset() + call gitgutter#utility#set_buffer(current_buffer) + else call s:job_finished(a:job_id) - endif - - call gitgutter#utility#set_buffer(current_buffer) endfunction @@ -117,14 +122,17 @@ function! gitgutter#async#handle_diff_job_vim_close(channel) abort call gitgutter#debug#log('channel: '.a:channel) let channel_id = s:channel_id(a:channel) + let job_bufnr = s:job_buffer(channel_id) - let current_buffer = gitgutter#utility#bufnr() - call gitgutter#utility#set_buffer(s:job_buffer(channel_id)) + if bufexists(job_bufnr) + let current_buffer = gitgutter#utility#bufnr() + call gitgutter#utility#set_buffer(job_bufnr) - call gitgutter#handle_diff(s:job_output(channel_id)) + call gitgutter#handle_diff(s:job_output(channel_id)) + + call gitgutter#utility#set_buffer(current_buffer) + endif call s:job_finished(channel_id) - - call gitgutter#utility#set_buffer(current_buffer) endfunction