diff --git a/autoload/gitgutter/diff.vim b/autoload/gitgutter/diff.vim index 9e016a4..73b100d 100644 --- a/autoload/gitgutter/diff.vim +++ b/autoload/gitgutter/diff.vim @@ -6,8 +6,8 @@ let s:hunk_re = '^@@ -\(\d\+\),\?\(\d*\) +\(\d\+\),\?\(\d*\) @@' " True for git v1.7.2+. function! s:git_supports_command_line_config_override() abort - call gitgutter#utility#system(gitgutter#git().' -c foo.bar=baz --version') - return !v:shell_error + let [_, error_code] = gitgutter#utility#system(gitgutter#git().' -c foo.bar=baz --version') + return !error_code endfunction let s:c_flag = s:git_supports_command_line_config_override() @@ -89,8 +89,8 @@ function! gitgutter#diff#run_diff(bufnr, from, preserve_full_diff) abort let index_name = gitgutter#utility#get_diff_base(a:bufnr).':'.gitgutter#utility#repo_path(a:bufnr, 1) let cmd = gitgutter#git().' --no-pager show '.index_name let cmd = gitgutter#utility#cd_cmd(a:bufnr, cmd) - call gitgutter#utility#system(cmd) - if v:shell_error + let [_, error_code] = gitgutter#utility#system(cmd) + if error_code throw 'gitgutter file unknown in base' endif endif @@ -176,9 +176,9 @@ function! gitgutter#diff#run_diff(bufnr, from, preserve_full_diff) abort return 'async' else - let diff = gitgutter#utility#system(cmd) + let [diff, error_code] = gitgutter#utility#system(cmd) - if v:shell_error + if error_code call gitgutter#debug#log(diff) throw 'gitgutter diff failed' endif diff --git a/autoload/gitgutter/hunk.vim b/autoload/gitgutter/hunk.vim index 45f3ccc..7546917 100644 --- a/autoload/gitgutter/hunk.vim +++ b/autoload/gitgutter/hunk.vim @@ -309,7 +309,7 @@ function! s:stage(hunk_diff) let cmd = gitgutter#utility#cd_cmd(bufnr, \ gitgutter#git().' add '. \ gitgutter#utility#shellescape(gitgutter#utility#filename(bufnr))) - call gitgutter#utility#system(cmd) + let [_, error_code] = gitgutter#utility#system(cmd) else return endif @@ -317,12 +317,12 @@ function! s:stage(hunk_diff) else let diff = s:adjust_header(bufnr, a:hunk_diff) " Apply patch to index. - call gitgutter#utility#system( + let [_, error_code] = gitgutter#utility#system( \ gitgutter#utility#cd_cmd(bufnr, gitgutter#git().' apply --cached --unidiff-zero - '), \ diff) endif - if v:shell_error + if error_code call gitgutter#utility#warn('Patch does not apply') else if exists('#User#GitGutterStage') diff --git a/autoload/gitgutter/utility.vim b/autoload/gitgutter/utility.vim index f3bbd54..ff3ca7d 100644 --- a/autoload/gitgutter/utility.vim +++ b/autoload/gitgutter/utility.vim @@ -93,10 +93,13 @@ function! gitgutter#utility#system(cmd, ...) abort call gitgutter#debug#log(a:cmd, a:000) call s:use_known_shell() + let prev_error_code = v:shell_error silent let output = (a:0 == 0) ? system(a:cmd) : system(a:cmd, a:1) + let error_code = v:shell_error + silent call system('exit ' . prev_error_code) call s:restore_shell() - return output + return [output, error_code] endfunction function! gitgutter#utility#has_repo_path(bufnr) @@ -161,9 +164,9 @@ function! gitgutter#utility#set_repo_path(bufnr, continuation) abort return 'async' endif - let listing = gitgutter#utility#system(cmd) + let [listing, error_code] = gitgutter#utility#system(cmd) - if v:shell_error + if error_code call gitgutter#utility#setbufvar(a:bufnr, 'path', -2) return endif @@ -184,7 +187,7 @@ function! gitgutter#utility#clean_smudge_filter_applies(bufnr) let cmd = gitgutter#utility#cd_cmd(a:bufnr, \ gitgutter#git().' check-attr filter -- '. \ gitgutter#utility#shellescape(gitgutter#utility#filename(a:bufnr))) - let out = gitgutter#utility#system(cmd) + let [out, _] = gitgutter#utility#system(cmd) let filtered = out !~ 'unspecified' call gitgutter#utility#setbufvar(a:bufnr, 'filter', filtered) endif diff --git a/plugin/gitgutter.vim b/plugin/gitgutter.vim index a3820a7..bb7d50c 100644 --- a/plugin/gitgutter.vim +++ b/plugin/gitgutter.vim @@ -320,11 +320,7 @@ augroup gitgutter " vim -o file1 file2 autocmd VimEnter * if winnr() != winnr('$') | call gitgutter#all(0) | endif - autocmd ShellCmdPost * - \ let s:prev_shell_error = v:shell_error | - \ call gitgutter#all(1) | - \ silent! execute '!exit ' .. s:prev_shell_error | - \ redraw! + autocmd ShellCmdPost * call gitgutter#all(1) autocmd BufLeave term://* call gitgutter#all(1) autocmd User FugitiveChanged call gitgutter#all(1)