From 60d0b7d0c3f727f32d29e1fc8a9a32dcf4fefbfa Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 6 Jun 2025 12:34:28 +0800 Subject: [PATCH] fix(diff): fix incorrect item size of dout_ga (#34338) Related https://github.com/neovim/neovim/commit/267494151bcc6e4fff7b9b8c80b7a5f42e2aa002 --- src/nvim/diff.c | 2 +- .../fixtures/diff/inline_char_file1 | 12 +++++++ .../fixtures/diff/inline_char_file2 | 12 +++++++ test/functional/ui/diff_spec.lua | 36 +++++++++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 test/functional/fixtures/diff/inline_char_file1 create mode 100644 test/functional/fixtures/diff/inline_char_file2 diff --git a/src/nvim/diff.c b/src/nvim/diff.c index 60f271b084..2728efd8ca 100644 --- a/src/nvim/diff.c +++ b/src/nvim/diff.c @@ -2925,7 +2925,7 @@ static void diff_find_change_inline_diff(diff_T *dp) const int save_diff_algorithm = diff_algorithm; diffio_T dio = { 0 }; - ga_init(&dio.dio_diff.dout_ga, sizeof(char *), 1000); + ga_init(&dio.dio_diff.dout_ga, sizeof(diffhunk_T), 1000); // inline diff only supports internal algo dio.dio_internal = true; diff --git a/test/functional/fixtures/diff/inline_char_file1 b/test/functional/fixtures/diff/inline_char_file1 new file mode 100644 index 0000000000..8a73f21f86 --- /dev/null +++ b/test/functional/fixtures/diff/inline_char_file1 @@ -0,0 +1,12 @@ +aaaa,aaaaaaaa,aaaaaaaaaa,aaaaaaa,aaaaaaa,aaaaaaaaa,aaaaaaaaaaa,aaaaaaaa,aaaaaaaa,aaaaaaaaa,aaaaaaaaaaa,aaaaaaaa,aaaaaaaa,aaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaa,aaaa +aaaaaaa-aaaaaaaaa-aaaaaa-aaa-aaa-aaaaa,aaaa.aaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaaaa.aaaaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaa.aaaaaaaaaaaaaa,aaa.aaaaaaaaaaaa,aaa.aaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aa.aaaaaaaaaaaaaaa,"aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,a,a" +aaaaaaa-aaaaaaaaa-aaaaaa-aaa-aaa-aaaaa,aaaaa.aaaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaaaaa.aaaaaaaaaaa,aaaaaa.aaaaaaaaaa,aaa.aaaaaaaaaaaa,aaa.aaaaaaaaaaaaaa,aaa.aaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaa.aaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aaa.aaaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,"aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,a" +aaaaaaa-aaaaaaaaa-aaaaaa-aaa-aaa-aaaaa,aaaaaa.aaaaaaaaaaa,aaaaaa.aaaaaaaaa,aaaaaa.aaaaaaaaaaa,aaaaaa.aaaaaaaaaa,aaaaaa.aaaaaaaaaaa,aaaaaa.aaaaaaaaaaa,aaaaaa.aaaaaaaaa,aaaaaa.aaaaaaaaaa,aa.aaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaaa,aa.aaaaaaaaaaaaa,aaaaa.aaaaaaaaaaa,a.aaaaaaaaaaaaaaa,"a,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa" +aaaaaaa-aaaaaaaaa-aaaaaa-aaa-aaa-aaaaa,aaaaa.aaaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaaaaa.aaaaaaaaaa,aaaaaa.aaaaaaaaaaa,aaaaa.aaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaaaaa.aaaaaaaaaa,aaaaaa.aaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aaaaa.aaaaaaaaaaa,a.aaaaaaaaaaaaaaa,"a,a,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa" +aaaaaaa-aaaaaaaaa-aaaaaa-aaa-aaa-aaaa,aaaaa.aaaaaaaaaaa,aaaaa.aaaaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaaaa.aaaaaaaaaa,aaaaa.aaaaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaaaa.aaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aaaaa.aaaaaaaaaaa,a.aaaaaaaaaaaaaaa,"a,a,a,aa,aa,aa,aa,aa,aa,aa,aa,aa" +aaaaaaa-aaaaaaaaa-aaaaaa-aaa-aaa-aaaa,aaaa.aaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaaaa.aaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaaa.aaaaaaaaaaaa,aaaa.aaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aaaa.aaaaaaaaaaa,a.aaaaaaaaaaaaaaa,"aa,a,a,a,a,a,a,a,aa,a,a,a" +aaaaaaa-aaaaaaaaa-aaaaaa-aaa-aaa-aaaa,aaaa.aaaaaaaaaaaa,aaaa.aaaaaaaaaaa,aaaaa.aaaaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaa.aaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaaa.aaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,a.aaaaaaaaaaaaaaa,"aa,aa,aa,aa,aa,a,a,a,a,a,a,a" +aaaaaaa-aaaaaaaaa-aaaaaa-aaa-aaa-aaaa,aaaa.aaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaaaa.aaaaaaaaaaaa,aaa.aaaaaaaaaaaaa,aaa.aaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,a.aaaaaaaaaaaaaaa,"aa,aa,aa,aa,aa,aa,a,a,a,a,a,a" +aaaaaaa-aaaaaaaaa-aaaaaa-aaa-aaa-aaaa,aaaa.aaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaaaa.aaaaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaa.aaaaaaaaaaaaa,aaa.aaaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaaa,aaaa.aaaaaaaaaaaa,a.aaaaaaaaaaaaaaa,"aa,aa,aa,aa,aa,aa,aa,a,a,a,a,a" +aaaaaaa-aaaaaaaaa-aaaaaa-aaa-aaa-aaaa,aaaa.aaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaaaa.aaaaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaa.aaaaaaaaaaaaa,aaa.aaaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaaa,aaaa.aaaaaaaaaaaaa,a.aaaaaaaaaaaaaaa,"aa,aa,aa,aa,aa,aa,aa,aa,a,a,a,a" +aaaaaaa-aaaaaaaaa-aaaaaa-aaa-aaa-aaaa,aaaa.aaaaaaaaaaaaa,aaaa.aaaaaaaaaaaa,aaaaa.aaaaaaaaaaaa,aaaaa.aaaaaaaaaaa,aaa.aaaaaaaaaaaaa,aaa.aaaaaaaaaaaaa,aaa.aaaaaaaaaaaaa,aaaa.aaaaaaaaaaa,aa.aaaaaaaaaaaaa,aa.aaaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,aaaa.aaaaaaaaaaaa,aa.aaaaaaaaaaaaaa,"aa,aa,aa,aa,aa,aa,aa,aa,aa,a,a,a" diff --git a/test/functional/fixtures/diff/inline_char_file2 b/test/functional/fixtures/diff/inline_char_file2 new file mode 100644 index 0000000000..ae5951c5e6 --- /dev/null +++ b/test/functional/fixtures/diff/inline_char_file2 @@ -0,0 +1,12 @@ +bbbb,bbbbbbbb,bbbbbbbbbb,bbbbbbb,bbbbbbb,bbbbbbbbb,bbbbbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbbb,bbbbbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbbbbbbbbbbbbb,bbbbbbbbbbbbbbbbb,bbbb +bbbbbbb-bbbbbbbbb-bbbbbb-bbb-bbb-bbbbb,bbbb.bbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bbbbb.bbbbbbbbbbb,bbbbb.bbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bb.bbbbbbbbbbbbbbb,"bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,b,b" +bbbbbbb-bbbbbbbbb-bbbbbb-bbb-bbb-bbbbb,bbbbb.bbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bbbbbb.bbbbbbbbbbb,bbbbbb.bbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,"bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,b" +bbbbbbb-bbbbbbbbb-bbbbbb-bbb-bbb-bbbbb,bbbbbb.bbbbbbbbbbb,bbbbbb.bbbbbbbbbbb,bbbbbb.bbbbbbbbbb,bbbbbb.bbbbbbbbbb,bbbbbb.bbbbbbbbbbb,bbbbbb.bbbbbbbbbbb,bbbbbb.bbbbbbbbbbb,bbbbbb.bbbbbbbbbbb,bb.bbbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bbbbb.bbbbbbbbbbb,b.bbbbbbbbbbbbbbbb,"b,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb" +bbbbbbb-bbbbbbbbb-bbbbbb-bbb-bbb-bbbbb,bbbbb.bbbbbbbbbbb,bbbbb.bbbbbbbbbbb,bbbbbb.bbbbbbbbbbb,bbbbbb.bbbbbbbbbb,bbbbb.bbbbbbbbbbb,bbbbb.bbbbbbbbbbb,bbbbbb.bbbbbbbbbbb,bbbbbb.bbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbb,bb.bbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bbbbb.bbbbbbbbbbb,b.bbbbbbbbbbbbbbbb,"b,b,bb,bb,bb,bb,bb,bb,b,bb,bb,bb" +bbbbbbb-bbbbbbbbb-bbbbbb-bbb-bbb-bbbb,bbbbb.bbbbbbbbbbbb,bbbbb.bbbbbbbbbbbb,bbbbb.bbbbbbbbbbb,bbbbb.bbbbbbbbb,bbbbb.bbbbbbbbbbb,bbbbb.bbbbbbbbbbbb,bbbbb.bbbbbbbbbbb,bbbbb.bbbbbbbbbbb,bb.bbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbbb,bbbbb.bbbbbbbbbbb,b.bbbbbbbbbbbbbbb,"b,b,b,b,b,b,bb,b,b,b,bb,bb" +bbbbbbb-bbbbbbbbb-bbbbbb-bbb-bbb-bbbb,bbbb.bbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bbbbb.bbbbbbbbbbbb,bbbbb.bbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bbbb.bbbbbbbbbbbb,bbbb.bbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,b.bbbbbbbbbbbbbbbb,"b,b,b,b,b,b,b,b,b,b,b,b" +bbbbbbb-bbbbbbbbb-bbbbbb-bbb-bbb-bbbb,bbbb.bbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bbbbb.bbbbbbbbbbbb,bbbbb.bbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbbb.bbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,b.bbbbbbbbbbbbbb,"bb,bb,bb,bb,bb,b,b,b,b,b,b,b" +bbbbbbb-bbbbbbbbb-bbbbbb-bbb-bbb-bbbb,bbbb.bbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bbbbb.bbbbbbbbbbb,bbbbb.bbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,b.bbbbbbbbbbbbbbb,"bb,bb,bb,bb,bb,bb,b,b,b,b,b,b" +bbbbbbb-bbbbbbbbb-bbbbbb-bbb-bbb-bbbb,bbbb.bbbbbbbbbbbb,bbb.bbbbbbbbbbbb,bbbbb.bbbbbbbbbbbb,bbbbb.bbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bbbb.bbbbbbbbbbbb,b.bbbbbbbbbbbbbbb,"bb,bb,bb,bb,bb,bb,bb,b,b,b,b,b" +bbbbbbb-bbbbbbbbb-bbbbbb-bbb-bbb-bbbb,bbbb.bbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bbbbb.bbbbbbbbbbb,bbbbb.bbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,b.bbbbbbbbbbbbbbb,"bb,bb,bb,bb,bb,bb,bb,bb,b,b,b,b" +bbbbbbb-bbbbbbbbb-bbbbbb-bbb-bbb-bbbb,bbbb.bbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bbbbb.bbbbbbbbbbbb,bbbbb.bbbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbbbb,bbb.bbbbbbbbbbbb,bbb.bbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bb.bbbbbbbbbbbbb,bb.bbbbbbbbbbbbbbb,bb.bbbbbbbbbbbbbb,bbbb.bbbbbbbbbbbbb,bb.bbbbbbbbbbbbbbb,"bb,bb,bb,bb,bb,bb,bb,bb,bb,b,b,b" diff --git a/test/functional/ui/diff_spec.lua b/test/functional/ui/diff_spec.lua index 21174eaa45..c5310ce27e 100644 --- a/test/functional/ui/diff_spec.lua +++ b/test/functional/ui/diff_spec.lua @@ -2800,3 +2800,39 @@ it('diff mode inline highlighting with 3 buffers', function() command('diffthis') screen:expect(s6) end) + +it('diff mode algorithm:histogram and inline:char with long lines #34329', function() + local screen = Screen.new(55, 20) + exec([[ + set diffopt=internal,filler,closeoff,algorithm:histogram,inline:char + cd test/functional/fixtures/diff/ + args inline_char_file1 inline_char_file2 + vert all | windo diffthis | 1wincmd w + ]]) + screen:expect([[ + {7: }{27:^aaaa,aaaaaaaa,aaaaaaaaaa,}│{7: }{27:bbbb,bbbbbbbb,bbbbbbbbbb,}| + {7: }{27:aaaaaaa-aaaaaaaaa-aaaaaa-}│{7: }{27:bbbbbbb-bbbbbbbbb-bbbbbb-}|*11 + {1:~ }│{1:~ }|*6 + {3:inline_char_file1 }{2:inline_char_file2 }| + | + ]]) + n.assert_alive() + feed('G$') + screen:expect([[ + {7: }{4: }│{7: }{4: }| + {7: }{27:aa,aa,aa,aa,aa,a,a}{4:" }│{7: }{27:,bb,bb,bb,bb,bb,b,b}{4:" }| + {7: }{27:,aa,aa,aa,aa,aa,a}{4:" }│{7: }{27:b,bb,bb,bb,bb,bb,bb,b}{4:" }| + {7: }{27:,aa,aa,aa,aa,aa}{4:" }│{7: }{27:bb,bb,bb,bb,bb,bb,bb,bb}{4:" }| + {7: }{27:a,aa,aa,aa,aa}{4:" }│{7: }{27:,bb,b,bb,bb,bb}{4:" }| + {7: }{27:aa,aa,aa,aa,aa}{4:" }│{7: }{27:,bb,bb}{4:" }| + {7: }{27:a,a,a}{4:" }│{7: }{27:b,b,b,b,b}{4:" }| + {7: }{27:a,a,a,a,a}{4:" }│{7: }{27:,b,b,b,b,b}{4:" }| + {7: }{27:aa,a,a,a,a,a,a}{4:" }│{7: }{27:b,b,b,b,b,b}{4:" }| + {7: }{27:,aa,aa,a,a,a,a,a}{4:" }│{7: }{27:bb,b,b,b,b,b}{4:" }| + {7: }{27:aa,aa,aa,aa,a,a,a,a}{4:" }│{7: }{27:bb,bb,bb,b,b,b,b}{4:" }| + {7: }{27:,aa,aa,a,a,a}{4:^" }│{7: }{27:bb,bb,bb,bb,b,b,b}{4:" }| + {1:~ }│{1:~ }|*6 + {3:inline_char_file1 }{2:inline_char_file2 }| + | + ]]) +end)