// SPDX-License-Identifier: GPL-3.0-or-later /** * Guard for scripts/bump-version.mjs. * * The release script lists every manifest path as a string literal and dies at * the first one that has moved. That is not hypothetical: the AUR files were * reorganised into packaging/aur/ and the script kept pointing at * packaging/PKGBUILD, so a release stopped halfway through and left the RPM * spec and the docs regeneration un-run, silently. * * This reads the paths out of the script and checks they exist, which is the * failure it would have caught. */ import { test } from "node:test"; import assert from "node:assert/strict"; import { readFileSync, existsSync } from "node:fs"; import { join, dirname } from "node:path"; import { fileURLToPath } from "node:url"; import { addRelease } from "../scripts/bump-appstream.mjs"; const ROOT = join(dirname(fileURLToPath(import.meta.url)), ".."); const source = readFileSync(join(ROOT, "scripts", "bump-version.mjs"), "utf8"); const paths = [...source.matchAll(/bump(?:Json|Text)\(\s*"([^"]+)"/g)].map((m) => m[1]); test("bump-version: every manifest it rewrites exists", () => { assert.ok(paths.length >= 6, "expected the script to list its manifests"); const missing = paths.filter((p) => !existsSync(join(ROOT, p))); assert.deepEqual( missing, [], `scripts/bump-version.mjs points at paths that no longer exist:\n ${missing.join("\n ")}`, ); }); test("bump-version: the AUR pair is bumped together", () => { // PKGBUILD and .SRCINFO must carry the same pkgver, or makepkg and the AUR // both reject the pair. A script that rewrites one without the other is the // bug this file exists for. const pkgbuild = paths.filter((p) => p.endsWith("PKGBUILD")); const srcinfo = paths.filter((p) => p.endsWith(".SRCINFO")); assert.equal(pkgbuild.length, 1, "PKGBUILD must be bumped"); assert.equal(srcinfo.length, 1, ".SRCINFO must be bumped alongside it"); }); const METAINFO = "packaging/com.zshadow7x.linuxdoctor.metainfo.xml"; const RELEASES = ` https://github.com/7sh1d0w7x/linux-doctor/releases/tag/v0.6.0 `; test("bump-version: both RPM specs are bumped", () => { // The OBS spec lives under packaging/obs/ and was not in the script's list, // so 0.7.1 shipped with an OBS spec still on 0.6.0. assert.ok(paths.includes("packaging/linux-doctor.spec"), "the git rpm spec"); assert.ok(paths.includes("packaging/obs/linux-doctor.spec"), "the OBS spec"); }); test("bump-version: the AUR .SRCINFO source carries the current version", () => { // pkgver was bumped but the source line stayed on v0.6.0, so pkgver 0.7.1 sat // next to an old tarball — makepkg and the AUR reject the pair. assert.ok( source.includes("source = linux-doctor-${version}.tar.gz::"), "the script must rewrite the .SRCINFO source line, or pkgver and source drift", ); const src = readFileSync(join(ROOT, "packaging/aur/.SRCINFO"), "utf8"); const pkgver = src.match(/pkgver = ([\d.]+)/)[1]; assert.ok(src.includes(`linux-doctor-${pkgver}.tar.gz`), `.SRCINFO source must match pkgver ${pkgver}`); }); test("bump-version: the AppStream release list is bumped too", () => { // It drifted silently: after 0.6.1 the packaged metadata still advertised // 0.6.0, which app stores and appstreamcli read. assert.ok(paths.includes(METAINFO), "the metainfo must be in the script's file list"); const out = addRelease(RELEASES, "0.7.0", "2026-09-22"); assert.match(out, //); assert.match(out, /releases\/tag\/v0\.7\.0/); // newest first, and the previous entry kept assert.ok(out.indexOf('version="0.7.0"') < out.indexOf('version="0.6.0"'), "newest release goes first"); assert.equal(out.split("").length, 2, "the section is not duplicated"); // everything else in the file is untouched assert.ok(out.endsWith("\n")); }); test("bump-version: adding an existing release changes nothing", () => { const once = addRelease(RELEASES, "0.7.0", "2026-09-22"); assert.equal(addRelease(once, "0.7.0", "2026-09-22"), once, "re-running must not duplicate the entry"); }); test("bump-version: a metainfo without is a hard error, not a silent skip", () => { assert.throws(() => addRelease("", "0.7.0", "2026-09-22"), /no section/); }); test("bump-version: the real metainfo lists a release (so the file is not silently empty)", () => { const xml = readFileSync(join(ROOT, METAINFO), "utf8"); assert.match(xml, /\s*\n\s*