Skip to content

Commit 89b946a

Browse files
authored
fix(lua): vim.diff is nil in uv.new_work() thread neovim#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`).
1 parent 5c4f9b0 commit 89b946a

5 files changed

Lines changed: 14 additions & 7 deletions

File tree

runtime/lua/vim/_editor.lua

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,9 +1317,6 @@ require('vim._options')
13171317
--- Remove at Nvim 1.0
13181318
---@deprecated
13191319
vim.loop = vim.uv
1320-
--- Renamed to `vim.text.diff`, remove at Nvim 1.0
1321-
---@deprecated
1322-
vim.diff = vim._diff ---@type fun(a: string, b: string, opts?: vim.text.diff.Opts): string|integer[][]?
13231320

13241321
-- Deprecated. Remove at Nvim 2.0
13251322
vim.highlight = vim._defer_deprecated_module('vim.highlight', 'vim.hl')

runtime/lua/vim/_meta/misc.lua

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,11 @@
1414
--- @param ... any
1515
--- @return any
1616
function vim.call(func, ...) end
17+
18+
--- Renamed to `vim.text.diff`, remove at Nvim 1.0
19+
---@deprecated
20+
---@param a string First string to compare
21+
---@param b string Second string to compare
22+
---@param opts? vim.text.diff.Opts
23+
---@return string|integer[][]? # See {opts.result_type}. `nil` if {opts.on_hunk} is given.
24+
function vim.diff(a, b, opts) end

runtime/lua/vim/text.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ local M = {}
7373
---@param opts? vim.text.diff.Opts
7474
---@return string|integer[][]? # See {opts.result_type}. `nil` if {opts.on_hunk} is given.
7575
function M.diff(...)
76-
return vim._diff(...)
76+
---@diagnostic disable-next-line: deprecated
77+
return vim.diff(...)
7778
end
7879

7980
local alphabet = '0123456789ABCDEF'

src/nvim/lua/stdlib.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,8 @@ void nlua_state_add_stdlib(lua_State *const lstate, bool is_thread)
763763

764764
// vim.text.diff
765765
lua_pushcfunction(lstate, &nlua_xdl_diff);
766-
lua_setfield(lstate, -2, "_diff");
766+
// TODO(justinmk): set vim.text.diff here, or rename this to "_diff". goddamnit.
767+
lua_setfield(lstate, -2, "diff");
767768

768769
// vim.json
769770
lua_cjson_new(lstate);

test/functional/lua/thread_spec.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ describe('thread', function()
217217
it('diff', function()
218218
exec_lua [[
219219
local entry = function(async)
220-
async:send(vim._diff('Hello\n', 'Helli\n'))
220+
async:send(vim.diff('Hello\n', 'Helli\n'))
221221
end
222222
local on_async = function(ret)
223223
vim.rpcnotify(1, 'result', ret)
@@ -372,7 +372,7 @@ describe('threadpool', function()
372372
it('work', function()
373373
exec_lua [[
374374
local work_fn = function()
375-
return vim._diff('Hello\n', 'Helli\n')
375+
return vim.diff('Hello\n', 'Helli\n')
376376
end
377377
local after_work_fn = function(ret)
378378
vim.rpcnotify(1, 'result', ret)

0 commit comments

Comments
 (0)