From e55896ce41d6165105671da5b6f33813106ef1b8 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Wed, 30 Sep 2026 19:56:47 +0200 Subject: feat: add an updates card showing nvtable's package table Moves the nvchecker/nvtable table the login shell printed onto the dashboard, as a wide card at the bottom centre. bin/updates-sample.sh caches `nvtable -C -E` every ten minutes and starts nvchecker, fully detached, at most every 30 minutes. The widget parses the cache and colours it in the board's language: installed behind upstream is critical, a shipped .info behind is a warning, with nvtable's status dots per row and a legend on the bottom line. The mouse wheel scrolls rows that do not fit. Co-Authored-By: Claude Opus 5.5 --- lib/data.lua | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'lib/data.lua') diff --git a/lib/data.lua b/lib/data.lua index c66aa42..4b31f43 100644 --- a/lib/data.lua +++ b/lib/data.lua @@ -631,4 +631,43 @@ function M.immich_parse(text) return out end +-- nvtable's plain table (`nvtable -C -E`), as bin/updates-sample.sh caches it: +-- +-- [personal] foo-bin 1.14.9 -> 1.14.9 !! ~ 1.14.10 +-- -> [~] [upstream] +-- +-- followed by a summary line with the counts. The marker is '!!' (installed +-- behind upstream), 'ok' or '-' (not installed); '~' flags the shipped .info +-- as behind. Upstream appears only when shipped does not already show it. +-- +-- Returns the rows as { repo, name, installed, shipped, upstream, behind, +-- bump } with '--' turned into nil, plus .upgrade/.bump/.current/.missing +-- counts, or nil when the text has neither rows nor a summary. +function M.nvtable_parse(text) + if type(text) ~= 'string' then return nil end + local out, seen = {}, false + local function v(s) return s ~= '--' and s or nil end + for line in text:gmatch('[^\n]+') do + local repo, name, inst, ship, rest = + line:match('^%s*%[(.-)%]%s+(%S+)%s+(%S+)%s+%->%s+(%S+)%s*(.*)$') + if repo then + local mark, tail = rest:match('^(%S*)%s*(.*)$') + local bump = tail:match('^~') ~= nil + if bump then tail = tail:gsub('^~%s*', '') end + out[#out + 1] = { + repo = v(repo), name = name, installed = v(inst), shipped = v(ship), + upstream = tail:match('^(%S+)'), behind = mark == '!!', bump = bump, + } + seen = true + elseif line:match('to upgrade') then + out.upgrade = tonumber(line:match('(%d+) to upgrade')) + out.bump = tonumber(line:match('(%d+) repos? to bump')) + out.current = tonumber(line:match('(%d+) current')) + out.missing = tonumber(line:match('(%d+) not installed')) or 0 + seen = true + end + end + return seen and out or nil +end + return M -- cgit v1.2.3