mirror of
https://github.com/opentofu/setup-opentofu.git
synced 2025-12-06 16:15:57 +00:00
feat: added versions resolution logic to use user's input.
Signed-off-by: Dmitry Kisler <admin@dkisler.com>
This commit is contained in:
parent
137fcca5fe
commit
c68fac3149
6 changed files with 3715 additions and 272 deletions
|
|
@ -45,18 +45,55 @@ async function fetchReleases () {
|
|||
return releasesMeta.map(releaseMeta => new Release(releaseMeta));
|
||||
}
|
||||
|
||||
const semver = require('semver');
|
||||
|
||||
async function findLatestVersion (versions) {
|
||||
return versions.sort((a, b) => semver.rcompare(a, b))[0];
|
||||
}
|
||||
|
||||
async function findLatestVersionInRange (versions, range) {
|
||||
return semver.maxSatisfying(versions, range, { prerelease: true, loose: true });
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the release given the version.
|
||||
*
|
||||
* @param {string} version: Release version.
|
||||
* @param {function} fetchReleasesFn: Optional function to fetch releases.
|
||||
*/
|
||||
async function getRelease (version) {
|
||||
const releases = await fetchReleases();
|
||||
return releases.find(release => release.version === version);
|
||||
async function getRelease (version, fetchReleasesFn = fetchReleases) {
|
||||
const latestVersionLabel = 'latest';
|
||||
|
||||
const versionsRange = semver.validRange(version, { prerelease: true, loose: true });
|
||||
if (versionsRange === null && version !== latestVersionLabel) {
|
||||
throw new Error('Input version cannot be used, see semver: https://semver.org/spec/v2.0.0.html');
|
||||
}
|
||||
|
||||
const releases = await fetchReleasesFn();
|
||||
|
||||
if (releases === null || releases.length === 0) {
|
||||
throw new Error('No tofu releases found, please contact OpenTofu');
|
||||
}
|
||||
|
||||
const versionsFound = releases.map(release => release.version);
|
||||
let versionSelected;
|
||||
if (version === latestVersionLabel) {
|
||||
versionSelected = findLatestVersion(versionsFound);
|
||||
} else {
|
||||
versionSelected = await findLatestVersionInRange(versionsFound, versionsRange);
|
||||
}
|
||||
|
||||
if (versionSelected === null) {
|
||||
throw new Error('No matching version found');
|
||||
}
|
||||
|
||||
return releases.find(release => release.version === versionSelected);
|
||||
}
|
||||
|
||||
// Note that the export is defined as adaptor to replace hashicorp/js-releases
|
||||
// See: https://github.com/hashicorp/setup-terraform/blob/e192cfcbae6c6ed207c277ed7624131996c9bf13/lib/setup-terraform.js#L15
|
||||
module.exports = {
|
||||
getRelease
|
||||
getRelease,
|
||||
Release,
|
||||
Build
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue