summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYukihiro Nakadaira <yukihiro.nakadaira@gmail.com>2024-09-22 11:26:13 +0200
committerChristian Brabandt <cb@256bit.org>2024-09-22 11:26:13 +0200
commitf1694b439bb175d956b49da620f1253462ec507b (patch)
treec2d5102f59112c56bb7dcd1eb3eaf4a98df31676
parenta6de28755ec3fcc86d1ed0b744f1b410a8e9702d (diff)
patch 9.1.0740: incorrect internal diff with empty filev9.1.0740
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: #15719 Signed-off-by: Yukihiro Nakadaira <yukihiro.nakadaira@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r--src/diff.c7
-rw-r--r--src/testdir/dumps/Test_diff_21.dump20
-rw-r--r--src/testdir/dumps/Test_diff_22.dump20
-rw-r--r--src/testdir/test_diffmode.vim10
-rw-r--r--src/version.c2
5 files changed, 58 insertions, 1 deletions
diff --git a/src/diff.c b/src/diff.c
index c50670cdf5..70e2814399 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -760,6 +760,13 @@ diff_write_buffer(buf_T *buf, diffin_T *din)
long len = 0;
char_u *ptr;
+ if (buf->b_ml.ml_flags & ML_EMPTY)
+ {
+ din->din_mmfile.ptr = NULL;
+ din->din_mmfile.size = 0;
+ return OK;
+ }
+
// xdiff requires one big block of memory with all the text.
for (lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum)
len += ml_get_buf_len(buf, lnum) + 1;
diff --git a/src/testdir/dumps/Test_diff_21.dump b/src/testdir/dumps/Test_diff_21.dump
new file mode 100644
index 0000000000..8fc8c6c08b
--- /dev/null
+++ b/src/testdir/dumps/Test_diff_21.dump
@@ -0,0 +1,20 @@
+| +0#0000e05#a8a8a8255@1|0+0#0000000#5fd7ff255| @33||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34
+|~+0&#ffffff0| @35||+1#0000000&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34
+|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|X+3#0000000&|d|i|f|i|l|e|1| @10|1|,|1| @11|A|l@1| |X+1&&|d|i|f|i|l|e|2| @10|0|,|0|-|1| @9|A|l@1
+|:+0&&> @73
diff --git a/src/testdir/dumps/Test_diff_22.dump b/src/testdir/dumps/Test_diff_22.dump
new file mode 100644
index 0000000000..5ab9ae2bbd
--- /dev/null
+++ b/src/testdir/dumps/Test_diff_22.dump
@@ -0,0 +1,20 @@
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|0+0#0000000#5fd7ff255| @33
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@34||+1&&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|X+3#0000000&|d|i|f|i|l|e|1| @10|0|,|0|-|1| @9|A|l@1| |X+1&&|d|i|f|i|l|e|2| @10|1|,|1| @11|A|l@1
+|:+0&&> @73
diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim
index 098d5d0fc6..c391f2dc89 100644
--- a/src/testdir/test_diffmode.vim
+++ b/src/testdir/test_diffmode.vim
@@ -1015,9 +1015,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')
diff --git a/src/version.c b/src/version.c
index f4b7554711..4669e37def 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 740,
+/**/
739,
/**/
738,