mirror of
https://github.com/airblade/vim-gitgutter.git
synced 2025-11-09 12:03:48 -05:00
Use a temporary file for buffer for realtime diffs
`git diff` doesn't perform EOL conversion on stdin, causing it to mistakenly flag every line as having changed when the working tree uses a different EOL than the blobs. Writing the buffer to a temporary file and diffing against that avoids this issue. Fixes #232.
This commit is contained in:
@@ -16,12 +16,19 @@ function! gitgutter#diff#run_diff(realtime, use_external_grep, lines_of_context)
|
|||||||
if a:realtime
|
if a:realtime
|
||||||
let blob_name = ':'.gitgutter#utility#shellescape(gitgutter#utility#file_relative_to_repo_root())
|
let blob_name = ':'.gitgutter#utility#shellescape(gitgutter#utility#file_relative_to_repo_root())
|
||||||
let blob_file = tempname()
|
let blob_file = tempname()
|
||||||
|
let buff_file = tempname()
|
||||||
|
let extension = gitgutter#utility#extension()
|
||||||
|
if !empty(extension)
|
||||||
|
let blob_file .= '.'.extension
|
||||||
|
let buff_file .= '.'.extension
|
||||||
|
endif
|
||||||
let cmd .= 'git show '.blob_name.' > '.blob_file.' && '
|
let cmd .= 'git show '.blob_name.' > '.blob_file.' && '
|
||||||
|
execute('silent write '.buff_file)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let cmd .= 'git diff --no-ext-diff --no-color -U'.a:lines_of_context.' '.g:gitgutter_diff_args.' -- '
|
let cmd .= 'git diff --no-ext-diff --no-color -U'.a:lines_of_context.' '.g:gitgutter_diff_args.' -- '
|
||||||
if a:realtime
|
if a:realtime
|
||||||
let cmd .= blob_file.' - '
|
let cmd .= blob_file.' '.buff_file
|
||||||
else
|
else
|
||||||
let cmd .= gitgutter#utility#shellescape(gitgutter#utility#filename())
|
let cmd .= gitgutter#utility#shellescape(gitgutter#utility#filename())
|
||||||
endif
|
endif
|
||||||
@@ -44,11 +51,11 @@ function! gitgutter#diff#run_diff(realtime, use_external_grep, lines_of_context)
|
|||||||
let cmd .= ')'
|
let cmd .= ')'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if a:realtime
|
|
||||||
let diff = gitgutter#utility#system(gitgutter#utility#command_in_directory_of_file(cmd), gitgutter#utility#buffer_contents())
|
|
||||||
call delete(blob_file)
|
|
||||||
else
|
|
||||||
let diff = gitgutter#utility#system(gitgutter#utility#command_in_directory_of_file(cmd))
|
let diff = gitgutter#utility#system(gitgutter#utility#command_in_directory_of_file(cmd))
|
||||||
|
|
||||||
|
if a:realtime
|
||||||
|
call delete(blob_file)
|
||||||
|
call delete(buff_file)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if gitgutter#utility#shell_error()
|
if gitgutter#utility#shell_error()
|
||||||
|
|||||||
@@ -47,6 +47,10 @@ function! gitgutter#utility#filename()
|
|||||||
return fnamemodify(s:file, ':t')
|
return fnamemodify(s:file, ':t')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! gitgutter#utility#extension()
|
||||||
|
return fnamemodify(s:file, ':e')
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! gitgutter#utility#directory_of_file()
|
function! gitgutter#utility#directory_of_file()
|
||||||
return fnamemodify(s:file, ':h')
|
return fnamemodify(s:file, ':h')
|
||||||
endfunction
|
endfunction
|
||||||
|
|||||||
Reference in New Issue
Block a user