diff --git a/dist/index.js b/dist/index.js index cd836d8e..c524924e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -9995,6 +9995,8 @@ async function maybeInstallRebar3(rebar3Spec) { } async function getOTPVersion(otpSpec0, osVersion) { + otpSpec0 = + otpSpec0 == 'latest' ? await getLatestVersion('erlang', 'otp') : otpSpec0 const otpVersions = await getOTPVersions(osVersion) let spec = otpSpec0.replace(/^OTP-/, '') const versions = otpVersions @@ -10010,6 +10012,14 @@ async function getOTPVersion(otpSpec0, osVersion) { } async function getElixirVersion(exSpec0, otpVersion0) { + exSpec0 = + exSpec0 == 'latest' + ? await getLatestVersion('elixir-lang', 'elixir') + : exSpec0 + otpVersion0 = + otpVersion0 == 'latest' + ? await getLatestVersion('erlang', 'otp') + : otpVersion0 const otpVersion = otpVersion0.match(/^([^-]+-)?(.+)$/)[2] const otpVersionMajor = otpVersion.match(/^([^.]+).*$/)[1] @@ -10052,6 +10062,10 @@ async function getElixirVersion(exSpec0, otpVersion0) { } async function getGleamVersion(gleamSpec0) { + gleamSpec0 = + gleamSpec0 == 'latest' + ? await getLatestVersion('gleam-lang', 'gleam') + : gleamSpec0 const gleamVersions = await getGleamVersions() const spec = gleamSpec0 const versions = gleamVersions @@ -10067,6 +10081,8 @@ async function getGleamVersion(gleamSpec0) { } async function getRebar3Version(r3Spec) { + r3Spec = + r3Spec == 'latest' ? await getLatestVersion('erlang', 'rebar3') : r3Spec const rebar3Versions = await getRebar3Versions() const spec = r3Spec const versions = rebar3Versions @@ -10205,6 +10221,14 @@ async function getRebar3Versions() { return rebar3VersionsListing } +async function getLatestVersion(owner, repo) { + const response = await fetch( + `https://api.github.com/repos/${owner}/${repo}/releases/latest`, + ) + const json = await response.json() + return json.tag_name +} + function isStrictVersion() { return getInput('version-type', false) === 'strict' } diff --git a/src/setup-beam.js b/src/setup-beam.js index 712aed1b..7e6b4daf 100644 --- a/src/setup-beam.js +++ b/src/setup-beam.js @@ -164,6 +164,8 @@ async function maybeInstallRebar3(rebar3Spec) { } async function getOTPVersion(otpSpec0, osVersion) { + otpSpec0 = + otpSpec0 == 'latest' ? await getLatestVersion('erlang', 'otp') : otpSpec0 const otpVersions = await getOTPVersions(osVersion) let spec = otpSpec0.replace(/^OTP-/, '') const versions = otpVersions @@ -179,6 +181,14 @@ async function getOTPVersion(otpSpec0, osVersion) { } async function getElixirVersion(exSpec0, otpVersion0) { + exSpec0 = + exSpec0 == 'latest' + ? await getLatestVersion('elixir-lang', 'elixir') + : exSpec0 + otpVersion0 = + otpVersion0 == 'latest' + ? await getLatestVersion('erlang', 'otp') + : otpVersion0 const otpVersion = otpVersion0.match(/^([^-]+-)?(.+)$/)[2] const otpVersionMajor = otpVersion.match(/^([^.]+).*$/)[1] @@ -221,6 +231,10 @@ async function getElixirVersion(exSpec0, otpVersion0) { } async function getGleamVersion(gleamSpec0) { + gleamSpec0 = + gleamSpec0 == 'latest' + ? await getLatestVersion('gleam-lang', 'gleam') + : gleamSpec0 const gleamVersions = await getGleamVersions() const spec = gleamSpec0 const versions = gleamVersions @@ -236,6 +250,8 @@ async function getGleamVersion(gleamSpec0) { } async function getRebar3Version(r3Spec) { + r3Spec = + r3Spec == 'latest' ? await getLatestVersion('erlang', 'rebar3') : r3Spec const rebar3Versions = await getRebar3Versions() const spec = r3Spec const versions = rebar3Versions @@ -374,6 +390,14 @@ async function getRebar3Versions() { return rebar3VersionsListing } +async function getLatestVersion(owner, repo) { + const response = await fetch( + `https://api.github.com/repos/${owner}/${repo}/releases/latest`, + ) + const json = await response.json() + return json.tag_name +} + function isStrictVersion() { return getInput('version-type', false) === 'strict' } diff --git a/test/setup-beam.test.js b/test/setup-beam.test.js index ed5b11c9..a752fcde 100644 --- a/test/setup-beam.test.js +++ b/test/setup-beam.test.js @@ -196,6 +196,12 @@ async function testOTPVersions() { expected = 'master' got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors) assert.deepStrictEqual(got, expected) + + spec = 'latest' + osVersion = 'ubuntu-22.04' + expected = 'OTP-26.2.5' + got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors) + assert.deepStrictEqual(got, expected) } if (process.platform === 'win32') { @@ -216,6 +222,12 @@ async function testOTPVersions() { expected = '23.0.4' got = await setupBeam.getOTPVersion(spec, osVersion) assert.deepStrictEqual(got, expected) + + spec = 'latest' + osVersion = 'windows-2019' + expected = '26.2.5' + got = await setupBeam.getOTPVersion(spec, osVersion) + assert.deepStrictEqual(got, expected) } simulateInput('hexpm-mirrors', hexMirrors, { multiline: true }) @@ -289,6 +301,18 @@ async function testElixirVersions() { assert.deepStrictEqual(got, expected) simulateInput('version-type', before) + spec = 'latest' + otpVersion = '24' + expected = 'v1.16.2-otp-24' + got = await setupBeam.getElixirVersion(spec, otpVersion) + assert.deepStrictEqual(got, expected) + + spec = 'latest' + otpVersion = 'latest' + expected = 'v1.16.2-otp-26' + got = await setupBeam.getElixirVersion(spec, otpVersion) + assert.deepStrictEqual(got, expected) + simulateInput('hexpm-mirrors', hexMirrors, { multiline: true }) } @@ -317,6 +341,12 @@ async function testGleamVersions() { got = await setupBeam.getGleamVersion(spec, otpVersion) assert.deepStrictEqual(got, expected) simulateInput('version-type', before) + + spec = 'latest' + otpVersion = 'OTP-24' + expected = 'v1.1.0' + got = await setupBeam.getGleamVersion(spec, otpVersion) + assert.deepStrictEqual(got, expected) } async function testRebar3Versions() { @@ -338,6 +368,11 @@ async function testRebar3Versions() { expected = '3.10.0' got = await setupBeam.getRebar3Version(spec) assert.deepStrictEqual(got, expected) + + spec = 'latest' + expected = '3.23.0' + got = await setupBeam.getRebar3Version(spec) + assert.deepStrictEqual(got, expected) } async function testGetVersionFromSpec() { @@ -528,7 +563,7 @@ async function testParseVersionFile() { erlang ref:v${erlang}# comment, no space, and ref:v elixir ref:${elixir} # comment, with space and ref: not-gleam 0.23 # not picked up -gleam ${gleam} +gleam ${gleam} rebar ${rebar3}` const filename = 'test/.tool-versions' fs.writeFileSync(filename, toolVersions)