From 1f85a196047d79677832679a80c28929ae80df0f Mon Sep 17 00:00:00 2001 From: castrojo Date: Tue, 8 Sep 2026 13:37:18 +0000 Subject: [PATCH] fix(countme): recognize Dakota and Utah without misclassifying Bluefin variants normalizeVariant() only checked Bluefin LTS before falling through to the broad startsWith("bluefin") branch, so os_name values like "bluefin-dakota" and "bluefin-utah" were folded into flagship Bluefin, and bare "Dakota"/"Utah" names were dropped as unrecognised. Add specific matching for Dakota and Utah ahead of the generic bluefin fallback, and mark Dakota as a non-Fedora source (GNOME OS built from source with Apache BuildStream has no fedora-N repo), matching the existing Bluefin LTS carve-out. Fixes projectbluefin/documentation#1083 Signed-off-by: castrojo --- scripts/fetch-countme.js | 37 +++++++++++++++++++++++++++++++---- scripts/fetch-countme.test.js | 37 +++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/scripts/fetch-countme.js b/scripts/fetch-countme.js index 2e98ff679..8421c5ccf 100644 --- a/scripts/fetch-countme.js +++ b/scripts/fetch-countme.js @@ -52,7 +52,15 @@ const OUT = resolve(__dirname, "../static/data/countme-history.json"); const CSV_URL = "https://data-analysis.fedoraproject.org/csv-reports/countme/totals.csv"; -const VARIANTS = ["bluefin", "bluefin-lts", "aurora", "bazzite", "fedora"]; +const VARIANTS = [ + "bluefin", + "bluefin-lts", + "dakota", + "utah", + "aurora", + "bazzite", + "fedora", +]; /** * How a weekly number is derived from the CSV. Stamped into the payload so a @@ -71,9 +79,11 @@ const BASE_REPO = /^fedora-\d+$/; /** * Variants with no fedora-N repo, counted across their own repos instead. * Bluefin LTS is CentOS Stream based and reaches Fedora's counter only through - * EPEL. ublue-os/countme has this same carve-out. + * EPEL. ublue-os/countme has this same carve-out. Dakota is GNOME OS based, + * assembled from source with Apache BuildStream — there are no RPMs, so it has + * no fedora-N repo either. */ -const NON_FEDORA_VARIANTS = new Set(["bluefin-lts"]); +const NON_FEDORA_VARIANTS = new Set(["bluefin-lts", "dakota"]); /** * Weeks upstream got wrong, skipped exactly as ublue-os/countme skips them. @@ -169,7 +179,10 @@ export function parseCsvLine(line) { * Returns null for unrecognised names — bucketing an unknown OS into a variant * would inflate the headline number. * - * ORDER MATTERS: LTS checks before generic bluefin. + * ORDER MATTERS: LTS, Dakota, and Utah check before generic bluefin. Dakota and + * Utah are Bluefin variants whose os_name carries a "bluefin-" prefix (e.g. + * "bluefin-dakota", "bluefin-utah"), so the broad startsWith("bluefin") branch + * would otherwise fold them into flagship Bluefin. */ export function normalizeVariant(osName) { if (osName == null) return null; @@ -184,6 +197,22 @@ export function normalizeVariant(osName) { ) return "bluefin-lts"; + // Dakota — GNOME OS / Apache BuildStream distroless prototype. + if ( + s.includes("dakotaraptor") || + s.startsWith("bluefin-dakota") || + s.startsWith("dakota") + ) + return "dakota"; + + // Utah — Fedora Hummingbird base with the GNOME 51 desktop stack. + if ( + s.includes("utahraptor") || + s.startsWith("bluefin-utah") || + s.startsWith("utah") + ) + return "utah"; + if (s.startsWith("bluefin")) return "bluefin"; if (s.startsWith("aurora")) return "aurora"; if (s.startsWith("bazzite")) return "bazzite"; diff --git a/scripts/fetch-countme.test.js b/scripts/fetch-countme.test.js index f427a35e1..7d444e54c 100644 --- a/scripts/fetch-countme.test.js +++ b/scripts/fetch-countme.test.js @@ -123,6 +123,20 @@ test("normalizeVariant returns bluefin-lts for Bluefin LTS, not bluefin", () => assert.notEqual(normalizeVariant("Bluefin LTS"), "bluefin"); }); +test("normalizeVariant recognises Dakota without folding it into flagship Bluefin", () => { + assert.equal(normalizeVariant("Dakota"), "dakota"); + assert.equal(normalizeVariant("bluefin-dakota"), "dakota"); + assert.equal(normalizeVariant("Dakotaraptor"), "dakota"); + assert.notEqual(normalizeVariant("bluefin-dakota"), "bluefin"); +}); + +test("normalizeVariant recognises Utah without folding it into flagship Bluefin", () => { + assert.equal(normalizeVariant("Utah"), "utah"); + assert.equal(normalizeVariant("bluefin-utah"), "utah"); + assert.equal(normalizeVariant("Utahraptor"), "utah"); + assert.notEqual(normalizeVariant("bluefin-utah"), "bluefin"); +}); + // ── aggregateWeeks ─────────────────────────────────────────────────────── // // The rules under test are ported from ublue-os/countme:data_processing.py. @@ -180,6 +194,29 @@ test("aggregateWeeks counts Bluefin LTS across its own repos, having no fedora-N assert.equal(weeks[0].bluefin, undefined); }); +test("aggregateWeeks counts Dakota across its own repos, having no fedora-N repo", () => { + // Dakota is GNOME OS assembled from source with Apache BuildStream — there + // are no RPMs, so it has no fedora-N repo to restrict to. + const rows = parseAll([ + row({ os_name: "bluefin-dakota", repo_tag: "gnome-os", hits: 20 }), + row({ os_name: "bluefin-dakota", repo_tag: "gnome-os-testing", hits: 3 }), + ]); + const weeks = aggregateWeeks(rows); + assert.equal(weeks[0].dakota, 23); + assert.equal(weeks[0].bluefin, undefined); +}); + +test("aggregateWeeks counts Utah restricted to its fedora-N repo", () => { + const rows = parseAll([ + row({ os_name: "bluefin-utah", repo_tag: "fedora-44", hits: 8 }), + // A non-base repo hit from the same system must not double count. + row({ os_name: "bluefin-utah", repo_tag: "updates-released-f44", hits: 8 }), + ]); + const weeks = aggregateWeeks(rows); + assert.equal(weeks[0].utah, 8); + assert.equal(weeks[0].bluefin, undefined); +}); + test("aggregateWeeks skips the two weeks upstream got wrong", () => { // 2024-12-29 is a partial year-end week; 2025-07-06 is a Fedora // infrastructure migration that shows as a ~40% drop.