From 89b946aa87d2414bd268f0766d5354cedc5702ff Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sat, 12 Jul 2025 23:54:22 -0400 Subject: [PATCH] fix(lua): vim.diff is nil in uv.new_work() thread #34909 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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`). --- runtime/lua/vim/_editor.lua | 3 --- runtime/lua/vim/_meta/misc.lua | 8 ++++++++ runtime/lua/vim/text.lua | 3 ++- src/nvim/lua/stdlib.c | 3 ++- test/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 index ed8f9f258b..dd9fc221d1 100644 --- 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 index ab80e18434..87929353af 100644 --- 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 index 8d8c49d327..736c5b8e7f 100644 --- 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 index 0340a22a34..189cdaf310 100644 --- 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 index 9ff6b839f2..e4ff2b8068 100644 --- 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)