mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:9.1.1027: no sanitize check when running linematch
Problem: no sanitize check when running linematch
Solution: add sanitize check before applying the linematch algorithm,
similar to diff_find_change() (Jonathon)
closes: vim/vim#16446
ca307efe48
Co-authored-by: Jonathon <jonathonwhite@protonmail.com>
This commit is contained in:
parent
4d0c6cae72
commit
bd145a6c83
@ -2127,7 +2127,8 @@ int diff_check_with_linestatus(win_T *wp, linenr_T lnum, int *linestatus)
|
|||||||
// Useful for scrollbind calculations which need to count all the filler lines
|
// Useful for scrollbind calculations which need to count all the filler lines
|
||||||
// above the screen.
|
// above the screen.
|
||||||
if (lnum >= wp->w_topline && lnum < wp->w_botline
|
if (lnum >= wp->w_topline && lnum < wp->w_botline
|
||||||
&& !dp->is_linematched && diff_linematch(dp)) {
|
&& !dp->is_linematched && diff_linematch(dp)
|
||||||
|
&& diff_check_sanity(curtab, dp)) {
|
||||||
run_linematch_algorithm(dp);
|
run_linematch_algorithm(dp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1147,4 +1147,32 @@ describe('regressions', function()
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- oldtest: Test_linematch_3diffs_sanity_check()
|
||||||
|
it('sanity check with 3 diff buffers', function()
|
||||||
|
clear()
|
||||||
|
screen = Screen.new(75, 20)
|
||||||
|
n.api.nvim_buf_set_lines(0, 0, -1, false, { 'abcd', 'def', 'hij' })
|
||||||
|
n.exec('rightbelow vnew')
|
||||||
|
n.api.nvim_buf_set_lines(0, 0, -1, false, { 'defq', 'hijk', 'nopq' })
|
||||||
|
n.exec('rightbelow vnew')
|
||||||
|
n.api.nvim_buf_set_lines(0, 0, -1, false, { 'hijklm', 'nopqr', 'stuv' })
|
||||||
|
n.exec([[
|
||||||
|
set diffopt+=linematch:60
|
||||||
|
windo diffthis | wincmd t
|
||||||
|
call feedkeys("Aq\<esc>")
|
||||||
|
call feedkeys("GAklm\<esc>")
|
||||||
|
call feedkeys("o")
|
||||||
|
]])
|
||||||
|
screen:expect([[
|
||||||
|
{7: }{22:abcdq }│{7: }{23:----------------------}│{7: }{23:-----------------------}|
|
||||||
|
{7: }{4:def }│{7: }{4:def}{27:q}{4: }│{7: }{23:-----------------------}|
|
||||||
|
{7: }{4:hijk}{27:lm}{4: }│{7: }{4:hijk }│{7: }{4:hijk}{27:lm}{4: }|
|
||||||
|
{7: }{23:----------------------}│{7: }{4:nopq }│{7: }{4:nopq}{27:r}{4: }|
|
||||||
|
{7: }{4:^ }│{7: }{23:----------------------}│{7: }{27:stuv}{4: }|
|
||||||
|
{1:~ }│{1:~ }│{1:~ }|*13
|
||||||
|
{3:[No Name] [+] }{2:[No Name] [+] [No Name] [+] }|
|
||||||
|
{5:-- INSERT --} |
|
||||||
|
]])
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
@ -1247,7 +1247,7 @@ func CloseoffSetup()
|
|||||||
call setline(1, ['one', 'tow', 'three'])
|
call setline(1, ['one', 'tow', 'three'])
|
||||||
diffthis
|
diffthis
|
||||||
call assert_equal(1, &diff)
|
call assert_equal(1, &diff)
|
||||||
only!
|
bw!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_diff_closeoff()
|
func Test_diff_closeoff()
|
||||||
@ -2278,7 +2278,8 @@ func Test_diffget_diffput_linematch()
|
|||||||
call term_sendkeys(buf, "17gg")
|
call term_sendkeys(buf, "17gg")
|
||||||
call term_sendkeys(buf, ":diffput\<CR>")
|
call term_sendkeys(buf, ":diffput\<CR>")
|
||||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_19', {})
|
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_19', {})
|
||||||
|
" clean up
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_linematch_diff()
|
func Test_linematch_diff()
|
||||||
@ -2298,7 +2299,8 @@ func Test_linematch_diff()
|
|||||||
\ 'abc d!',
|
\ 'abc d!',
|
||||||
\ 'd!'])
|
\ 'd!'])
|
||||||
call VerifyScreenDump(buf, 'Test_linematch_diff1', {})
|
call VerifyScreenDump(buf, 'Test_linematch_diff1', {})
|
||||||
|
" clean up
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_linematch_diff_iwhite()
|
func Test_linematch_diff_iwhite()
|
||||||
@ -2324,7 +2326,8 @@ func Test_linematch_diff_iwhite()
|
|||||||
call VerifyScreenDump(buf, 'Test_linematch_diff_iwhite1', {})
|
call VerifyScreenDump(buf, 'Test_linematch_diff_iwhite1', {})
|
||||||
call term_sendkeys(buf, ":set diffopt+=iwhiteall\<CR>")
|
call term_sendkeys(buf, ":set diffopt+=iwhiteall\<CR>")
|
||||||
call VerifyScreenDump(buf, 'Test_linematch_diff_iwhite2', {})
|
call VerifyScreenDump(buf, 'Test_linematch_diff_iwhite2', {})
|
||||||
|
" clean up
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_linematch_diff_grouping()
|
func Test_linematch_diff_grouping()
|
||||||
@ -2361,7 +2364,8 @@ func Test_linematch_diff_grouping()
|
|||||||
\ '?C',
|
\ '?C',
|
||||||
\ '?C'])
|
\ '?C'])
|
||||||
call VerifyScreenDump(buf, 'Test_linematch_diff_grouping2', {})
|
call VerifyScreenDump(buf, 'Test_linematch_diff_grouping2', {})
|
||||||
|
" clean up
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_linematch_diff_scroll()
|
func Test_linematch_diff_scroll()
|
||||||
@ -2392,11 +2396,10 @@ func Test_linematch_diff_scroll()
|
|||||||
call VerifyScreenDump(buf, 'Test_linematch_diff_grouping_scroll1', {})
|
call VerifyScreenDump(buf, 'Test_linematch_diff_grouping_scroll1', {})
|
||||||
call term_sendkeys(buf, "3\<c-e>")
|
call term_sendkeys(buf, "3\<c-e>")
|
||||||
call VerifyScreenDump(buf, 'Test_linematch_diff_grouping_scroll2', {})
|
call VerifyScreenDump(buf, 'Test_linematch_diff_grouping_scroll2', {})
|
||||||
|
" clean up
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func Test_linematch_line_limit_exceeded()
|
func Test_linematch_line_limit_exceeded()
|
||||||
CheckScreendump
|
CheckScreendump
|
||||||
call delete('.Xdifile1.swp')
|
call delete('.Xdifile1.swp')
|
||||||
@ -2443,7 +2446,8 @@ func Test_linematch_line_limit_exceeded()
|
|||||||
" alignment algorithm will run on the largest diff block here
|
" alignment algorithm will run on the largest diff block here
|
||||||
call term_sendkeys(buf, ":set diffopt+=linematch:30\<CR>")
|
call term_sendkeys(buf, ":set diffopt+=linematch:30\<CR>")
|
||||||
call VerifyScreenDump(buf, 'Test_linematch_line_limit_exceeded2', {})
|
call VerifyScreenDump(buf, 'Test_linematch_line_limit_exceeded2', {})
|
||||||
|
" clean up
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_linematch_3diffs()
|
func Test_linematch_3diffs()
|
||||||
@ -2480,6 +2484,31 @@ func Test_linematch_3diffs()
|
|||||||
\ " BBB",
|
\ " BBB",
|
||||||
\ " BBB"])
|
\ " BBB"])
|
||||||
call VerifyScreenDump(buf, 'Test_linematch_3diffs1', {})
|
call VerifyScreenDump(buf, 'Test_linematch_3diffs1', {})
|
||||||
|
" clean up
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" this used to access invalid memory
|
||||||
|
func Test_linematch_3diffs_sanity_check()
|
||||||
|
CheckScreendump
|
||||||
|
call delete('.Xfile_linematch1.swp')
|
||||||
|
call delete('.Xfile_linematch2.swp')
|
||||||
|
call delete('.Xfile_linematch3.swp')
|
||||||
|
let lines =<< trim END
|
||||||
|
set diffopt+=linematch:60
|
||||||
|
call feedkeys("Aq\<esc>")
|
||||||
|
call feedkeys("GAklm\<esc>")
|
||||||
|
call feedkeys("o")
|
||||||
|
END
|
||||||
|
call writefile(lines, 'Xlinematch_3diffs.vim', 'D')
|
||||||
|
call writefile(['abcd', 'def', 'hij'], 'Xfile_linematch1', 'D')
|
||||||
|
call writefile(['defq', 'hijk', 'nopq'], 'Xfile_linematch2', 'D')
|
||||||
|
call writefile(['hijklm', 'nopqr', 'stuv'], 'Xfile_linematch3', 'D')
|
||||||
|
call WriteDiffFiles3(0, [], [], [])
|
||||||
|
let buf = RunVimInTerminal('-d -S Xlinematch_3diffs.vim Xfile_linematch1 Xfile_linematch2 Xfile_linematch3', {})
|
||||||
|
call VerifyScreenDump(buf, 'Test_linematch_3diffs2', {})
|
||||||
|
|
||||||
|
" clean up
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
Loading…
Reference in New Issue
Block a user