diff --git a/autoload/gitgutter/hunk.vim b/autoload/gitgutter/hunk.vim index 8f939f4..a590f57 100644 --- a/autoload/gitgutter/hunk.vim +++ b/autoload/gitgutter/hunk.vim @@ -294,11 +294,28 @@ endfunction function! s:stage(hunk_diff) let bufnr = bufnr('') - let diff = s:adjust_header(bufnr, a:hunk_diff) - " Apply patch to index. - call gitgutter#utility#system( - \ gitgutter#utility#cd_cmd(bufnr, g:gitgutter_git_executable.' '.g:gitgutter_git_args.' apply --cached --unidiff-zero - '), - \ diff) + + if s:clean_smudge_filter_applies(bufnr) + let choice = input('File uses clean/smudge filter. Stage entire file (y/n)? ') + normal! : + if choice =~ 'y' + let path = gitgutter#utility#repo_path(bufnr, 1) + " Add file to index. + call gitgutter#utility#system( + \ gitgutter#utility#cd_cmd(bufnr, g:gitgutter_git_executable.' '.g:gitgutter_git_args.' add '.path) + \ ) + else + return + endif + + else + let diff = s:adjust_header(bufnr, a:hunk_diff) + " Apply patch to index. + call gitgutter#utility#system( + \ gitgutter#utility#cd_cmd(bufnr, g:gitgutter_git_executable.' '.g:gitgutter_git_args.' apply --cached --unidiff-zero - '), + \ diff) + endif + if v:shell_error call gitgutter#utility#warn('Patch does not apply') else @@ -637,3 +654,17 @@ function gitgutter#hunk#is_preview_window_open() endif return 0 endfunction + + +function! s:clean_smudge_filter_applies(bufnr) + let filtered = gitgutter#utility#getbufvar(a:bufnr, 'filter', -1) + if filtered == -1 + let path = gitgutter#utility#repo_path(a:bufnr, 1) + let out = gitgutter#utility#system( + \ gitgutter#utility#cd_cmd(a:bufnr, g:gitgutter_git_executable.' '.g:gitgutter_git_args.' check-attr filter -- '.path) + \ ) + let filtered = out !~ 'unspecified' + call gitgutter#utility#setbufvar(a:bufnr, 'filter', filtered) + endif + return filtered +endfunction