neovim

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

commit 9b7cf4f0beb35b640846f92ac522372967ca6695
parent e98decf9a68e41b09214aa60b77d0db29b7d648a
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Fri,  2 Feb 2024 21:52:01 +0800

fix(vim.system): don't process non-fast events during wait() (#27300)

Problem:
Processing non-fast events during SystemObj:wait() may cause two pieces
of code to interfere with each other, and is different from jobwait().

Solution:
Don't process non-fast events during SystemObj:wait().
Diffstat:
Mruntime/lua/vim/_system.lua | 4++--
Mtest/functional/lua/system_spec.lua | 14++++++++++++++
2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/runtime/lua/vim/_system.lua b/runtime/lua/vim/_system.lua @@ -94,14 +94,14 @@ function SystemObj:wait(timeout) local done = vim.wait(timeout or state.timeout or MAX_TIMEOUT, function() return state.result ~= nil - end) + end, nil, true) if not done then -- Send sigkill since this cannot be caught self:_timeout(SIG.KILL) vim.wait(timeout or state.timeout or MAX_TIMEOUT, function() return state.result ~= nil - end) + end, nil, true) end return state.result diff --git a/test/functional/lua/system_spec.lua b/test/functional/lua/system_spec.lua @@ -104,4 +104,18 @@ describe('vim.system', function() assert(signal == 2) ]]) end) + + it('SystemObj:wait() does not process non-fast events #27292', function() + eq( + false, + exec_lua([[ + _G.processed = false + local cmd = vim.system({ 'sleep', '1' }) + vim.schedule(function() _G.processed = true end) + cmd:wait() + return _G.processed + ]]) + ) + eq(true, exec_lua([[return _G.processed]])) + end) end)