From 85341ca46a3e46a2b71c4cbc7413b8baa25845b5 Mon Sep 17 00:00:00 2001 From: Arpit Chakladar Date: Sat, 19 Sep 2026 03:25:31 +0530 Subject: chore(updates/web/chromium): re-wrote new updates checker for extensions --- .../chromium/check-chromium-extension-updates.lua | 82 +++++++++++++++------- updates/web/chromium/extensions.nix | 35 ++++----- 2 files changed, 76 insertions(+), 41 deletions(-) diff --git a/updates/web/chromium/check-chromium-extension-updates.lua b/updates/web/chromium/check-chromium-extension-updates.lua index 815e8a4..0312283 100644 --- a/updates/web/chromium/check-chromium-extension-updates.lua +++ b/updates/web/chromium/check-chromium-extension-updates.lua @@ -1,16 +1,48 @@ #!/usr/bin/env luajit -- Checks for updated Chromium extensions against their GitHub releases/tags. -local extensions = { - -- NOTE: replaced by the derivation build step, with the - -- detailed list of all extensions that we need to check - --@@EXTENSIONS@@-- -} +local cjson = require("cjson") +local http_request = require("http.request") + +local rawExtensionsString = "@@EXTENSIONS@@" +local extensions = cjson.decode(rawExtensionsString) local function printf(fmt, ...) io.write(string.format(fmt, ...)) end +-- Performs a GET request against the GitHub API and returns the +-- decoded JSON body, or nil plus an error message. +local function githubGetJson(url) + local req = http_request.new_from_uri(url) + req.headers:upsert("user-agent", "check-chromium-extension-updates") + req.headers:upsert("accept", "application/vnd.github+json") + + local headers, stream = req:go(10) -- 10s timeout + if not headers then + -- on failure, `stream` actually holds the error message + return nil, tostring(stream) + end + + local body, err = stream:get_body_as_string() + stream:shutdown() + if not body then + return nil, err or "no response body" + end + + local status = headers:get(":status") + if status ~= "200" then + return nil, string.format("HTTP %s", tostring(status)) + end + + local ok, decoded = pcall(cjson.decode, body) + if not ok then + return nil, "failed to decode JSON response" + end + + return decoded, nil +end + print("Checking for Chromium extension updates...") print("----------------------------------------------") print("") @@ -18,36 +50,36 @@ print("") for _, ext in ipairs(extensions) do local isTag = ext.updateType == "tag" local endpoint - local jqFilter if isTag then endpoint = string.format("https://api.github.com/repos/%s/%s/tags", ext.owner, ext.repo) - jqFilter = ".[0].name" else endpoint = string.format("https://api.github.com/repos/%s/%s/releases/latest", ext.owner, ext.repo) - jqFilter = ".tag_name" end - local proc = io.popen(string.format("curl -sL --fail %q | jq -r %q", endpoint, jqFilter)) - local latestRaw = (proc and proc:read("*a") or ""):gsub("%s+$", "") - if proc then - proc:close() - end + local data, err = githubGetJson(endpoint) + local latestRaw - if latestRaw == "" or latestRaw == "null" then - printf("FAIL [%s] Failed to fetch data from GitHub API.\n", ext.pname) + if not data then + printf("FAIL [%s] Failed to fetch data from GitHub API (%s).\n", ext.pname, err) else - local prefix = ext.tagPrefix - local latest = latestRaw - if prefix ~= "" and latestRaw:sub(1, #prefix) == prefix then - latest = latestRaw:sub(#prefix + 1) - end + latestRaw = isTag and data[1] and data[1].name or data.tag_name - if latest ~= ext.version then - printf("UPDATE [%s] %s -> %s\n", ext.pname, ext.version, latest) - printf(" Repo: https://github.com/%s/%s\n", ext.owner, ext.repo) - print("") + if latestRaw == nil or latestRaw == "" then + printf("FAIL [%s] Failed to fetch data from GitHub API.\n", ext.pname) else - printf("OK [%s] %s\n", ext.pname, ext.version) + local prefix = ext.tagPrefix + local latest = latestRaw + if prefix ~= "" and latestRaw:sub(1, #prefix) == prefix then + latest = latestRaw:sub(#prefix + 1) + end + + if latest ~= ext.version then + printf("UPDATE [%s] %s -> %s\n", ext.pname, ext.version, latest) + printf(" Repo: https://github.com/%s/%s\n", ext.owner, ext.repo) + print("") + else + printf("OK [%s] %s\n", ext.pname, ext.version) + end end end end diff --git a/updates/web/chromium/extensions.nix b/updates/web/chromium/extensions.nix index ab6e818..fbfe277 100644 --- a/updates/web/chromium/extensions.nix +++ b/updates/web/chromium/extensions.nix @@ -1,18 +1,31 @@ { pkgs, - lib, ... }: let extensions = import ../../../modules/web/chromium/extensions/metadata.nix; - luaExtensionList = lib.concatMapStringsSep "\n" (ext: '' - { pname = "${ext.pname}", owner = "${ext.owner}", repo = "${ext.repo}", version = "${ext.version}", updateType = "${ext.updateType or "release"}", tagPrefix = "${ext.tagPrefix}" }, - '') extensions; + extensionsJsonString = builtins.replaceStrings [ "\\" "\"" ] [ "\\\\" "\\\"" ] ( + builtins.toJSON ( + map (ext: { + pname = ext.pname; + owner = ext.owner; + repo = ext.repo; + version = ext.version; + updateType = ext.updateType or "release"; + tagPrefix = ext.tagPrefix; + }) extensions + ) + ); + + luaEnv = pkgs.luajit.withPackages (ps: [ + ps.lua-cjson + ps.http + ]); luaScript = pkgs.writeText "check-chromium-extension-updates.lua" ( - builtins.replaceStrings [ "--@@EXTENSIONS@@--" ] [ luaExtensionList ] ( + builtins.replaceStrings [ "@@EXTENSIONS@@" ] [ extensionsJsonString ] ( builtins.readFile ./check-chromium-extension-updates.lua ) ); @@ -22,21 +35,11 @@ in pname = "check-chromium-extension-updates"; version = "0.1.0"; dontUnpack = true; - nativeBuildInputs = [ - pkgs.luajit - pkgs.makeWrapper - ]; + nativeBuildInputs = [ luaEnv ]; installPhase = '' mkdir -p $out/bin install -m755 ${luaScript} $out/bin/check-chromium-extension-updates patchShebangs $out/bin/check-chromium-extension-updates - wrapProgram $out/bin/check-chromium-extension-updates \ - --prefix PATH : "${ - lib.makeBinPath [ - pkgs.curl - pkgs.jq - ] - }" ''; meta = { mainProgram = "check-chromium-extension-updates"; -- cgit v1.2.3