aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-09-23 12:04:07 +0800
committerGitHub <noreply@github.com>2024-09-23 12:04:07 +0800
commitbfe0acaea167a5ce18d4c63f65ccd45966203413 (patch)
treea53ce3e5b327e8b65b8892b73648016bd13ae989
parente83ce331da9165ad611b31aef9965fa74abaea14 (diff)
downloadrneovim-bfe0acaea167a5ce18d4c63f65ccd45966203413.tar.gz
rneovim-bfe0acaea167a5ce18d4c63f65ccd45966203413.tar.bz2
rneovim-bfe0acaea167a5ce18d4c63f65ccd45966203413.zip
vim-patch:9.1.0740: incorrect internal diff with empty file (#30471)
Problem: incorrect internal diff with an empty file Solution: Set pointer to NULL, instead of using an empty line file (Yukihiro Nakadaira) When using internal diff, empty file is read as one empty line file. So result differs from external diff. closes: vim/vim#15719 https://github.com/vim/vim/commit/f1694b439bb175d956b49da620f1253462ec507b Co-authored-by: Yukihiro Nakadaira <yukihiro.nakadaira@gmail.com>
-rw-r--r--src/nvim/diff.c6
-rw-r--r--test/functional/ui/diff_spec.lua28
-rw-r--r--test/functional/ui/highlight_spec.lua6
-rw-r--r--test/old/testdir/test_diffmode.vim10
4 files changed, 46 insertions, 4 deletions
diff --git a/src/nvim/diff.c b/src/nvim/diff.c
index 7096c5fa8a..0c59b8eb67 100644
--- a/src/nvim/diff.c
+++ b/src/nvim/diff.c
@@ -736,6 +736,12 @@ static void clear_diffout(diffout_T *dout)
/// @return FAIL for failure.
static int diff_write_buffer(buf_T *buf, mmfile_t *m, linenr_T start, linenr_T end)
{
+ if (buf->b_ml.ml_flags & ML_EMPTY) {
+ m->ptr = NULL;
+ m->size = 0;
+ return OK;
+ }
+
size_t len = 0;
if (end < 0) {
diff --git a/test/functional/ui/diff_spec.lua b/test/functional/ui/diff_spec.lua
index bad35dd2af..8db6f776d1 100644
--- a/test/functional/ui/diff_spec.lua
+++ b/test/functional/ui/diff_spec.lua
@@ -614,6 +614,34 @@ int main(int argc, char **argv)
]])
end)
+ it('Diff empty and non-empty file', function()
+ write_file(fname, '', false)
+ write_file(fname_2, 'foo\nbar\nbaz', false)
+ reread()
+
+ feed(':set diffopt=filler<cr>')
+ screen:expect([[
+ {7: }{23:------------------}│{7: }{22:foo }|
+ {7: }{23:------------------}│{7: }{22:bar }|
+ {7: }{23:------------------}│{7: }{22:baz }|
+ {7: }^ │{1:~ }|
+ {1:~ }│{1:~ }|*10
+ {3:<onal-diff-screen-1 }{2:<l-diff-screen-1.2 }|
+ :set diffopt=filler |
+ ]])
+
+ feed(':set diffopt+=internal<cr>')
+ screen:expect([[
+ {7: }{23:------------------}│{7: }{22:foo }|
+ {7: }{23:------------------}│{7: }{22:bar }|
+ {7: }{23:------------------}│{7: }{22:baz }|
+ {7: }^ │{1:~ }|
+ {1:~ }│{1:~ }|*10
+ {3:<onal-diff-screen-1 }{2:<l-diff-screen-1.2 }|
+ :set diffopt+=internal |
+ ]])
+ end)
+
it('diffopt+=icase', function()
write_file(fname, 'a\nb\ncd\n', false)
write_file(fname_2, 'A\nb\ncDe\n', false)
diff --git a/test/functional/ui/highlight_spec.lua b/test/functional/ui/highlight_spec.lua
index 277bd96bd8..87d66fa604 100644
--- a/test/functional/ui/highlight_spec.lua
+++ b/test/functional/ui/highlight_spec.lua
@@ -596,13 +596,13 @@ describe('highlight', function()
]])
screen:expect(
[[
- {1: }^ |
+ {1: }{5:^ }|
{1: }{2:01}{3:234 67}{2:89}{5: }|
{4:~ }|*2
{7:[No Name] [+] }|
- {1: } |
{1: }{6:-----------------------}|
- {4:~ }|
+ {1: }{6:-----------------------}|
+ {1: } |
{8:[No Name] }|
|
]],
diff --git a/test/old/testdir/test_diffmode.vim b/test/old/testdir/test_diffmode.vim
index 31d66ebc4a..84cb7eb376 100644
--- a/test/old/testdir/test_diffmode.vim
+++ b/test/old/testdir/test_diffmode.vim
@@ -997,9 +997,17 @@ func Test_diff_screen()
call WriteDiffFiles(buf, ['a ', 'x', 'cd', 'ef', 'xx xx', 'foo', 'bar'], ['a', 'x', 'c d', ' ef', 'xx xx', 'foo', '', 'bar'])
call VerifyInternal(buf, 'Test_diff_19', " diffopt+=iwhiteeol")
- " Test 19: test diffopt+=iwhiteall
+ " Test 20: test diffopt+=iwhiteall
call VerifyInternal(buf, 'Test_diff_20', " diffopt+=iwhiteall")
+ " Test 21: Delete all lines
+ call WriteDiffFiles(buf, [0], [])
+ call VerifyBoth(buf, "Test_diff_21", "")
+
+ " Test 22: Add line to empty file
+ call WriteDiffFiles(buf, [], [0])
+ call VerifyBoth(buf, "Test_diff_22", "")
+
" clean up
call StopVimInTerminal(buf)
call delete('Xdifile1')