On Mon, Nov 26, 2007 at 12:25:19AM +0000, Jan Hudec wrote: > On Sun, Nov 25, 2007 at 22:18:31 +0100, Pierre Habouzit wrote: > > My question is: what do you think is the best way to do that, and > > where ? > > Are you talking about the ftplugins/git.vim script from vim-scripts package, > right? Yes, its author. > All it needs to do is call 'git diff --cached'. The below patch seems to work > here (tried commit, commit -a, commit --amend, commit -a --amend and commit > from subdirectory and they seemed to all work). Damn if that's so simple, I really feel like a big fool now. > > [0] the issue with this approach is that it's completely broken in > > amending mode (does not shows the proper thing), and the generated > > I didn't find any issue with amending mode (showed incremental diff for me > all right). The problem was when a file was being touched by the commit but > work tree had unstaged changes. Such changes were shown when they shouldn't. Yep, that's the point. > > diffs aren't excellent, because as an editor plugin, it's hard to > > treat renames and copies easily, so I generate really really nasty > > diffs in that case too. > > With --cached, detecting copies is just a matter of adding -C. In the patch > below I added only one -C, but it should probably be user-configurable to use > no, one or two (equivalent of --find-copies-harder). Sure, I'll do that obviously. Thanks a lot for the tip. > > -- > Jan 'Bulb' Hudec <bulb@xxxxxx> > > ---8<--- > --- vim-scripts/ftplugin/git.vim.orig 2007-07-24 09:46:19.000000000 +0200 > +++ vim-scripts/ftplugin/git.vim 2007-11-26 01:01:59.000000000 +0100 > @@ -14,41 +14,6 @@ > "{{{ function Git_diff_windows > > function! Git_diff_windows(vertsplit, auto) > - let i = 0 > - let list_of_files = '' > - > - " drop everything until '# (will commit)' and the next empty line > - while i <= line('$') > - let line = getline(i) > - if line == '# Changes to be committed:' > - let i = i + 3 > - break > - endif > - > - let i = i + 1 > - endwhile > - > - " read file names until we have EOF or an empty line > - while i <= line('$') > - let line = getline(i) > - if line =~ '^#\s*[a-z ]*:.*->.*$' > - let file = substitute(line, '^#[^:]*:.*->\s*\(.*\)\s*$', '\1', '') > - let list_of_files = list_of_files . ' '.file > - let file = substitute(line, '^#[^:]*:\s*\(.*\)\s*->.*$', '\1', '') > - let list_of_files = list_of_files . ' '.file > - elseif line =~ '^#\s*[a-z ]*:' > - let file = substitute(line, '^#[^:]*:\s*\(.*\)\s*$', '\1', '') > - let list_of_files = list_of_files . ' '.file > - elseif line =~ '^#\s*$' > - break > - endif > - > - let i = i + 1 > - endwhile > - > - if list_of_files == "" > - return > - endif > > if a:vertsplit > rightbelow vnew > @@ -56,15 +21,8 @@ > rightbelow new > endif > silent! setlocal ft=diff previewwindow bufhidden=delete nobackup noswf nobuflisted nowrap buftype=nofile > - let gitDir = system('git rev-parse --git-dir 2>/dev/null') > - let gitDir = substitute(gitDir, '.git\n', '', '') > - let wd = getcwd() > - if gitDir != '' > - exe 'cd '.gitDir > - endif > - exe 'normal :r!LANG=C git diff HEAD -- ' . list_of_files . "\n1Gdd" > - exe 'normal :r!LANG=C git diff --stat HEAD -- ' . list_of_files . "\no\<esc>1GddO\<esc>" > - exe 'cd '.wd > + exe "normal :r!LANG=C git diff --cached -C\n1Gdd" > + exe "normal :r!LANG=C git diff --stat --cached -C\no\<esc>1GddO\<esc>" > setlocal nomodifiable > noremap <buffer> q :bw<cr> > if a:auto -- ·O· Pierre Habouzit ··O madcoder@xxxxxxxxxx OOO http://www.madism.org
Attachment:
pgpEMjwrohwf9.pgp
Description: PGP signature