annotate autoload/lawrencium/diff.vim @ 150:7aa118f73e8c

Improve support for moved files in diff commands. Now we only check for moved files if we get an empty diff/cat output from the normal codepath. We also do that for both sides of a diff, and for the diff-summary commands.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 10 Oct 2020 09:30:27 -0700
parents 5e72afea669c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
139
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 function! lawrencium#diff#init() abort
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 call lawrencium#add_command("-nargs=* Hgdiff :call lawrencium#diff#HgDiff('%:p', 0, <f-args>)")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 call lawrencium#add_command("-nargs=* Hgvdiff :call lawrencium#diff#HgDiff('%:p', 1, <f-args>)")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 call lawrencium#add_command("-nargs=* Hgtabdiff :call lawrencium#diff#HgDiff('%:p', 2, <f-args>)")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 call lawrencium#add_command("-nargs=* Hgdiffsum :call lawrencium#diff#HgDiffSummary('%:p', 0, <f-args>)")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 call lawrencium#add_command("-nargs=* Hgdiffsumsplit :call lawrencium#diff#HgDiffSummary('%:p', 1, <f-args>)")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 call lawrencium#add_command("-nargs=* Hgvdiffsumsplit :call lawrencium#diff#HgDiffSummary('%:p', 2, <f-args>)")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 call lawrencium#add_command("-nargs=* Hgtabdiffsum :call lawrencium#diff#HgDiffSummary('%:p', 3, <f-args>)")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 call lawrencium#add_reader('diff', 'lawrencium#diff#read')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 endfunction
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 function! lawrencium#diff#read(repo, path_parts, full_path) abort
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 let l:diffargs = []
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 let l:commaidx = stridx(a:path_parts['value'], ',')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 if l:commaidx > 0
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 let l:rev1 = strpart(a:path_parts['value'], 0, l:commaidx)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 let l:rev2 = strpart(a:path_parts['value'], l:commaidx + 1)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 if l:rev1 == '-'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 let l:diffargs = [ '-r', l:rev2 ]
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 elseif l:rev2 == '-'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 let l:diffargs = [ '-r', l:rev1 ]
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 else
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 let l:diffargs = [ '-r', l:rev1, '-r', l:rev2 ]
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 elseif a:path_parts['value'] != ''
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 let l:diffargs = [ '-c', a:path_parts['value'] ]
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 else
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 let l:diffargs = []
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 if a:path_parts['path'] != '' && a:path_parts['path'] != '.'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 call add(l:diffargs, a:full_path)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 call a:repo.ReadCommandOutput('diff', l:diffargs)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 setlocal filetype=diff
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 setlocal nofoldenable
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 endfunction
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 function! lawrencium#diff#HgDiff(filename, split, ...) abort
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 " Default revisions to diff: the working directory (null string)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 " and the parent of the working directory (using Mercurial's revsets syntax).
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 " Otherwise, use the 1 or 2 revisions specified as extra parameters.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 let l:rev1 = 'p1()'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 let l:rev2 = ''
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 if a:0 == 1
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 if type(a:1) == type([])
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 if len(a:1) >= 2
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 let l:rev1 = a:1[0]
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 let l:rev2 = a:1[1]
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 elseif len(a:1) == 1
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 let l:rev1 = a:1[0]
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 else
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 let l:rev1 = a:1
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 elseif a:0 == 2
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 let l:rev1 = a:1
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 let l:rev2 = a:2
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 " Get the current repo, and expand the given filename in case it contains
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64 " fancy filename modifiers.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 let l:repo = lawrencium#hg_repo()
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 let l:path = expand(a:filename)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 let l:diff_id = localtime()
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 call lawrencium#trace("Diff'ing '".l:rev1."' and '".l:rev2."' on file: ".l:path)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 " Get the first file and open it.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71 let l:cleanupbufnr = -1
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 if l:rev1 == ''
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 if a:split == 2
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 " Don't use `tabedit` here because if `l:path` is the same as
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 " the current path, it will also reload the buffer in the current
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 " tab/window for some reason, which causes all state to be lost
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 " (all folds get collapsed again, cursor is moved to start, etc.)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 tabnew
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 let l:cleanupbufnr = bufnr('%')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 execute 'edit ' . fnameescape(l:path)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 else
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 if bufexists(l:path)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 execute 'buffer ' . fnameescape(l:path)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 else
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 execute 'edit ' . fnameescape(l:path)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 " Make it part of the diff group.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 call s:HgDiff_DiffThis(l:diff_id)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 else
150
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
91 let l:rev_path = l:repo.GetLawrenciumPath(l:path, 'rev', l:rev1)
139
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 if a:split == 2
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 " See comments above about avoiding `tabedit`.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 tabnew
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 let l:cleanupbufnr = bufnr('%')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 execute 'edit ' . fnameescape(l:rev_path)
150
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
98 if s:is_empty_buf()
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
99 " The buffer is empty. That can happen if the file was moved
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
100 " since this revision.
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
101 let l:rev_path = s:GetLawrenciumRevisionPathMaybeMoved(l:repo, l:path, l:rev1)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
102 if l:rev_path != ''
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
103 execute 'edit ' . fnameescape(l:rev_path)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
104 endif
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
105 endif
139
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 " Make it part of the diff group.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 call s:HgDiff_DiffThis(l:diff_id)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 if l:cleanupbufnr >= 0 && bufloaded(l:cleanupbufnr)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 execute 'bdelete ' . l:cleanupbufnr
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 " Get the second file and open it too.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 " Don't use `diffsplit` because it will set `&diff` before we get a chance
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115 " to save a bunch of local settings that we will want to restore later.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 let l:diffsplit = 'split'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 if a:split >= 1
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118 let l:diffsplit = 'vsplit'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 if l:rev2 == ''
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 execute l:diffsplit . ' ' . fnameescape(l:path)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 else
150
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
123 let l:rev_path = l:repo.GetLawrenciumPath(l:path, 'rev', l:rev2)
139
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 execute l:diffsplit . ' ' . fnameescape(l:rev_path)
150
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
125 if s:is_empty_buf()
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
126 let l:rev_path = s:GetLawrenciumRevisionPathMaybeMoved(l:repo, l:path, l:rev2)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
127 if l:rev_path != ''
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
128 execute 'edit ' . fnameescape(l:rev_path)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
129 endif
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
130 endif
139
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
132 call s:HgDiff_DiffThis(l:diff_id)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133 endfunction
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134
150
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
135 function! s:GetLawrenciumRevisionPathMaybeMoved(repo, path, rev)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
136 let l:abs_path = s:get_real_path_if_copied(a:repo, a:path, a:rev)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
137 if l:abs_path != ''
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
138 return a:repo.GetLawrenciumPath(l:abs_path, 'rev', a:rev)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
139 else
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
140 return ''
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
141 endif
149
5e72afea669c Fix :Hgvdiff with a file that is a copy.
Shane Harper <shane@shaneharper.net>
parents: 141
diff changeset
142 endfunction
5e72afea669c Fix :Hgvdiff with a file that is a copy.
Shane Harper <shane@shaneharper.net>
parents: 141
diff changeset
143
150
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
144 function! s:GetLawrenciumDiffPathMaybeMoved(repo, path, rev)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
145 let l:abs_path = s:get_real_path_if_copied(a:repo, a:path, a:rev)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
146 if l:abs_path != ''
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
147 return a:repo.GetLawrenciumPath(l:abs_path, 'diff', a:rev)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
148 else
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
149 return ''
149
5e72afea669c Fix :Hgvdiff with a file that is a copy.
Shane Harper <shane@shaneharper.net>
parents: 141
diff changeset
150 endif
150
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
151 endfunction
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
152
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
153 function! s:is_empty_buf()
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
154 return getpos('$') == [0, 1, 1, 0]
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
155 endfunction
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
156
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
157 function! s:get_real_path_if_copied(repo, path, revision)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
158 let l:status_out = a:repo.RunCommand('status', '--copies', '--rev', a:revision, a:path)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
159 let l:copied_name = matchstr(
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
160 \ l:status_out,
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
161 \ '^A .\{-}\n \zs[^\n]\+')
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
162 if !empty(l:copied_name)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
163 let l:copied_path = (a:repo.root_dir . '/' . l:copied_name)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
164 call lawrencium#trace("Found move: ".a:path." -> ".l:copied_path)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
165 return l:copied_path
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
166 else
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
167 return ''
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
168 endif
149
5e72afea669c Fix :Hgvdiff with a file that is a copy.
Shane Harper <shane@shaneharper.net>
parents: 141
diff changeset
169 endfunction
5e72afea669c Fix :Hgvdiff with a file that is a copy.
Shane Harper <shane@shaneharper.net>
parents: 141
diff changeset
170
5e72afea669c Fix :Hgvdiff with a file that is a copy.
Shane Harper <shane@shaneharper.net>
parents: 141
diff changeset
171 function! s:is_tip_revision(rev)
5e72afea669c Fix :Hgvdiff with a file that is a copy.
Shane Harper <shane@shaneharper.net>
parents: 141
diff changeset
172 return a:rev ==# 'tip' || a:rev ==# 'p1()' || a:rev == '-1' " TODO: Check for other ways of specifying the tip revision.
5e72afea669c Fix :Hgvdiff with a file that is a copy.
Shane Harper <shane@shaneharper.net>
parents: 141
diff changeset
173 endfunction
5e72afea669c Fix :Hgvdiff with a file that is a copy.
Shane Harper <shane@shaneharper.net>
parents: 141
diff changeset
174
139
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
175 function! lawrencium#diff#HgDiffThis(diff_id)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
176 call s:HgDiff_DiffThis(a:diff_id)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177 endfunction
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
178
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
179 function! s:HgDiff_DiffThis(diff_id) abort
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
180 " Store some commands to run when we exit diff mode.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
181 " It's needed because `diffoff` reverts those settings to their default
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
182 " values, instead of their previous ones.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
183 if &diff
141
4d5f4233b04e Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents: 139
diff changeset
184 call lawrencium#throwerr("Calling diffthis too late on a buffer!")
139
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185 return
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
187 call lawrencium#trace('Enabling diff mode on ' . bufname('%'))
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
188 let w:lawrencium_diffoff = {}
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
189 let w:lawrencium_diffoff['&diff'] = 0
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
190 let w:lawrencium_diffoff['&wrap'] = &l:wrap
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
191 let w:lawrencium_diffoff['&scrollopt'] = &l:scrollopt
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
192 let w:lawrencium_diffoff['&scrollbind'] = &l:scrollbind
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
193 let w:lawrencium_diffoff['&cursorbind'] = &l:cursorbind
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
194 let w:lawrencium_diffoff['&foldmethod'] = &l:foldmethod
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
195 let w:lawrencium_diffoff['&foldcolumn'] = &l:foldcolumn
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
196 let w:lawrencium_diffoff['&foldenable'] = &l:foldenable
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
197 let w:lawrencium_diff_id = a:diff_id
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
198 diffthis
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
199 autocmd BufWinLeave <buffer> call s:HgDiff_CleanUp()
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
200 endfunction
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
201
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
202 function! s:HgDiff_DiffOff(...) abort
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
203 " Get the window name (given as a paramter, or current window).
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
204 let l:nr = a:0 ? a:1 : winnr()
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
205
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
206 " Run the commands we saved in `HgDiff_DiffThis`, or just run `diffoff`.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
207 let l:backup = getwinvar(l:nr, 'lawrencium_diffoff')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
208 if type(l:backup) == type({}) && len(l:backup) > 0
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
209 call lawrencium#trace('Disabling diff mode on ' . l:nr)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
210 for key in keys(l:backup)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
211 call setwinvar(l:nr, key, l:backup[key])
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
212 endfor
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
213 call setwinvar(l:nr, 'lawrencium_diffoff', {})
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
214 else
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
215 call lawrencium#trace('Disabling diff mode on ' . l:nr . ' (but no true restore)')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
216 diffoff
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
217 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
218 endfunction
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
219
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
220 function! s:HgDiff_GetDiffWindows(diff_id) abort
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221 let l:result = []
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 for nr in range(1, winnr('$'))
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
223 if getwinvar(nr, '&diff') && getwinvar(nr, 'lawrencium_diff_id') == a:diff_id
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
224 call add(l:result, nr)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
225 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
226 endfor
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227 return l:result
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
228 endfunction
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
229
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
230 function! s:HgDiff_CleanUp() abort
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
231 " If we're not leaving one of our diff window, do nothing.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232 if !&diff || !exists('w:lawrencium_diff_id')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
233 return
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
234 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
235
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
236 " If there will be only one diff window left (plus the one we're leaving),
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
237 " turn off diff in it and restore its local settings.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
238 let l:nrs = s:HgDiff_GetDiffWindows(w:lawrencium_diff_id)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
239 if len(l:nrs) <= 2
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
240 call lawrencium#trace('Disabling diff mode in ' . len(l:nrs) . ' windows.')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
241 for nr in l:nrs
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
242 if getwinvar(nr, '&diff')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
243 call s:HgDiff_DiffOff(nr)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
244 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
245 endfor
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
246 else
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
247 call lawrencium#trace('Still ' . len(l:nrs) . ' diff windows open.')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
248 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
249 endfunction
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
250
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
251 function! lawrencium#diff#HgDiffSummary(filename, present_args, ...) abort
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
252 " Default revisions to diff: the working directory (null string)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
253 " and the parent of the working directory (using Mercurial's revsets syntax).
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
254 " Otherwise, use the 1 or 2 revisions specified as extra parameters.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
255 let l:revs = ''
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
256 if a:0 == 1
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
257 if type(a:1) == type([])
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
258 if len(a:1) >= 2
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
259 let l:revs = a:1[0] . ',' . a:1[1]
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
260 elseif len(a:1) == 1
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
261 let l:revs = a:1[0]
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
262 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 else
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
264 let l:revs = a:1
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266 elseif a:0 >= 2
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267 let l:revs = a:1 . ',' . a:2
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
268 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
269
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
270 " Get the current repo, and expand the given filename in case it contains
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
271 " fancy filename modifiers.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
272 let l:repo = lawrencium#hg_repo()
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
273 let l:path = expand(a:filename)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
274 call lawrencium#trace("Diff'ing revisions: '".l:revs."' on file: ".l:path)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
275 let l:special = l:repo.GetLawrenciumPath(l:path, 'diff', l:revs)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
276
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277 " Build the correct edit command, and switch to the correct window, based
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
278 " on the presentation arguments we got.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
279 if type(a:present_args) == type(0)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
280 " Just got a split mode.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
281 let l:valid_args = {'split_mode': a:present_args}
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
282 else
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
283 " Got complex args.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
284 let l:valid_args = a:present_args
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
285 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
286
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
287 " First, see if we should reuse an existing window based on some buffer
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
288 " variable.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
289 let l:target_winnr = -1
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
290 let l:split = get(l:valid_args, 'split_mode', 0)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
291 let l:reuse_id = get(l:valid_args, 'reuse_id', '')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
292 let l:avoid_id = get(l:valid_args, 'avoid_win', -1)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 if l:reuse_id != ''
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 let l:target_winnr = lawrencium#find_buffer_window(l:reuse_id, 1)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
295 if l:target_winnr > 0 && l:split != 3
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
296 " Unless we'll be opening in a new tab, don't split anymore, since
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
297 " we found the exact window we wanted.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
298 let l:split = 0
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
299 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
300 call lawrencium#trace("Looking for window with '".l:reuse_id."', found: ".l:target_winnr)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
301 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
302 " If we didn't find anything, see if we should use the current or previous
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
303 " window.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
304 if l:target_winnr <= 0
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
305 let l:use_prev_win = get(l:valid_args, 'use_prev_win', 0)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
306 if l:use_prev_win
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
307 let l:target_winnr = winnr('#')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
308 call lawrencium#trace("Will use previous window: ".l:target_winnr)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
309 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
310 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
311 " And let's see if we have a window we should actually avoid.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
312 if l:avoid_id >= 0 &&
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
313 \(l:target_winnr == l:avoid_id ||
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
314 \(l:target_winnr <= 0 && winnr() == l:avoid_id))
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
315 for wnr in range(1, winnr('$'))
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
316 if wnr != l:avoid_id
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
317 call lawrencium#trace("Avoiding using window ".l:avoid_id.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
318 \", now using: ".wnr)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
319 let l:target_winnr = wnr
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
320 break
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
321 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
322 endfor
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
323 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
324 " Now let's see what kind of split we want to use, if any.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
325 let l:cmd = 'edit '
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
326 if l:split == 1
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
327 let l:cmd = 'rightbelow split '
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
328 elseif l:split == 2
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
329 let l:cmd = 'rightbelow vsplit '
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
330 elseif l:split == 3
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
331 let l:cmd = 'tabedit '
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
332 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
333
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
334 " All good now, proceed.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335 if l:target_winnr > 0
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
336 execute l:target_winnr . "wincmd w"
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
337 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
338 execute 'keepalt ' . l:cmd . fnameescape(l:special)
150
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
339 if s:is_empty_buf()
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
340 let l:special = s:GetLawrenciumDiffPathMaybeMoved(l:repo, l:path, l:revs)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
341 if l:special != ''
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
342 execute 'keepalt edit ' . fnameescape(l:special)
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
343 endif
7aa118f73e8c Improve support for moved files in diff commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 149
diff changeset
344 endif
139
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
345
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
346 " Set the reuse ID if we had one.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
347 if l:reuse_id != ''
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
348 call lawrencium#trace("Setting reuse ID '".l:reuse_id."' on buffer: ".bufnr('%'))
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
349 call setbufvar('%', l:reuse_id, 1)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
350 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
351 endfunction
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
352