diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index efcdbd7..c0df6a2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,7 +6,7 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-16.04', 'ubuntu-18.04', 'macos-latest' ] - ruby: [ '2.4.9', '2.5.7', '2.6.5', '2.7.0', 'truffleruby', 'jruby' ] + ruby: [ 'ruby-2.4', '2.5', 'ruby-2.6.5', '2.7.0', 'truffleruby', 'jruby' ] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 diff --git a/README.md b/README.md index 99830b9..71de082 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ jobs: - uses: actions/checkout@v2 - uses: eregon/use-ruby-action@master with: - ruby-version: ruby-2.6.5 + ruby-version: ruby-2.6 - run: ruby -v ``` @@ -41,7 +41,7 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest', 'macos-latest' ] - ruby: [ 'ruby-2.6.5', 'ruby-2.7.0', 'truffleruby-19.3.0', 'jruby-9.2.9.0' ] + ruby: [ 'ruby-2.6', 'ruby-2.7', 'truffleruby-19.3.0', 'jruby-9.2.9.0' ] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 @@ -51,10 +51,12 @@ jobs: - run: ruby -v ``` -If a specific version is not given, it uses the latest stable release of that implementation. -For instance `truffleruby` is currently the same as `truffleruby-19.3.0`. +### Supported Version Syntax -If it's just a version number (e.g., `2.6.5`), then MRI is assumed (same as `ruby-2.6.5`). +* `engine-version` like `ruby-2.6.5` and `truffleruby-19.3.0` +* short version like `2.6`, automatically using the latest release matching that version (`2.6.5`) +* version only like `2.6.5`, assumes MRI for the engine +* engine only like `truffleruby`, uses the latest stable release of that implementation ### All Stable Versions @@ -69,7 +71,7 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest', 'macos-latest' ] - ruby: [ '2.4.9', '2.5.7', '2.6.5', '2.7.0', 'truffleruby', 'jruby' ] + ruby: [ '2.4', '2.5', '2.6', '2.7', 'truffleruby', 'jruby' ] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 diff --git a/dist/index.js b/dist/index.js index f541485..3603822 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1416,17 +1416,35 @@ async function getLatestReleaseTag() { } async function getRubyEngineAndVersion(rubyVersion) { + let engine, version if (rubyVersion.match(/^\d+/)) { // X.Y.Z => ruby-X.Y.Z - return 'ruby-' + rubyVersion + engine = 'ruby' + version = rubyVersion } else if (!rubyVersion.includes('-')) { // myruby -> myruby-stableVersion - const engine = rubyVersion - const response = await axios.get(`${metadataURL}/versions.json`) - const stableVersions = response.data[engine] - const latestStableVersion = stableVersions[stableVersions.length-1] - return engine + '-' + latestStableVersion - } else { - return rubyVersion + engine = rubyVersion + version = '' // Let the logic below find the version + } else { // engine-X.Y.Z + [engine, version] = rubyVersion.split('-', 2) } + + const response = await axios.get(`${metadataURL}/versions.json`) + const stableVersions = response.data + const engineVersions = stableVersions[engine] + if (!engineVersions) { + throw new Error(`Unknown engine ${engine} (${rubyVersion})`) + } + + if (!engineVersions.includes(version)) { + engineVersions.reverse() // inplace! + let found = engineVersions.find(v => v.startsWith(version)) + if (found) { + version = found + } else { + throw new Error(`Unknown version ${version} (${rubyVersion})`) + } + } + + return engine + '-' + version } function getVirtualEnvironmentName() { diff --git a/index.js b/index.js index 71f1323..2a0a3c1 100644 --- a/index.js +++ b/index.js @@ -37,17 +37,35 @@ async function getLatestReleaseTag() { } async function getRubyEngineAndVersion(rubyVersion) { + let engine, version if (rubyVersion.match(/^\d+/)) { // X.Y.Z => ruby-X.Y.Z - return 'ruby-' + rubyVersion + engine = 'ruby' + version = rubyVersion } else if (!rubyVersion.includes('-')) { // myruby -> myruby-stableVersion - const engine = rubyVersion - const response = await axios.get(`${metadataURL}/versions.json`) - const stableVersions = response.data[engine] - const latestStableVersion = stableVersions[stableVersions.length-1] - return engine + '-' + latestStableVersion - } else { - return rubyVersion + engine = rubyVersion + version = '' // Let the logic below find the version + } else { // engine-X.Y.Z + [engine, version] = rubyVersion.split('-', 2) } + + const response = await axios.get(`${metadataURL}/versions.json`) + const stableVersions = response.data + const engineVersions = stableVersions[engine] + if (!engineVersions) { + throw new Error(`Unknown engine ${engine} (${rubyVersion})`) + } + + if (!engineVersions.includes(version)) { + engineVersions.reverse() // inplace! + let found = engineVersions.find(v => v.startsWith(version)) + if (found) { + version = found + } else { + throw new Error(`Unknown version ${version} (${rubyVersion})`) + } + } + + return engine + '-' + version } function getVirtualEnvironmentName() {