diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index d08f7c0..79279a0 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -2,6 +2,44 @@ local Config = require("lazy.core.config") local M = {} +---@type table +M.running = {} + +M.signals = { + "HUP", + "INT", + "QUIT", + "ILL", + "TRAP", + "ABRT", + "BUS", + "FPE", + "KILL", + "USR1", + "SEGV", + "USR2", + "PIPE", + "ALRM", + "TERM", + "CHLD", + "CONT", + "STOP", + "TSTP", + "TTIN", + "TTOU", + "URG", + "XCPU", + "XFSZ", + "VTALRM", + "PROF", + "WINCH", + "IO", + "PWR", + "EMT", + "SYS", + "INFO", +} + ---@diagnostic disable-next-line: no-unknown local uv = vim.loop @@ -14,6 +52,7 @@ local uv = vim.loop ---@field env? string[] ---@param opts? ProcessOpts +---@param cmd string function M.spawn(cmd, opts) opts = opts or {} opts.timeout = opts.timeout or (Config.options.git and Config.options.git.timeout * 1000) @@ -44,9 +83,8 @@ function M.spawn(cmd, opts) if opts.timeout then timeout = uv.new_timer() timeout:start(opts.timeout, 0, function() - if handle and not handle:is_closing() then + if M.kill(handle) then killed = true - uv.process_kill(handle, "sigint") end end) end @@ -57,6 +95,7 @@ function M.spawn(cmd, opts) cwd = opts.cwd, env = env, }, function(exit_code, signal) + M.running[handle] = nil if timeout then timeout:stop() timeout:close() @@ -74,6 +113,8 @@ function M.spawn(cmd, opts) output = output:gsub("[^\r\n]+\r", "") if killed then output = output .. "\n" .. "Process was killed because it reached the timeout" + elseif signal ~= 0 then + output = output .. "\n" .. "Process was killed with SIG" .. M.signals[signal] end vim.schedule(function() @@ -89,6 +130,7 @@ function M.spawn(cmd, opts) end return end + M.running[handle] = true ---@param data? string local function on_output(err, data) @@ -112,6 +154,20 @@ function M.spawn(cmd, opts) return handle end +function M.kill(handle) + if handle and not handle:is_closing() then + M.running[handle] = nil + uv.process_kill(handle, "sigint") + return true + end +end + +function M.abort() + for handle in pairs(M.running) do + M.kill(handle) + end +end + ---@param cmd string[] ---@param opts? {cwd:string, env:table} function M.exec(cmd, opts) diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index 8581eb7..b6f5bc2 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -31,6 +31,7 @@ M.keys = { details = "", profile_sort = "", profile_filter = "", + abort = "", } ---@type table diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index e3007ec..7a3c595 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -62,6 +62,11 @@ function M.create() self:update() end) + vim.keymap.set("n", ViewConfig.keys.abort, function() + require("lazy.manage.process").abort() + return "" + end, { silent = true, buffer = self.buf, expr = true }) + -- plugin details self:on_key(ViewConfig.keys.details, function() local plugin = self.render:get_plugin() diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 0c62436..20c0f16 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -154,7 +154,9 @@ end function M:help() self:append("Help", "LazyH2"):nl():nl() - self:append("You can press "):append("", "LazySpecial"):append(" on a plugin to show its details."):nl() + self:append("Use "):append("", "LazySpecial"):append(" to abort all running tasks."):nl():nl() + + self:append("You can press "):append("", "LazySpecial"):append(" on a plugin to show its details."):nl():nl() self:append("Most properties can be hovered with ") self:append("", "LazySpecial") @@ -164,7 +166,8 @@ function M:help() :append("", "LazySpecial") :append(" on a plugin anywhere else, a diff will be opened if there are updates") :nl() - self:append("or the plugin was just updated. Otherwise the plugin webpage will open."):nl() + self:append("or the plugin was just updated. Otherwise the plugin webpage will open."):nl():nl() + self:append("Use "):append("", "LazySpecial"):append(" on a commit or plugin to open the diff view"):nl() self:nl()