blob: acd2cbd4f23f052f09c907f4fabebabe9ed55a75 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
if exists('g:loaded_diff_changes') || &cp
finish
endif
let g:loaded_diff_changes = 1
let s:foldmethod = &foldmethod
let s:foldenable = &foldenable
let s:diffwindow = 0
function! s:diffstart(read_cmd)
if s:diffwindow != 0
return
endif
let s:foldmethod = &foldmethod
let s:foldenable = &foldenable
let l:filetype = &filetype
vert new
let s:diffwindow = winnr()
set buftype=nofile
try
exe a:read_cmd
catch /.*/
echohl ErrorMsg
echo v:exception
echohl NONE
call s:diffstop()
return
endtry
let &filetype = l:filetype
diffthis
wincmd p
diffthis
endfunction
function! s:diffstop()
if s:diffwindow == 0
return
endif
diffoff!
exe s:diffwindow . 'wincmd w'
bdelete
let &foldmethod = s:foldmethod
let &foldenable = s:foldenable
if &foldenable
if &foldmethod == 'marker'
normal! zv
else
normal! zE
end
endif
let s:diffwindow = 0
endfunction
function! s:vcs_orig(file)
" XXX: would be nice to use a:file rather than # here...
let l:dir = expand('#:p:h')
if filewritable(l:dir . '/.svn') == 2
return system('svn cat ' . a:file)
elseif filewritable(l:dir . '/CVS') == 2
return system("AFILE=" . a:file . "; MODFILE=`tempfile`; DIFF=`tempfile`; cp $AFILE $MODFILE && cvs diff -u $AFILE > $DIFF; patch -R $MODFILE $DIFF 2>&1 > /dev/null && cat $MODFILE; rm $MODFILE $DIFF")
elseif finddir('_darcs', l:dir . ';') =~# '_darcs'
return system('darcs show contents ' . a:file)
elseif finddir('.git', l:dir . ';') =~# '.git'
let l:prefix = system('git rev-parse --show-prefix')
let l:prefix = substitute(l:prefix, '\n', '', 'g')
let l:cmd = 'git show HEAD:'.l:prefix.a:file
return system(l:cmd)
else
throw 'No VCS directory found'
endif
endfunction
command DiffAgainstFilesystem call <SID>diffstart('read # | normal! ggdd')
command DiffAgainstVCS call <SID>diffstart('call append(0, split(s:vcs_orig(expand("#:.")), "\n", 1)) | normal! Gdddd')
command DiffStop call <SID>diffstop()
|