Add latest-known version selector (#993)

## Summary

- add `latest-known` as an explicit version selector
- resolve it locally to the newest version in the bundled checksum table
- preserve existing default and `latest` behavior
- document custom-manifest checksum semantics and update published
bundles

## Testing

- `npm ci --ignore-scripts`
- `npm run all` (99 tests passed)

Closes #919

Refs: pi-session 019fed0e-6019-7504-911b-bd9955cbbd49
This commit is contained in:
Kevin Stillhammer
2026-08-11 11:15:59 +02:00
committed by GitHub
parent f45168497b
commit 18d451d679
10 changed files with 138 additions and 62 deletions
Generated Vendored
+34 -13
View File
@@ -20008,8 +20008,8 @@ var require_rcompare = __commonJS({
"node_modules/@actions/cache/node_modules/semver/functions/rcompare.js"(exports2, module2) {
"use strict";
var compare2 = require_compare();
var rcompare2 = (a, b, loose) => compare2(b, a, loose);
module2.exports = rcompare2;
var rcompare3 = (a, b, loose) => compare2(b, a, loose);
module2.exports = rcompare3;
}
});
@@ -21234,7 +21234,7 @@ var require_semver2 = __commonJS({
var patch2 = require_patch();
var prerelease = require_prerelease();
var compare2 = require_compare();
var rcompare2 = require_rcompare();
var rcompare3 = require_rcompare();
var compareLoose = require_compare_loose();
var compareBuild = require_compare_build();
var sort = require_sort();
@@ -21272,7 +21272,7 @@ var require_semver2 = __commonJS({
patch: patch2,
prerelease,
compare: compare2,
rcompare: rcompare2,
rcompare: rcompare3,
compareLoose,
compareBuild,
sort,
@@ -27618,8 +27618,8 @@ var require_rcompare2 = __commonJS({
"node_modules/@actions/tool-cache/node_modules/semver/functions/rcompare.js"(exports2, module2) {
"use strict";
var compare2 = require_compare2();
var rcompare2 = (a, b, loose) => compare2(b, a, loose);
module2.exports = rcompare2;
var rcompare3 = (a, b, loose) => compare2(b, a, loose);
module2.exports = rcompare3;
}
});
@@ -28844,7 +28844,7 @@ var require_semver4 = __commonJS({
var patch2 = require_patch2();
var prerelease = require_prerelease2();
var compare2 = require_compare2();
var rcompare2 = require_rcompare2();
var rcompare3 = require_rcompare2();
var compareLoose = require_compare_loose2();
var compareBuild = require_compare_build2();
var sort = require_sort2();
@@ -28882,7 +28882,7 @@ var require_semver4 = __commonJS({
patch: patch2,
prerelease,
compare: compare2,
rcompare: rcompare2,
rcompare: rcompare3,
compareLoose,
compareBuild,
sort,
@@ -54868,8 +54868,8 @@ var require_semver5 = __commonJS({
var versionB = new SemVer(b, loose);
return versionA.compare(versionB) || versionA.compareBuild(versionB);
}
exports2.rcompare = rcompare2;
function rcompare2(a, b, loose) {
exports2.rcompare = rcompare3;
function rcompare3(a, b, loose) {
return compare2(b, a, loose);
}
exports2.sort = sort;
@@ -96923,7 +96923,25 @@ function contains(specifier, input) {
}
// src/version/resolve.ts
var semver5 = __toESM(require_semver5(), 1);
// src/download/checksum/known-version.ts
var semver4 = __toESM(require_semver5(), 1);
var VERSION_IN_CHECKSUM_KEY_PATTERN = /-(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)$/;
function getLatestKnownVersion() {
const versions = /* @__PURE__ */ new Set();
for (const key of Object.keys(KNOWN_CHECKSUMS)) {
const version3 = key.match(VERSION_IN_CHECKSUM_KEY_PATTERN)?.[1];
if (version3 !== void 0) {
versions.add(version3);
}
}
const latestVersion = [...versions].sort(semver4.rcompare)[0];
if (!latestVersion) {
throw new Error("Could not determine latest known version from checksums.");
}
return latestVersion;
}
// src/version/specifier.ts
function normalizeVersionSpecifier(specifier) {
@@ -97993,6 +98011,9 @@ async function resolveUvVersion(options) {
}
async function resolveVersion(versionInput, manifestUrl, resolutionStrategy = "highest") {
debug(`Resolving version: ${versionInput}`);
if (versionInput.trim() === "latest-known") {
return getLatestKnownVersion();
}
const context3 = {
manifestUrl,
parsedSpecifier: parseVersionSpecifier(versionInput),
@@ -98007,10 +98028,10 @@ async function resolveVersion(versionInput, manifestUrl, resolutionStrategy = "h
throw new Error(`No version found for ${versionInput}`);
}
async function findHighestSatisfyingVersion(versionSpecifier) {
const semverRange = semver4.validRange(versionSpecifier);
const semverRange = semver5.validRange(versionSpecifier);
if (semverRange !== null) {
const semverMatch = await getFirstMatchingVersion(
(version3) => semver4.satisfies(version3, semverRange)
(version3) => semver5.satisfies(version3, semverRange)
);
if (semverMatch !== void 0) {
debug(
@@ -98045,7 +98066,7 @@ function maxSatisfying2(versions, version3) {
return void 0;
}
function minSatisfying3(versions, version3) {
const minSemver = semver4.minSatisfying(versions, version3);
const minSemver = semver5.minSatisfying(versions, version3);
if (minSemver !== null) {
debug(`Found a version that satisfies the semver range: ${minSemver}`);
return minSemver;
+22 -20
View File
@@ -45701,6 +45701,9 @@ function info(message) {
}
// src/update-known-checksums.ts
var semver2 = __toESM(require_semver(), 1);
// src/download/checksum/known-version.ts
var semver = __toESM(require_semver(), 1);
// src/download/checksum/known-checksums.ts
@@ -50833,6 +50836,23 @@ var KNOWN_CHECKSUMS = {
"x86_64-unknown-linux-musl-0.0.5": "705bbe04a93a9d4d9db5224c2f980a88bba272538a33a78ea2e966f46b4d5eb7"
};
// src/download/checksum/known-version.ts
var VERSION_IN_CHECKSUM_KEY_PATTERN = /-(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)$/;
function getLatestKnownVersion() {
const versions = /* @__PURE__ */ new Set();
for (const key of Object.keys(KNOWN_CHECKSUMS)) {
const version = key.match(VERSION_IN_CHECKSUM_KEY_PATTERN)?.[1];
if (version !== void 0) {
versions.add(version);
}
}
const latestVersion = [...versions].sort(semver.rcompare)[0];
if (!latestVersion) {
throw new Error("Could not determine latest known version from checksums.");
}
return latestVersion;
}
// src/download/checksum/update-known-checksums.ts
var import_node_fs = require("node:fs");
async function updateChecksums(filePath, checksumEntries) {
@@ -51047,7 +51067,6 @@ function isRecord(value) {
}
// src/update-known-checksums.ts
var VERSION_IN_CHECKSUM_KEY_PATTERN = /-(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)$/;
async function run() {
const checksumFilePath = process.argv.slice(2)[0];
if (!checksumFilePath) {
@@ -51056,8 +51075,8 @@ async function run() {
);
}
const latestVersion = await getLatestVersion();
const latestKnownVersion = getLatestKnownVersionFromChecksums();
if (semver.lte(latestVersion, latestKnownVersion)) {
const latestKnownVersion = getLatestKnownVersion();
if (semver2.lte(latestVersion, latestKnownVersion)) {
info2(
`Latest release (${latestVersion}) is not newer than the latest known version (${latestKnownVersion}). Skipping update.`
);
@@ -51068,23 +51087,6 @@ async function run() {
await updateChecksums(checksumFilePath, checksumEntries);
setOutput("latest-version", latestVersion);
}
function getLatestKnownVersionFromChecksums() {
const versions = /* @__PURE__ */ new Set();
for (const key of Object.keys(KNOWN_CHECKSUMS)) {
const version = extractVersionFromChecksumKey(key);
if (version !== void 0) {
versions.add(version);
}
}
const latestVersion = [...versions].sort(semver.rcompare)[0];
if (!latestVersion) {
throw new Error("Could not determine latest known version from checksums.");
}
return latestVersion;
}
function extractVersionFromChecksumKey(key) {
return key.match(VERSION_IN_CHECKSUM_KEY_PATTERN)?.[1];
}
function extractChecksumsFromManifest(versions) {
const checksums = [];
for (const version of versions) {