0
0
mirror of https://github.com/vim/vim.git synced 2025-10-18 07:54:29 -04:00

patch 9.1.0743: diff mode does not handle overlapping diffs correctly

Problem:  diff mode does not handle overlapping diffs correctly
Solution: correct the logic to handle overlapping blocks
          (Yukihiro Nakadaira)

Vim merges overlapped diff blocks and it doesn't work expectedly
in some situation.

closes: #15735

Signed-off-by: Yukihiro Nakadaira <yukihiro.nakadaira@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Yukihiro Nakadaira
2024-09-26 16:19:42 +02:00
committed by Christian Brabandt
parent c854efc6fe
commit 06fe70c183
43 changed files with 1016 additions and 7 deletions

View File

@@ -845,6 +845,15 @@ func WriteDiffFiles(buf, list1, list2)
endif
endfunc
func WriteDiffFiles3(buf, list1, list2, list3)
call writefile(a:list1, 'Xdifile1')
call writefile(a:list2, 'Xdifile2')
call writefile(a:list3, 'Xdifile3')
if a:buf
call term_sendkeys(a:buf, ":checktime\<CR>")
endif
endfunc
" Verify a screendump with both the internal and external diff.
func VerifyBoth(buf, dumpfile, extra)
" trailing : for leaving the cursor on the command line
@@ -2050,4 +2059,203 @@ func Test_diff_eob_halfpage()
exe "norm! \<C-D>"
call assert_equal(8, line('w0'))
%bwipe!
endfunc
func Test_diff_overlapped_diff_blocks_will_be_merged()
CheckScreendump
let lines =<< trim END
func DiffExprStub()
let txt_in = readfile(v:fname_in)
let txt_new = readfile(v:fname_new)
if txt_in == ["line1"] && txt_new == ["line2"]
call writefile(["1c1"], v:fname_out)
elseif txt_in == readfile("Xdiin1") && txt_new == readfile("Xdinew1")
call writefile(readfile("Xdiout1"), v:fname_out)
elseif txt_in == readfile("Xdiin2") && txt_new == readfile("Xdinew2")
call writefile(readfile("Xdiout2"), v:fname_out)
endif
endfunc
END
call writefile(lines, 'XdiffSetup', 'D')
call WriteDiffFiles(0, [], [])
let buf = RunVimInTerminal('-d -S XdiffSetup Xdifile1 Xdifile2', {})
call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
call WriteDiffFiles(buf, ["a", "b"], ["x", "x"])
call writefile(["a", "b"], "Xdiin1")
call writefile(["x", "x"], "Xdinew1")
call writefile(["1c1", "2c2"], "Xdiout1")
call term_sendkeys(buf, ":set diffexpr=DiffExprStub()\<CR>:")
call VerifyBoth(buf, "Test_diff_overlapped_2.01", "")
call term_sendkeys(buf, ":set diffexpr&\<CR>:")
call WriteDiffFiles(buf, ["a", "b", "c"], ["x", "c"])
call writefile(["a", "b", "c"], "Xdiin1")
call writefile(["x", "c"], "Xdinew1")
call writefile(["1c1", "2d1"], "Xdiout1")
call term_sendkeys(buf, ":set diffexpr=DiffExprStub()\<CR>:")
call VerifyBoth(buf, "Test_diff_overlapped_2.02", "")
call term_sendkeys(buf, ":set diffexpr&\<CR>:")
call WriteDiffFiles(buf, ["a", "c"], ["x", "x", "c"])
call writefile(["a", "c"], "Xdiin1")
call writefile(["x", "x", "c"], "Xdinew1")
call writefile(["1c1", "1a2"], "Xdiout1")
call term_sendkeys(buf, ":set diffexpr=DiffExprStub()\<CR>:")
call VerifyBoth(buf, "Test_diff_overlapped_2.03", "")
call term_sendkeys(buf, ":set diffexpr&\<CR>:")
call StopVimInTerminal(buf)
wincmd c
call WriteDiffFiles3(0, [], [], [])
let buf = RunVimInTerminal('-d -S XdiffSetup Xdifile1 Xdifile2 Xdifile3', {})
call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["y", "b", "c"])
call VerifyBoth(buf, "Test_diff_overlapped_3.01", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["a", "y", "c"])
call VerifyBoth(buf, "Test_diff_overlapped_3.02", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["a", "b", "y"])
call VerifyBoth(buf, "Test_diff_overlapped_3.03", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["y", "y", "c"])
call VerifyBoth(buf, "Test_diff_overlapped_3.04", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["a", "y", "y"])
call VerifyBoth(buf, "Test_diff_overlapped_3.05", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["y", "y", "y"])
call VerifyBoth(buf, "Test_diff_overlapped_3.06", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "x"], ["y", "y", "c"])
call VerifyBoth(buf, "Test_diff_overlapped_3.07", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["x", "x", "c"], ["a", "y", "y"])
call VerifyBoth(buf, "Test_diff_overlapped_3.08", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["y", "y", "y", "d", "e"])
call VerifyBoth(buf, "Test_diff_overlapped_3.09", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["y", "y", "y", "y", "e"])
call VerifyBoth(buf, "Test_diff_overlapped_3.10", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["y", "y", "y", "y", "y"])
call VerifyBoth(buf, "Test_diff_overlapped_3.11", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["a", "y", "y", "d", "e"])
call VerifyBoth(buf, "Test_diff_overlapped_3.12", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["a", "y", "y", "y", "e"])
call VerifyBoth(buf, "Test_diff_overlapped_3.13", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["a", "y", "y", "y", "y"])
call VerifyBoth(buf, "Test_diff_overlapped_3.14", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["a", "b", "y", "d", "e"])
call VerifyBoth(buf, "Test_diff_overlapped_3.15", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["a", "b", "y", "y", "e"])
call VerifyBoth(buf, "Test_diff_overlapped_3.16", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["a", "b", "y", "y", "y"])
call VerifyBoth(buf, "Test_diff_overlapped_3.17", "")
call WriteDiffFiles3(buf, ["a", "b"], ["x", "b"], ["y", "y"])
call writefile(["a", "b"], "Xdiin1")
call writefile(["x", "b"], "Xdinew1")
call writefile(["1c1"], "Xdiout1")
call writefile(["a", "b"], "Xdiin2")
call writefile(["y", "y"], "Xdinew2")
call writefile(["1c1", "2c2"], "Xdiout2")
call term_sendkeys(buf, ":set diffexpr=DiffExprStub()\<CR>:")
call VerifyInternal(buf, "Test_diff_overlapped_3.18", "")
call term_sendkeys(buf, ":set diffexpr&\<CR>:")
call WriteDiffFiles3(buf, ["a", "b", "c", "d"], ["x", "b", "x", "d"], ["y", "y", "c", "d"])
call writefile(["a", "b", "c", "d"], "Xdiin1")
call writefile(["x", "b", "x", "d"], "Xdinew1")
call writefile(["1c1", "3c3"], "Xdiout1")
call writefile(["a", "b", "c", "d"], "Xdiin2")
call writefile(["y", "y", "c", "d"], "Xdinew2")
call writefile(["1c1", "2c2"], "Xdiout2")
call term_sendkeys(buf, ":set diffexpr=DiffExprStub()\<CR>:")
call VerifyInternal(buf, "Test_diff_overlapped_3.19", "")
call term_sendkeys(buf, ":set diffexpr&\<CR>:")
call WriteDiffFiles3(buf, ["a", "b", "c", "d"], ["x", "b", "x", "d"], ["y", "y", "y", "d"])
call writefile(["a", "b", "c", "d"], "Xdiin1")
call writefile(["x", "b", "x", "d"], "Xdinew1")
call writefile(["1c1", "3c3"], "Xdiout1")
call writefile(["a", "b", "c", "d"], "Xdiin2")
call writefile(["y", "y", "y", "d"], "Xdinew2")
call writefile(["1c1", "2,3c2,3"], "Xdiout2")
call term_sendkeys(buf, ":set diffexpr=DiffExprStub()\<CR>:")
call VerifyInternal(buf, "Test_diff_overlapped_3.20", "")
call term_sendkeys(buf, ":set diffexpr&\<CR>:")
call WriteDiffFiles3(buf, ["a", "b", "c", "d"], ["x", "b", "x", "d"], ["y", "y", "y", "y"])
call writefile(["a", "b", "c", "d"], "Xdiin1")
call writefile(["x", "b", "x", "d"], "Xdinew1")
call writefile(["1c1", "3c3"], "Xdiout1")
call writefile(["a", "b", "c", "d"], "Xdiin2")
call writefile(["y", "y", "y", "y"], "Xdinew2")
call writefile(["1c1", "2,4c2,4"], "Xdiout2")
call term_sendkeys(buf, ":set diffexpr=DiffExprStub()\<CR>:")
call VerifyInternal(buf, "Test_diff_overlapped_3.21", "")
call term_sendkeys(buf, ":set diffexpr&\<CR>:")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["b", "c"])
call VerifyBoth(buf, "Test_diff_overlapped_3.22", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["c"])
call VerifyBoth(buf, "Test_diff_overlapped_3.23", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], [])
call VerifyBoth(buf, "Test_diff_overlapped_3.24", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["a", "c"])
call VerifyBoth(buf, "Test_diff_overlapped_3.25", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["a"])
call VerifyBoth(buf, "Test_diff_overlapped_3.26", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["b"])
call VerifyBoth(buf, "Test_diff_overlapped_3.27", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["d", "e"])
call VerifyBoth(buf, "Test_diff_overlapped_3.28", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["e"])
call VerifyBoth(buf, "Test_diff_overlapped_3.29", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["a", "d", "e"])
call VerifyBoth(buf, "Test_diff_overlapped_3.30", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["a", "e"])
call VerifyBoth(buf, "Test_diff_overlapped_3.31", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["a"])
call VerifyBoth(buf, "Test_diff_overlapped_3.32", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["a", "b", "d", "e"])
call VerifyBoth(buf, "Test_diff_overlapped_3.33", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["a", "b", "e"])
call VerifyBoth(buf, "Test_diff_overlapped_3.34", "")
call WriteDiffFiles3(buf, ["a", "b", "c", "d", "e"], ["a", "x", "c", "x", "e"], ["a", "b"])
call VerifyBoth(buf, "Test_diff_overlapped_3.35", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["a", "y", "b", "c"])
call VerifyBoth(buf, "Test_diff_overlapped_3.36", "")
call WriteDiffFiles3(buf, ["a", "b", "c"], ["a", "x", "c"], ["a", "b", "y", "c"])
call VerifyBoth(buf, "Test_diff_overlapped_3.37", "")
call StopVimInTerminal(buf)