Mercurial > vim-lawrencium
annotate autoload/lawrencium/diff.vim @ 153:b5ce60d1e6b4
Fix missing `endif`.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 11 Nov 2021 12:38:09 -0800 |
parents | 7aa118f73e8c |
children |
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 |