neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 89b946aa87d2414bd268f0766d5354cedc5702ff
parent 5c4f9b05fa4b73ff64a16535af2f0021f83ee0ad
Author: Justin M. Keyes <justinkz@gmail.com>
Date:   Sat, 12 Jul 2025 23:54:22 -0400

fix(lua): vim.diff is nil in uv.new_work() thread #34909

Problem:
The "gitsigns" plugin runs `vim.diff` in a thread (`uv.new_work`), but
`vim.diff` is nil in that context:

    Lua callback:
    …/gitsigns.nvim/lua/gitsigns/diff_int.lua:30: bad argument #1 to 'decode' (string expected, got nil)
    stack traceback:
      [C]: in function 'decode'
      …/gitsigns.nvim/lua/gitsigns/diff_int.lua:30: in function <…/gitsigns.nvim/lua/gitsigns/diff_int.lua:29>
    Luv thread:
    …/gitsigns.nvim/lua/gitsigns/diff_int.lua:63: attempt to call field 'diff' (a nil value)

Solution:
Revert the `stdlib.c` change (set `vim.diff` instead of `vim._diff`).
Diffstat:
Mruntime/lua/vim/_editor.lua | 3---
Mruntime/lua/vim/_meta/misc.lua | 8++++++++
Mruntime/lua/vim/text.lua | 3++-
Msrc/nvim/lua/stdlib.c | 3++-
Mtest/functional/lua/thread_spec.lua | 4++--
5 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/runtime/lua/vim/_editor.lua b/runtime/lua/vim/_editor.lua @@ -1317,9 +1317,6 @@ require('vim._options') --- Remove at Nvim 1.0 ---@deprecated vim.loop = vim.uv ---- Renamed to `vim.text.diff`, remove at Nvim 1.0 ----@deprecated -vim.diff = vim._diff ---@type fun(a: string, b: string, opts?: vim.text.diff.Opts): string|integer[][]? -- Deprecated. Remove at Nvim 2.0 vim.highlight = vim._defer_deprecated_module('vim.highlight', 'vim.hl') diff --git a/runtime/lua/vim/_meta/misc.lua b/runtime/lua/vim/_meta/misc.lua @@ -14,3 +14,11 @@ --- @param ... any --- @return any function vim.call(func, ...) end + +--- Renamed to `vim.text.diff`, remove at Nvim 1.0 +---@deprecated +---@param a string First string to compare +---@param b string Second string to compare +---@param opts? vim.text.diff.Opts +---@return string|integer[][]? # See {opts.result_type}. `nil` if {opts.on_hunk} is given. +function vim.diff(a, b, opts) end diff --git a/runtime/lua/vim/text.lua b/runtime/lua/vim/text.lua @@ -73,7 +73,8 @@ local M = {} ---@param opts? vim.text.diff.Opts ---@return string|integer[][]? # See {opts.result_type}. `nil` if {opts.on_hunk} is given. function M.diff(...) - return vim._diff(...) + ---@diagnostic disable-next-line: deprecated + return vim.diff(...) end local alphabet = '0123456789ABCDEF' diff --git a/src/nvim/lua/stdlib.c b/src/nvim/lua/stdlib.c @@ -763,7 +763,8 @@ void nlua_state_add_stdlib(lua_State *const lstate, bool is_thread) // vim.text.diff lua_pushcfunction(lstate, &nlua_xdl_diff); - lua_setfield(lstate, -2, "_diff"); + // TODO(justinmk): set vim.text.diff here, or rename this to "_diff". goddamnit. + lua_setfield(lstate, -2, "diff"); // vim.json lua_cjson_new(lstate); diff --git a/test/functional/lua/thread_spec.lua b/test/functional/lua/thread_spec.lua @@ -217,7 +217,7 @@ describe('thread', function() it('diff', function() exec_lua [[ local entry = function(async) - async:send(vim._diff('Hello\n', 'Helli\n')) + async:send(vim.diff('Hello\n', 'Helli\n')) end local on_async = function(ret) vim.rpcnotify(1, 'result', ret) @@ -372,7 +372,7 @@ describe('threadpool', function() it('work', function() exec_lua [[ local work_fn = function() - return vim._diff('Hello\n', 'Helli\n') + return vim.diff('Hello\n', 'Helli\n') end local after_work_fn = function(ret) vim.rpcnotify(1, 'result', ret)