From d94fee916b9ddcf41b10555e48d85618f7ddf88e Mon Sep 17 00:00:00 2001 From: Tai Groot Date: Thu, 19 Feb 2026 01:07:33 -0500 Subject: [PATCH] handle duplicate binaries --- lua/glaze/checker.lua | 54 +++++++++++++++++++++++++++++++++++++++++++ lua/glaze/init.lua | 38 ++++++++++++++++++++++++++---- lua/glaze/runner.lua | 13 ++++++++--- lua/glaze/view.lua | 10 ++++---- 4 files changed, 103 insertions(+), 12 deletions(-) diff --git a/lua/glaze/checker.lua b/lua/glaze/checker.lua index 90c99e1..3258ba7 100644 --- a/lua/glaze/checker.lua +++ b/lua/glaze/checker.lua @@ -127,6 +127,60 @@ function M.get_update_info() return M._update_info end +---Refresh version info for a single binary (called after install/update). +---@param name string Binary name +---@param callback? fun() Optional callback when done +function M.refresh_version(name, callback) + local glaze = require("glaze") + local binary = glaze._binaries[name] + if not binary then + if callback then + callback() + end + return + end + + get_installed_version(name, function(installed) + local info = M._update_info[name] or { + name = name, + installed_version = nil, + latest_version = nil, + has_update = false, + } + info.installed_version = installed + + -- If we have latest version cached, check if still needs update + if info.latest_version and installed then + info.has_update = installed ~= info.latest_version + else + info.has_update = false + end + + M._update_info[name] = info + + -- Persist to state + local state = read_state() + state.update_info = state.update_info or {} + state.update_info[name] = { + installed_version = info.installed_version, + latest_version = info.latest_version, + has_update = info.has_update, + } + write_state(state) + + -- Refresh UI if open + vim.schedule(function() + local ok, view = pcall(require, "glaze.view") + if ok and view._float and view._float:valid() then + view.render() + end + if callback then + callback() + end + end) + end) +end + ---Check for updates on all registered binaries. ---@param opts? { silent?: boolean } function M.check(opts) diff --git a/lua/glaze/init.lua b/lua/glaze/init.lua index 27ced0f..1a61439 100644 --- a/lua/glaze/init.lua +++ b/lua/glaze/init.lua @@ -15,8 +15,8 @@ local M = {} ---@class GlazeBinary ---@field name string Binary name (executable name) ---@field url string Go module URL (without @version) ----@field plugin? string Plugin that registered this binary ----@field callback? fun(success: boolean) Optional callback after install/update +---@field plugins string[] Plugins that registered this binary +---@field callbacks table Callbacks keyed by plugin name ---@class GlazeAutoCheckConfig ---@field enabled? boolean Whether to auto-check for updates @@ -147,11 +147,41 @@ end ---@param opts? { plugin?: string, callback?: fun(success: boolean) } function M.register(name, url, opts) opts = opts or {} + local plugin = opts.plugin or "unknown" + + -- Check if this URL is already registered under a different name + for existing_name, binary in pairs(M._binaries) do + if binary.url == url and existing_name ~= name then + -- Same URL, different name - merge into existing entry + if not vim.tbl_contains(binary.plugins, plugin) then + table.insert(binary.plugins, plugin) + end + if opts.callback then + binary.callbacks[plugin] = opts.callback + end + return + end + end + + -- Check if this name is already registered + local existing = M._binaries[name] + if existing then + -- Merge plugin into existing entry + if not vim.tbl_contains(existing.plugins, plugin) then + table.insert(existing.plugins, plugin) + end + if opts.callback then + existing.callbacks[plugin] = opts.callback + end + return + end + + -- New binary registration M._binaries[name] = { name = name, url = url, - plugin = opts.plugin, - callback = opts.callback, + plugins = opts.plugin and { opts.plugin } or {}, + callbacks = opts.callback and { [plugin] = opts.callback } or {}, } -- Auto-install if enabled and binary is missing diff --git a/lua/glaze/runner.lua b/lua/glaze/runner.lua index 7223cd9..a9cecaa 100644 --- a/lua/glaze/runner.lua +++ b/lua/glaze/runner.lua @@ -93,10 +93,17 @@ local function run_task(task) task.status = code == 0 and "done" or "error" task.job_id = nil - -- Call binary callback if set - if task.binary.callback then + -- Refresh version info on success + if code == 0 then + require("glaze.checker").refresh_version(task.binary.name) + end + + -- Call all registered callbacks + if task.binary.callbacks then vim.schedule(function() - task.binary.callback(code == 0) + for _, cb in pairs(task.binary.callbacks) do + cb(code == 0) + end end) end diff --git a/lua/glaze/view.lua b/lua/glaze/view.lua index 3b78866..7f3cef6 100644 --- a/lua/glaze/view.lua +++ b/lua/glaze/view.lua @@ -323,8 +323,8 @@ function M._render_binary(text, binary, icons, update_info) text:append(" " .. icon .. " ", icon_hl) text:append(binary.name, "GlazeBinary") - if binary.plugin then - text:append(" (" .. binary.plugin .. ")", "GlazePlugin") + if binary.plugins and #binary.plugins > 0 then + text:append(" (" .. table.concat(binary.plugins, ", ") .. ")", "GlazePlugin") end -- Show update available indicator @@ -353,9 +353,9 @@ function M._render_binary(text, binary, icons, update_info) text:append(bin_path, "GlazeUrl"):nl() end - if binary.plugin then - text:append("Plugin: ", "GlazeComment", { indent = 6 }) - text:append(binary.plugin, "GlazePlugin"):nl() + if binary.plugins and #binary.plugins > 0 then + text:append("Plugins: ", "GlazeComment", { indent = 6 }) + text:append(table.concat(binary.plugins, ", "), "GlazePlugin"):nl() end -- Show last error output from tasks