---@brief [[
--- glaze.nvim update checker
--- Checks for newer versions of registered Go binaries
---@brief ]]
local M = {}
---@class GlazeUpdateInfo
---@field name string Binary name
---@field installed_version? string Currently installed version
---@field latest_version? string Latest available version
---@field has_update boolean Whether an update is available
---@type table<string, GlazeUpdateInfo>
M._update_info = {}
---@type boolean
M._checking = false
local STATE_FILE = vim.fn.stdpath("data") .. "/glaze/state.json"
---Parse a version string into comparable components.
---Handles semver (v1.2.3), pseudo-versions (v0.0.0-20240122...), etc.
---@param version string
---@return number[] parts, string? prerelease
local function parse_version(version)
if not version then
return {}, nil
end
-- Strip leading 'v'
local v = version:gsub("^v", "")
-- Check for pseudo-version (v0.0.0-YYYYMMDD...-hash)
local pseudo_date = v:match("^0%.0%.0%-(%d+)")
if pseudo_date then
-- Pseudo-versions: compare by date portion
return { 0, 0, 0, tonumber(pseudo_date) or 0 }, "pseudo"
end