patch 9.1.0099: Not able to use diff() with 'diffexpr'

Commit: 
https://github.com/vim/vim/commit/a0010a186d93187d2b69b857d75db8a1e01049bb
Author: Yegappan Lakshmanan <[email protected]>
Date:   Mon Feb 12 20:21:26 2024 +0100

    patch 9.1.0099: Not able to use diff() with 'diffexpr'
    
    Problem:  Not able to use diff() with 'diffexpr'
              (rickhowe, after v9.1.0096)
    Solution: Use a default context length of 0, update diff() help text,
              add a test for using diff() with 'diffexpr'
              (Yegappan Lakshmanan)
    
    closes: #14013
    
    Signed-off-by: Yegappan Lakshmanan <[email protected]>
    Signed-off-by: Christian Brabandt <[email protected]>

diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt
index 0dca4679e..0b3d59e96 100644
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -1,4 +1,4 @@
-*builtin.txt*  For Vim version 9.1.  Last change: 2024 Feb 11
+*builtin.txt*  For Vim version 9.1.  Last change: 2024 Feb 12
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -2078,8 +2078,7 @@ diff({fromlist}, {tolist} [, {options}])          *diff()*
                                        use.  Supported boolean items are
                                        "myers", "minimal", "patience" and
                                        "histogram".
-                   context             unified diff context length.  Default
-                                       is 1.
+                   context             diff context length.  Default is 0.
                    iblank              ignore changes where lines are all
                                        blank.
                    icase               ignore changes in case of text.
@@ -2092,6 +2091,10 @@ diff({fromlist}, {tolist} [, {options}])         *diff()*
                                        line.
                For more information about these options, refer to 'diffopt'.
 
+               To compute the unified diff, all the items in {fromlist} are
+               concatenated into a string using a newline separator and the
+               same for {tolist}.  The unified diff output uses line numbers.
+
                Returns an empty List or String if {fromlist} and {tolist} are
                identical.
 
diff --git a/runtime/doc/diff.txt b/runtime/doc/diff.txt
index 05dd4a6be..e3abbdeff 100644
--- a/runtime/doc/diff.txt
+++ b/runtime/doc/diff.txt
@@ -510,9 +510,14 @@ between two Lists of strings are below.
    [{'from_idx': 1, 'from_count': 2, 'to_idx': 1, 'to_count': 0}]
 
   " disjointed changes
-  :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], 
{'output': 'indices'})
+  :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], 
{'output': 'indices', 'context': 0})
    [{'from_idx': 0, 'from_count': 1, 'to_idx': 0, 'to_count': 1},
     {'from_idx': 3, 'from_count': 1, 'to_idx': 3, 'to_count': 1}]
+
+  " disjointed changes with context length 1
+  :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], 
{'output': 'indices', 'context': 1})
+   [{'from_idx': 0, 'from_count': 4, 'to_idx': 0, 'to_count': 4}]
+
 <
 
  vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/src/diff.c b/src/diff.c
index a4f3f7e07..d2089dc15 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -3511,9 +3511,9 @@ parse_diff_optarg(
        }
     }
 
-    *diff_ctxlen = dict_get_number_def(d, "context", 1);
+    *diff_ctxlen = dict_get_number_def(d, "context", 0);
     if (*diff_ctxlen < 0)
-       *diff_ctxlen = 1;
+       *diff_ctxlen = 0;
 
     if (dict_get_bool(d, "iblank", FALSE))
        *diffopts |= DIFF_IBLANK;
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 67a14272b..d13eb1c9f 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -1952,7 +1952,7 @@ static funcentry_T global_functions[] =
     {"did_filetype",   0, 0, 0,            NULL,
                        ret_number_bool,    f_did_filetype},
     {"diff",           2, 3, FEARG_1,      arg3_diff,
-                       ret_list_dict_any,  f_diff},
+                       ret_any,  f_diff},
     {"diff_filler",    1, 1, FEARG_1,      arg1_lnum,
                        ret_number,         f_diff_filler},
     {"diff_hlID",      2, 2, FEARG_1,      arg2_lnum_number,
diff --git a/src/testdir/dumps/Test_difffunc_diffexpr_1.dump 
b/src/testdir/dumps/Test_difffunc_diffexpr_1.dump
new file mode 100644
index 000000000..b103cc8d2
--- /dev/null
+++ b/src/testdir/dumps/Test_difffunc_diffexpr_1.dump
@@ -0,0 +1,12 @@
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|z+0#0000000#5fd7ff255|e|r|o| @30
+| +0#0000e05#a8a8a8255@1>o+0#0000000#ffffff0|n|e| @31||+1&&| 
+0#0000e05#a8a8a8255@1|o+0#0000000#ffffff0|n|e| @31
+| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|w|o|x+2&#ff404010| 
+0&#ffd7ff255@30||+1&#ffffff0| 
+0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|w|o| @31
+| +0#0000e05#a8a8a8255@1|t+0#0000000#ffffff0|h|r|e@1| @29||+1&&| 
+0#0000e05#a8a8a8255@1|t+0#0000000#ffffff0|h|r|e@1| @29
+| +0#0000e05#a8a8a8255@1|f+0#0000000#5fd7ff255|o|u|r| @30||+1&#ffffff0| 
+0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34
+|~+0&#ffffff0| @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@2|u|n|c|2|.|t|x|t| @4|1|,|1| @11|A|l@1| 
|X+1&&|d|i|f@2|u|n|c|1|.|t|x|t| @4|1|,|1| @11|A|l@1
+|"+0&&|X|d|i|f@2|u|n|c|2|.|t|x|t|"| |4|L|,| |2|0|B| @50
diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim
index d37a9a28a..8e7d5ce31 100644
--- a/src/testdir/test_diffmode.vim
+++ b/src/testdir/test_diffmode.vim
@@ -1719,43 +1719,43 @@ endfunc
 " Test for the diff() function
 def Test_diff_func()
   # string is added/removed/modified at the beginning
-  assert_equal("@@ -1 +1,2 @@
+abc
 def
",
+  assert_equal("@@ -0,0 +1 @@
+abc
",
                diff(['def'], ['abc', 'def'], {output: 'unified'}))
   assert_equal([{from_idx: 0, from_count: 0, to_idx: 0, to_count: 1}],
                diff(['def'], ['abc', 'def'], {output: 'indices'}))
-  assert_equal("@@ -1,2 +1 @@
-abc
 def
",
+  assert_equal("@@ -1 +0,0 @@
-abc
",
                diff(['abc', 'def'], ['def'], {output: 'unified'}))
   assert_equal([{from_idx: 0, from_count: 1, to_idx: 0, to_count: 0}],
                diff(['abc', 'def'], ['def'], {output: 'indices'}))
-  assert_equal("@@ -1,2 +1,2 @@
-abc
+abx
 def
",
+  assert_equal("@@ -1 +1 @@
-abc
+abx
",
                diff(['abc', 'def'], ['abx', 'def'], {output: 'unified'}))
   assert_equal([{from_idx: 0, from_count: 1, to_idx: 0, to_count: 1}],
                diff(['abc', 'def'], ['abx', 'def'], {output: 'indices'}))
 
   # string is added/removed/modified at the end
-  assert_equal("@@ -1 +1,2 @@
 abc
+def
",
+  assert_equal("@@ -1,0 +2 @@
+def
",
                diff(['abc'], ['abc', 'def'], {output: 'unified'}))
   assert_equal([{from_idx: 1, from_count: 0, to_idx: 1, to_count: 1}],
                diff(['abc'], ['abc', 'def'], {output: 'indices'}))
-  assert_equal("@@ -1,2 +1 @@
 abc
-def
",
+  assert_equal("@@ -2 +1,0 @@
-def
",
                diff(['abc', 'def'], ['abc'], {output: 'unified'}))
   assert_equal([{from_idx: 1, from_count: 1, to_idx: 1, to_count: 0}],
                diff(['abc', 'def'], ['abc'], {output: 'indices'}))
-  assert_equal("@@ -1,2 +1,2 @@
 abc
-def
+xef
",
+  assert_equal("@@ -2 +2 @@
-def
+xef
",
                diff(['abc', 'def'], ['abc', 'xef'], {output: 'unified'}))
   assert_equal([{from_idx: 1, from_count: 1, to_idx: 1, to_count: 1}],
                diff(['abc', 'def'], ['abc', 'xef'], {output: 'indices'}))
 
   # string is added/removed/modified in the middle
-  assert_equal("@@ -2,2 +2,3 @@
 222
+xxx
 333
",
+  assert_equal("@@ -2,0 +3 @@
+xxx
",
                diff(['111', '222', '333'], ['111', '222', 'xxx', '333'], 
{output: 'unified'}))
   assert_equal([{from_idx: 2, from_count: 0, to_idx: 2, to_count: 1}],
                diff(['111', '222', '333'], ['111', '222', 'xxx', '333'], 
{output: 'indices'}))
-  assert_equal("@@ -2,3 +2,2 @@
 222
-333
 444
",
+  assert_equal("@@ -3 +2,0 @@
-333
",
                diff(['111', '222', '333', '444'], ['111', '222', '444'], 
{output: 'unified'}))
   assert_equal([{from_idx: 2, from_count: 1, to_idx: 2, to_count: 0}],
                diff(['111', '222', '333', '444'], ['111', '222', '444'], 
{output: 'indices'}))
-  assert_equal("@@ -2,3 +2,3 @@
 222
-333
+xxx
 444
",
+  assert_equal("@@ -3 +3 @@
-333
+xxx
",
                diff(['111', '222', '333', '444'], ['111', '222', 'xxx', 
'444'], {output: 'unified'}))
   assert_equal([{from_idx: 2, from_count: 1, to_idx: 2, to_count: 1}],
                diff(['111', '222', '333', '444'], ['111', '222', 'xxx', 
'444'], {output: 'indices'}))
@@ -1795,10 +1795,12 @@ def Test_diff_func()
                diff(['abcd'], ['abc'], {output: 'unified'}))
   assert_equal([{from_idx: 0, from_count: 1, to_idx: 0, to_count: 1}],
                diff(['abcd'], ['abc'], {output: 'indices'}))
-  assert_equal("@@ -1 +1 @@
-abc
+abx
",
-               diff(['abc'], ['abx'], {output: 'unified'}))
+  var diff_unified: string = diff(['abc'], ['abx'], {output: 'unified'})
+  assert_equal("@@ -1 +1 @@
-abc
+abx
", diff_unified)
+  var diff_indices: list<dict<number>> =
+    diff(['abc'], ['abx'], {output: 'indices'})
   assert_equal([{from_idx: 0, from_count: 1, to_idx: 0, to_count: 1}],
-               diff(['abc'], ['abx'], {output: 'indices'}))
+               diff_indices)
 
   # partial string modification at the start and at the end.
   var fromlist =<< trim END
@@ -1825,17 +1827,18 @@ def Test_diff_func()
     three four
     five six
   END
-  assert_equal("@@ -1,3 +1,3 @@
-one two
+one abc two
 three four
-five abc six
+five six
",
+  assert_equal("@@ -1 +1 @@
-one two
+one abc two
@@ -3 +3 @@
-five abc six
+five six
",
                diff(fromlist, tolist, {output: 'unified'}))
-  assert_equal([{from_idx: 0, from_count: 3, to_idx: 0, to_count: 3}],
+  assert_equal([{'from_count': 1, 'to_idx': 0, 'to_count': 1, 'from_idx': 0},
+                {'from_count': 1, 'to_idx': 2, 'to_count': 1, 'from_idx': 2}],
                diff(fromlist, tolist, {output: 'indices'}))
 
   # add/remove blank lines
-  assert_equal("@@ -1,4 +1,2 @@
 one
-
-
 two
",
+  assert_equal("@@ -2,2 +1,0 @@
-
-
",
                diff(['one', '', '', 'two'], ['one', 'two'], {output: 
'unified'}))
   assert_equal([{from_idx: 1, from_count: 2, to_idx: 1, to_count: 0}],
                diff(['one', '', '', 'two'], ['one', 'two'], {output: 
'indices'}))
-  assert_equal("@@ -1,2 +1,4 @@
 one
+
+
 two
",
+  assert_equal("@@ -1,0 +2,2 @@
+
+
",
                diff(['one', 'two'], ['one', '', '', 'two'], {output: 
'unified'}))
   assert_equal([{'from_idx': 1, 'from_count': 0, 'to_idx': 1, 'to_count': 2}],
                diff(['one', 'two'], ['one', '', '', 'two'], {output: 
'indices'}))
@@ -1911,7 +1914,7 @@ def Test_diff_func()
                diff(['a', 'b', 'c'], ['x', 'a', 'b', 'c'], {context: 3}))
   assert_equal("@@ -1,3 +1,4 @@
+x
 a
 b
 c
",
                diff(['a', 'b', 'c'], ['x', 'a', 'b', 'c'], {context: 4}))
-  assert_equal("@@ -1 +1,2 @@
+x
 a
",
+  assert_equal("@@ -0,0 +1 @@
+x
",
                diff(['a', 'b', 'c'], ['x', 'a', 'b', 'c'], {context: -1}))
 
   # Error cases
@@ -1922,4 +1925,32 @@ def Test_diff_func()
   assert_fails('call diff(["a"], ["a"], {context: []})', 'E745: Using a List 
as a Number')
 enddef
 
+" Test for using the diff() function with 'diffexpr'
+func Test_diffexpr_with_diff_func()
+  CheckScreendump
+
+  let lines =<< trim END
+    def DiffFuncExpr()
+      var in: list<string> = readfile(v:fname_in)
+      var new: list<string> = readfile(v:fname_new)
+      var out: string = diff(in, new)
+      writefile(split(out, "
"), v:fname_out)
+    enddef
+    set diffexpr=DiffFuncExpr()
+
+    edit Xdifffunc1.txt
+    diffthis
+    vert split Xdifffunc2.txt
+    diffthis
+  END
+  call writefile(lines, 'XsetupDiffFunc.vim', 'D')
+
+  call writefile(['zero', 'one', 'two', 'three'], 'Xdifffunc1.txt', 'D')
+  call writefile(['one', 'twox', 'three', 'four'], 'Xdifffunc2.txt', 'D')
+
+  let buf = RunVimInTerminal('-S XsetupDiffFunc.vim', {'rows': 12})
+  call VerifyScreenDump(buf, 'Test_difffunc_diffexpr_1', {})
+  call StopVimInTerminal(buf)
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 7fd6982f3..7a9172a66 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    99,
 /**/
     98,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1rZc0F-00BEHh-GS%40256bit.org.

Raspunde prin e-mail lui