From 12ca1d0a1af229da7be8ae5c59faed74844e2c6a Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Thu, 24 Jun 2021 22:14:45 +0100 Subject: [PATCH 01/16] Support more OTP+Windows versions (try to bridge the gap with gleam-lang/setup-erlang that seems to support pre-21 versions) --- .github/workflows/test.yml | 12 ++++++++++++ README.md | 6 ++++-- dist/index.js | 21 +++++++++------------ dist/install-otp.ps1 | 7 +++++-- dist/install-rebar3.ps1 | 3 ++- src/install-otp.ps1 | 7 +++++-- src/install-rebar3.ps1 | 3 ++- src/setup-beam.js | 21 +++++++++------------ 8 files changed, 48 insertions(+), 32 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 50229d86..9cc90cd8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -162,6 +162,18 @@ jobs: - otp-version: '23.0' rebar3-version: '3.15' os: 'windows-2016' + - otp-version: '22.3' + rebar3-version: '3.15' + os: 'windows-2016' + - otp-version: '22.0' + rebar3-version: '3.15' + os: 'windows-2016' + - otp-version: '21.3' + rebar3-version: '3.15' + os: 'windows-2016' + - otp-version: '21.0' + rebar3-version: '3.15' + os: 'windows-2016' steps: - uses: actions/checkout@v2 - name: Use erlef/setup-beam diff --git a/README.md b/README.md index fcbb8480..b9b6f381 100644 --- a/README.md +++ b/README.md @@ -45,8 +45,10 @@ and Erlang/OTP. | ubuntu-16.04 | 17 - 24 | ✅ | ubuntu-18.04 | 17 - 24 | ✅ | ubuntu-20.04 | 20 - 24 | ✅ -| windows-2016 | 23 - 24 | ✅ -| windows-2019 | 23 - 24 | ✅ +| windows-2016 | 21* - 24 | ✅ +| windows-2019 | 21* - 24 | ✅ + +**Note** *: prior to 23, Windows builds are only available for minor versions, e.g. 21.0, 21.3, 22.0, etc. ### Basic example (Elixir) diff --git a/dist/index.js b/dist/index.js index d2615a36..8c811dc3 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4659,6 +4659,7 @@ const { exec } = __nccwpck_require__(1514) const path = __nccwpck_require__(5622) const semver = __nccwpck_require__(1383) const https = __nccwpck_require__(7211) +const fs = __nccwpck_require__(5747) const installer = __nccwpck_require__(2127) main().catch((err) => { @@ -4701,9 +4702,13 @@ async function installOTP(otpSpec, osVersion) { await installer.installOTP(osVersion, otpVersion) core.setOutput('otp-version', otpVersion) if (process.platform === 'linux') { - prependToPath(`${process.env.RUNNER_TEMP}/.setup-beam/otp/bin`) + core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/otp/bin`) } else if (process.platform === 'win32') { - prependToPath(`C:/Program Files/erl-${otpVersion}/bin`) + const prePath = fs.readFileSync(`${process.env.RUNNER_TEMP}/pre_path.txt`, { + encoding: 'utf8', + flag: 'r', + }) + core.addPath(prePath) } console.log('##[endgroup]') @@ -4720,7 +4725,7 @@ async function maybeInstallElixir(elixirSpec, otpVersion, shouldMixHex) { console.log( `##[add-matcher]${path.join(matchersPath, 'elixir-matchers.json')}`, ) - prependToPath(`${process.env.RUNNER_TEMP}/.setup-beam/elixir/bin`) + core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/elixir/bin`) console.log('##[endgroup]') return true @@ -4751,7 +4756,7 @@ async function maybeInstallRebar3(rebar3Spec) { console.log(`##[group]Installing rebar3 ${rebar3Version}`) await installer.installRebar3(rebar3Version) core.setOutput('rebar3-version', rebar3Version) - prependToPath(`${process.env.RUNNER_TEMP}/.setup-beam/rebar3/bin`) + core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/rebar3/bin`) console.log('##[endgroup]') return true @@ -4998,14 +5003,6 @@ async function get(url0, pageIdxs) { return ret } -function prependToPath(what) { - if (process.platform === 'linux') { - process.env.PATH = `${what}:${process.env.PATH}` - } else if (process.platform === 'win32') { - process.env.PATH = `${what};${process.env.PATH}` - } -} - function hasPatch(v) { try { semver.patch(v) diff --git a/dist/install-otp.ps1 b/dist/install-otp.ps1 index 7f0c30e1..da402e19 100644 --- a/dist/install-otp.ps1 +++ b/dist/install-otp.ps1 @@ -14,6 +14,9 @@ $ProgressPreference="Continue" New-Item "$DIR_FOR_BIN" -ItemType Directory | Out-Null Move-Item "$FILE_OUTPUT" "$DIR_FOR_BIN" Start-Process "./$DIR_FOR_BIN/$FILE_OUTPUT" /S -Wait -Write-Output "C:/Program Files/erl-$VSN/bin" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append +$ErlExec = Get-ChildItem -Path "C:/Program Files/" -Recurse -Depth 2 -Filter 'erl.exe' -Name | ForEach-Object { Write-Output "C:/Program Files/$_" } +$ErlPath = Split-Path -Path "$ErlExec" +Write-Output "$ErlPath" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append +Write-Output "$ErlPath" | Out-File -FilePath pre_path.txt -Encoding utf8 -NoNewline Write-Output "Installed Erlang/OTP version follows" -& "C:/Program Files/erl-$VSN/bin/erl.exe" "+V" | Write-Output +& "$ErlPath/erl.exe" "+V" | Write-Output diff --git a/dist/install-rebar3.ps1 b/dist/install-rebar3.ps1 index 296c93e2..a1ffef0a 100644 --- a/dist/install-rebar3.ps1 +++ b/dist/install-rebar3.ps1 @@ -16,7 +16,8 @@ Invoke-WebRequest "https://github.com/erlang/rebar3/releases/download/${VSN}/${F $ProgressPreference="Continue" New-Item "$DIR_FOR_BIN/bin" -ItemType Directory | Out-Null Move-Item "$FILE_OUTPUT" "$DIR_FOR_BIN/bin" -Write-Output "& escript.exe $PWD/$DIR_FOR_BIN/bin/$FILE_OUTPUT `$args" | Out-File -FilePath "$FILE_OUTPUT_PS1" -Encoding utf8 -Append +$PrePath = Get-Content pre_path.txt +Write-Output "& ""$PrePath\escript.exe"" $PWD/$DIR_FOR_BIN/bin/$FILE_OUTPUT `$args" | Out-File -FilePath "$FILE_OUTPUT_PS1" -Encoding utf8 -Append type $FILE_OUTPUT_PS1 Move-Item "$FILE_OUTPUT_PS1" "$DIR_FOR_BIN/bin" Write-Output "$PWD/$DIR_FOR_BIN/bin" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append diff --git a/src/install-otp.ps1 b/src/install-otp.ps1 index 7f0c30e1..da402e19 100644 --- a/src/install-otp.ps1 +++ b/src/install-otp.ps1 @@ -14,6 +14,9 @@ $ProgressPreference="Continue" New-Item "$DIR_FOR_BIN" -ItemType Directory | Out-Null Move-Item "$FILE_OUTPUT" "$DIR_FOR_BIN" Start-Process "./$DIR_FOR_BIN/$FILE_OUTPUT" /S -Wait -Write-Output "C:/Program Files/erl-$VSN/bin" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append +$ErlExec = Get-ChildItem -Path "C:/Program Files/" -Recurse -Depth 2 -Filter 'erl.exe' -Name | ForEach-Object { Write-Output "C:/Program Files/$_" } +$ErlPath = Split-Path -Path "$ErlExec" +Write-Output "$ErlPath" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append +Write-Output "$ErlPath" | Out-File -FilePath pre_path.txt -Encoding utf8 -NoNewline Write-Output "Installed Erlang/OTP version follows" -& "C:/Program Files/erl-$VSN/bin/erl.exe" "+V" | Write-Output +& "$ErlPath/erl.exe" "+V" | Write-Output diff --git a/src/install-rebar3.ps1 b/src/install-rebar3.ps1 index 296c93e2..a1ffef0a 100644 --- a/src/install-rebar3.ps1 +++ b/src/install-rebar3.ps1 @@ -16,7 +16,8 @@ Invoke-WebRequest "https://github.com/erlang/rebar3/releases/download/${VSN}/${F $ProgressPreference="Continue" New-Item "$DIR_FOR_BIN/bin" -ItemType Directory | Out-Null Move-Item "$FILE_OUTPUT" "$DIR_FOR_BIN/bin" -Write-Output "& escript.exe $PWD/$DIR_FOR_BIN/bin/$FILE_OUTPUT `$args" | Out-File -FilePath "$FILE_OUTPUT_PS1" -Encoding utf8 -Append +$PrePath = Get-Content pre_path.txt +Write-Output "& ""$PrePath\escript.exe"" $PWD/$DIR_FOR_BIN/bin/$FILE_OUTPUT `$args" | Out-File -FilePath "$FILE_OUTPUT_PS1" -Encoding utf8 -Append type $FILE_OUTPUT_PS1 Move-Item "$FILE_OUTPUT_PS1" "$DIR_FOR_BIN/bin" Write-Output "$PWD/$DIR_FOR_BIN/bin" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append diff --git a/src/setup-beam.js b/src/setup-beam.js index 234aa2c6..ea4e52e9 100644 --- a/src/setup-beam.js +++ b/src/setup-beam.js @@ -3,6 +3,7 @@ const { exec } = require('@actions/exec') const path = require('path') const semver = require('semver') const https = require('https') +const fs = require('fs') const installer = require('./installer') main().catch((err) => { @@ -45,9 +46,13 @@ async function installOTP(otpSpec, osVersion) { await installer.installOTP(osVersion, otpVersion) core.setOutput('otp-version', otpVersion) if (process.platform === 'linux') { - prependToPath(`${process.env.RUNNER_TEMP}/.setup-beam/otp/bin`) + core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/otp/bin`) } else if (process.platform === 'win32') { - prependToPath(`C:/Program Files/erl-${otpVersion}/bin`) + const prePath = fs.readFileSync(`${process.env.RUNNER_TEMP}/pre_path.txt`, { + encoding: 'utf8', + flag: 'r', + }) + core.addPath(prePath) } console.log('##[endgroup]') @@ -64,7 +69,7 @@ async function maybeInstallElixir(elixirSpec, otpVersion, shouldMixHex) { console.log( `##[add-matcher]${path.join(matchersPath, 'elixir-matchers.json')}`, ) - prependToPath(`${process.env.RUNNER_TEMP}/.setup-beam/elixir/bin`) + core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/elixir/bin`) console.log('##[endgroup]') return true @@ -95,7 +100,7 @@ async function maybeInstallRebar3(rebar3Spec) { console.log(`##[group]Installing rebar3 ${rebar3Version}`) await installer.installRebar3(rebar3Version) core.setOutput('rebar3-version', rebar3Version) - prependToPath(`${process.env.RUNNER_TEMP}/.setup-beam/rebar3/bin`) + core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/rebar3/bin`) console.log('##[endgroup]') return true @@ -342,14 +347,6 @@ async function get(url0, pageIdxs) { return ret } -function prependToPath(what) { - if (process.platform === 'linux') { - process.env.PATH = `${what}:${process.env.PATH}` - } else if (process.platform === 'win32') { - process.env.PATH = `${what};${process.env.PATH}` - } -} - function hasPatch(v) { try { semver.patch(v) From 4bb676de289a381ce4de1929bc38c29768ad158f Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Fri, 25 Jun 2021 00:00:58 +0100 Subject: [PATCH 02/16] Merge ci.yml and test.yml --- .github/workflows/ci.yml | 32 -------------------------------- .github/workflows/test.yml | 33 ++++++++++++++++++++++++++------- README.md | 4 +--- 3 files changed, 27 insertions(+), 42 deletions(-) delete mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 357ed8a6..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: ci - -on: - push: - branches: - - main - pull_request: - branches: - - main - -jobs: - check_integrity: - name: Make sure expected pre-release actions are performed - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '12' - - run: npm install -g npm - - run: npm install - - run: npm run build - - run: npm run format - - run: npm install -g markdownlint-cli - - run: npm run markdownlint - - run: npm run shellcheck - - run: npm run yamllint - - run: npm run jslint - - run: npm run licenses - - name: Check if build left artifacts - run: git diff --exit-code diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9cc90cd8..bfeec066 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,8 +10,29 @@ on: - main jobs: + check_integrity: + name: Expected local npm actions + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: '12' + - run: npm install -g npm + - run: npm install + - run: npm run build + - run: npm run format + - run: npm install -g markdownlint-cli + - run: npm run markdownlint + - run: npm run shellcheck + - run: npm run yamllint + - run: npm run jslint + - run: npm run licenses + - name: Check if build left artifacts + run: git diff --exit-code + unit_test: - name: Pre-release unit tests + name: Unit tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -21,9 +42,8 @@ jobs: - run: npm test integration_test_ubuntu: - name: > - Pre-release integration tests - (Ubuntu ${{matrix.combo.os}}, + name: Integration tests (Ubuntu) + (on ${{matrix.combo.os}}, Erlang/OTP ${{matrix.combo.otp-version}}, Elixir ${{matrix.combo.elixir-version}}, rebar3 ${{matrix.combo.rebar3-version}}) @@ -140,9 +160,8 @@ jobs: if: ${{matrix.combo.rebar3-version}} integration_test_windows: - name: > - Pre-release integration tests - (Windows ${{matrix.combo.os}}, + name: Integration tests (Windows) + (on ${{matrix.combo.os}}, Erlang/OTP ${{matrix.combo.otp-version}}, rebar3 ${{matrix.combo.rebar3-version}}) runs-on: ${{matrix.combo.os}} diff --git a/README.md b/README.md index b9b6f381..244954f8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,8 @@ -# setup-beam [![GitHub Actions Test][test-img]][test] [![GitHub Actions CI][ci-img]][ci] +# setup-beam [![GitHub Actions Test][test-img]][test] [![GitHub Actions CI] [test]: https://github.com/erlef/setup-beam [test-img]: https://github.com/erlef/setup-beam/workflows/test/badge.svg -[ci]: https://github.com/erlef/setup-beam -[ci-img]: https://github.com/erlef/setup-beam/workflows/ci/badge.svg This action sets up an Erlang/OTP environment for use in a GitHub Actions workflow by: From bd574ce71fe6e348f86dea65c3f84799a9a794e8 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Fri, 25 Jun 2021 00:28:54 +0100 Subject: [PATCH 03/16] Stop removing stuff we don't need to --- dist/install-elixir.sh | 3 --- dist/install-otp.ps1 | 1 - dist/install-otp.sh | 3 --- dist/install-rebar3.ps1 | 2 -- dist/install-rebar3.sh | 2 -- src/install-elixir.sh | 3 --- src/install-otp.ps1 | 1 - src/install-otp.sh | 3 --- src/install-rebar3.ps1 | 2 -- src/install-rebar3.sh | 2 -- 10 files changed, 22 deletions(-) diff --git a/dist/install-elixir.sh b/dist/install-elixir.sh index e7139be5..22259e0e 100755 --- a/dist/install-elixir.sh +++ b/dist/install-elixir.sh @@ -9,12 +9,9 @@ FILE_INPUT="${VSN}.zip" FILE_OUTPUT=elixir.zip DIR_FOR_BIN=.setup-beam/elixir -rm -f "${FILE_OUTPUT}" -rm -rf "${DIR_FOR_BIN}" wget -q -O "${FILE_OUTPUT}" "https://repo.hex.pm/builds/elixir/${FILE_INPUT}" mkdir -p "${DIR_FOR_BIN}" unzip -q -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}" -rm -f "${FILE_OUTPUT}" echo "$(pwd)/${DIR_FOR_BIN}/bin" >> "$GITHUB_PATH" echo "Installed Elixir version follows" ${DIR_FOR_BIN}/bin/iex -v diff --git a/dist/install-otp.ps1 b/dist/install-otp.ps1 index da402e19..dcd810c4 100644 --- a/dist/install-otp.ps1 +++ b/dist/install-otp.ps1 @@ -7,7 +7,6 @@ Set-Location $Env:RUNNER_TEMP $FILE_OUTPUT="otp.exe" $DIR_FOR_BIN=".setup-beam/otp" -Remove-Item -Recurse -Force "$DIR_FOR_BIN" -ErrorAction SilentlyContinue $ProgressPreference="SilentlyContinue" Invoke-WebRequest "https://github.com/erlang/otp/releases/download/OTP-$VSN/otp_win64_$VSN.exe" -OutFile "$FILE_OUTPUT" $ProgressPreference="Continue" diff --git a/dist/install-otp.sh b/dist/install-otp.sh index b3e740d6..c96d8141 100755 --- a/dist/install-otp.sh +++ b/dist/install-otp.sh @@ -10,12 +10,9 @@ FILE_INPUT="${VSN}.tar.gz" FILE_OUTPUT=otp.tar.gz DIR_FOR_BIN=.setup-beam/otp -rm -f "${FILE_OUTPUT}" -rm -rf "${DIR_FOR_BIN}" wget -q -O "${FILE_OUTPUT}" "https://repo.hex.pm/builds/otp/${OS}/${FILE_INPUT}" mkdir -p "${DIR_FOR_BIN}" tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}" --strip-components=1 -rm -f "${FILE_OUTPUT}" "${DIR_FOR_BIN}/Install" -minimal "$(pwd)/${DIR_FOR_BIN}" echo "$(pwd)/${DIR_FOR_BIN}/bin" >> "$GITHUB_PATH" echo "Installed Erlang/OTP version follows" diff --git a/dist/install-rebar3.ps1 b/dist/install-rebar3.ps1 index a1ffef0a..093346dd 100644 --- a/dist/install-rebar3.ps1 +++ b/dist/install-rebar3.ps1 @@ -9,8 +9,6 @@ $FILE_OUTPUT="rebar3" $FILE_OUTPUT_PS1="rebar3.ps1" $DIR_FOR_BIN=".setup-beam/rebar3" -Remove-Item -Force "$FILE_OUTPUT" -ErrorAction SilentlyContinue -Remove-Item -Recurse -Force "$DIR_FOR_BIN" -ErrorAction SilentlyContinue $ProgressPreference="SilentlyContinue" Invoke-WebRequest "https://github.com/erlang/rebar3/releases/download/${VSN}/${FILE_INPUT}" -OutFile "$FILE_OUTPUT" $ProgressPreference="Continue" diff --git a/dist/install-rebar3.sh b/dist/install-rebar3.sh index 4e918833..f7fc7802 100755 --- a/dist/install-rebar3.sh +++ b/dist/install-rebar3.sh @@ -9,8 +9,6 @@ FILE_INPUT=rebar3 FILE_OUTPUT=rebar3 DIR_FOR_BIN=.setup-beam/rebar3 -rm -f "${FILE_OUTPUT}" -rm -rf "${DIR_FOR_BIN}" wget -q -O "${FILE_OUTPUT}" "https://github.com/erlang/rebar3/releases/download/${VSN}/${FILE_INPUT}" mkdir -p "${DIR_FOR_BIN}/bin" chmod +x "${FILE_OUTPUT}" diff --git a/src/install-elixir.sh b/src/install-elixir.sh index e7139be5..22259e0e 100755 --- a/src/install-elixir.sh +++ b/src/install-elixir.sh @@ -9,12 +9,9 @@ FILE_INPUT="${VSN}.zip" FILE_OUTPUT=elixir.zip DIR_FOR_BIN=.setup-beam/elixir -rm -f "${FILE_OUTPUT}" -rm -rf "${DIR_FOR_BIN}" wget -q -O "${FILE_OUTPUT}" "https://repo.hex.pm/builds/elixir/${FILE_INPUT}" mkdir -p "${DIR_FOR_BIN}" unzip -q -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}" -rm -f "${FILE_OUTPUT}" echo "$(pwd)/${DIR_FOR_BIN}/bin" >> "$GITHUB_PATH" echo "Installed Elixir version follows" ${DIR_FOR_BIN}/bin/iex -v diff --git a/src/install-otp.ps1 b/src/install-otp.ps1 index da402e19..dcd810c4 100644 --- a/src/install-otp.ps1 +++ b/src/install-otp.ps1 @@ -7,7 +7,6 @@ Set-Location $Env:RUNNER_TEMP $FILE_OUTPUT="otp.exe" $DIR_FOR_BIN=".setup-beam/otp" -Remove-Item -Recurse -Force "$DIR_FOR_BIN" -ErrorAction SilentlyContinue $ProgressPreference="SilentlyContinue" Invoke-WebRequest "https://github.com/erlang/otp/releases/download/OTP-$VSN/otp_win64_$VSN.exe" -OutFile "$FILE_OUTPUT" $ProgressPreference="Continue" diff --git a/src/install-otp.sh b/src/install-otp.sh index b3e740d6..c96d8141 100755 --- a/src/install-otp.sh +++ b/src/install-otp.sh @@ -10,12 +10,9 @@ FILE_INPUT="${VSN}.tar.gz" FILE_OUTPUT=otp.tar.gz DIR_FOR_BIN=.setup-beam/otp -rm -f "${FILE_OUTPUT}" -rm -rf "${DIR_FOR_BIN}" wget -q -O "${FILE_OUTPUT}" "https://repo.hex.pm/builds/otp/${OS}/${FILE_INPUT}" mkdir -p "${DIR_FOR_BIN}" tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}" --strip-components=1 -rm -f "${FILE_OUTPUT}" "${DIR_FOR_BIN}/Install" -minimal "$(pwd)/${DIR_FOR_BIN}" echo "$(pwd)/${DIR_FOR_BIN}/bin" >> "$GITHUB_PATH" echo "Installed Erlang/OTP version follows" diff --git a/src/install-rebar3.ps1 b/src/install-rebar3.ps1 index a1ffef0a..093346dd 100644 --- a/src/install-rebar3.ps1 +++ b/src/install-rebar3.ps1 @@ -9,8 +9,6 @@ $FILE_OUTPUT="rebar3" $FILE_OUTPUT_PS1="rebar3.ps1" $DIR_FOR_BIN=".setup-beam/rebar3" -Remove-Item -Force "$FILE_OUTPUT" -ErrorAction SilentlyContinue -Remove-Item -Recurse -Force "$DIR_FOR_BIN" -ErrorAction SilentlyContinue $ProgressPreference="SilentlyContinue" Invoke-WebRequest "https://github.com/erlang/rebar3/releases/download/${VSN}/${FILE_INPUT}" -OutFile "$FILE_OUTPUT" $ProgressPreference="Continue" diff --git a/src/install-rebar3.sh b/src/install-rebar3.sh index 4e918833..f7fc7802 100755 --- a/src/install-rebar3.sh +++ b/src/install-rebar3.sh @@ -9,8 +9,6 @@ FILE_INPUT=rebar3 FILE_OUTPUT=rebar3 DIR_FOR_BIN=.setup-beam/rebar3 -rm -f "${FILE_OUTPUT}" -rm -rf "${DIR_FOR_BIN}" wget -q -O "${FILE_OUTPUT}" "https://github.com/erlang/rebar3/releases/download/${VSN}/${FILE_INPUT}" mkdir -p "${DIR_FOR_BIN}/bin" chmod +x "${FILE_OUTPUT}" From 1fe529e27ef5735dda9e33b23a7c200b1a7b1835 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Fri, 25 Jun 2021 00:30:44 +0100 Subject: [PATCH 04/16] Add Windows+Elixir --- .github/workflows/test.yml | 42 ++++++++++++++++++++++++++++++-------- dist/index.js | 10 ++++----- dist/install-elixir.ps1 | 18 ++++++++++++++-- dist/install-elixir.sh | 1 - dist/install-otp.ps1 | 3 +-- dist/install-otp.sh | 1 - dist/install-rebar3.ps1 | 4 +--- dist/install-rebar3.sh | 1 - src/install-elixir.ps1 | 18 ++++++++++++++-- src/install-elixir.sh | 1 - src/install-otp.ps1 | 3 +-- src/install-otp.sh | 1 - src/install-rebar3.ps1 | 4 +--- src/install-rebar3.sh | 1 - src/installer.js | 6 +++--- src/setup-beam.js | 4 ++-- 16 files changed, 79 insertions(+), 39 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bfeec066..fa5d3949 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,11 +42,10 @@ jobs: - run: npm test integration_test_ubuntu: - name: Integration tests (Ubuntu) - (on ${{matrix.combo.os}}, - Erlang/OTP ${{matrix.combo.otp-version}}, - Elixir ${{matrix.combo.elixir-version}}, - rebar3 ${{matrix.combo.rebar3-version}}) + name: Test ${{matrix.combo.os}}, + OTP ${{matrix.combo.otp-version}}, + Elixir ${{matrix.combo.elixir-version}}, + rebar3 ${{matrix.combo.rebar3-version}} runs-on: ${{matrix.combo.os}} strategy: fail-fast: false @@ -160,10 +159,10 @@ jobs: if: ${{matrix.combo.rebar3-version}} integration_test_windows: - name: Integration tests (Windows) - (on ${{matrix.combo.os}}, - Erlang/OTP ${{matrix.combo.otp-version}}, - rebar3 ${{matrix.combo.rebar3-version}}) + name: Test ${{matrix.combo.os}}, + OTP ${{matrix.combo.otp-version}}, + Elixir ${{matrix.combo.elixir-version}}, + rebar3 ${{matrix.combo.rebar3-version}} runs-on: ${{matrix.combo.os}} strategy: fail-fast: false @@ -193,6 +192,14 @@ jobs: - otp-version: '21.0' rebar3-version: '3.15' os: 'windows-2016' + - elixir-version: 'v1.10' + otp-version: '23' + rebar3-version: '3.14' + os: 'windows-latest' + - elixir-version: 'v1.11' + otp-version: '24' + rebar3-version: '3.15' + os: 'windows-latest' steps: - uses: actions/checkout@v2 - name: Use erlef/setup-beam @@ -200,12 +207,29 @@ jobs: uses: ./ with: otp-version: ${{matrix.combo.otp-version}} + elixir-version: ${{matrix.combo.elixir-version}} rebar3-version: ${{matrix.combo.rebar3-version}} - name: Erlang/OTP version (action) run: echo "Erlang/OTP ${{steps.setup-beam.outputs.otp-version}}" + - name: Elixir version (action) + run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}" + if: ${{matrix.combo.elixir-version}} - name: rebar3 version (action) run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}" + - name: mix version and help (CLI) + run: | + mix -v + mix help local.rebar + mix help local.hex + if: ${{matrix.combo.elixir-version}} + - name: Run Mix project tests + run: | + cd test-projects/mix + mix deps.get + mix test + if: ${{matrix.combo.elixir-version}} - name: Run rebar3 project tests run: | cd test-projects/rebar3 rebar3 ct + if: ${{matrix.combo.rebar3-version}} diff --git a/dist/index.js b/dist/index.js index 8c811dc3..1b823b13 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4599,7 +4599,7 @@ async function installOTP(osVersion, otpVersion) { await exec(__nccwpck_require__.ab + "install-otp.sh", [osVersion, otpVersion]) } else if (OS === 'win32') { const script = __nccwpck_require__.ab + "install-otp.ps1" - await exec(`powershell.exe ${script} -VSN:${otpVersion}`) + await exec(`pwsh.exe ${script} -VSN:${otpVersion}`) } } @@ -4614,7 +4614,7 @@ async function installElixir(elixirVersion) { await exec(__nccwpck_require__.ab + "install-elixir.sh", [elixirVersion]) } else if (OS === 'win32') { const script = __nccwpck_require__.ab + "install-elixir.ps1" - await exec(`powershell.exe ${script} ${elixirVersion}`) + await exec(`pwsh.exe ${script} -VSN:${elixirVersion}`) } } @@ -4629,7 +4629,7 @@ async function installRebar3(rebar3Version) { await exec(__nccwpck_require__.ab + "install-rebar3.sh", [rebar3Version]) } else if (OS === 'win32') { const script = __nccwpck_require__.ab + "install-rebar3.ps1" - await exec(`powershell.exe ${script} -VSN:${rebar3Version}`) + await exec(`pwsh.exe ${script} -VSN:${rebar3Version}`) } } @@ -4704,11 +4704,11 @@ async function installOTP(otpSpec, osVersion) { if (process.platform === 'linux') { core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/otp/bin`) } else if (process.platform === 'win32') { - const prePath = fs.readFileSync(`${process.env.RUNNER_TEMP}/pre_path.txt`, { + const otpPath = fs.readFileSync(`${process.env.RUNNER_TEMP}/otp_path.txt`, { encoding: 'utf8', flag: 'r', }) - core.addPath(prePath) + core.addPath(otpPath) } console.log('##[endgroup]') diff --git a/dist/install-elixir.ps1 b/dist/install-elixir.ps1 index 7674016f..f822de2c 100644 --- a/dist/install-elixir.ps1 +++ b/dist/install-elixir.ps1 @@ -1,5 +1,19 @@ -Write-Output "Installer for Elixir for Windows not available" +param([Parameter(Mandatory=$true)][string]$VSN) $ErrorActionPreference="Stop" -Exit 1 +Set-Location $Env:RUNNER_TEMP + +$FILE_INPUT="${VSN}.zip" +$FILE_OUTPUT="elixir.zip" +$DIR_FOR_BIN=".setup-beam/elixir" + +$ProgressPreference="SilentlyContinue" +Invoke-WebRequest "https://repo.hex.pm/builds/elixir/${FILE_INPUT}" -OutFile "$FILE_OUTPUT" +$ProgressPreference="Continue" +New-Item "$DIR_FOR_BIN" -ItemType Directory | Out-Null +$ProgressPreference="SilentlyContinue" +Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}" +$ProgressPreference="Continue" +Write-Output "Installed Erlang/OTP version follows" +& "$DIR_FOR_BIN/bin/iex" "-v" | Write-Output diff --git a/dist/install-elixir.sh b/dist/install-elixir.sh index 22259e0e..21f64a29 100755 --- a/dist/install-elixir.sh +++ b/dist/install-elixir.sh @@ -12,6 +12,5 @@ DIR_FOR_BIN=.setup-beam/elixir wget -q -O "${FILE_OUTPUT}" "https://repo.hex.pm/builds/elixir/${FILE_INPUT}" mkdir -p "${DIR_FOR_BIN}" unzip -q -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}" -echo "$(pwd)/${DIR_FOR_BIN}/bin" >> "$GITHUB_PATH" echo "Installed Elixir version follows" ${DIR_FOR_BIN}/bin/iex -v diff --git a/dist/install-otp.ps1 b/dist/install-otp.ps1 index dcd810c4..bfd0adac 100644 --- a/dist/install-otp.ps1 +++ b/dist/install-otp.ps1 @@ -15,7 +15,6 @@ Move-Item "$FILE_OUTPUT" "$DIR_FOR_BIN" Start-Process "./$DIR_FOR_BIN/$FILE_OUTPUT" /S -Wait $ErlExec = Get-ChildItem -Path "C:/Program Files/" -Recurse -Depth 2 -Filter 'erl.exe' -Name | ForEach-Object { Write-Output "C:/Program Files/$_" } $ErlPath = Split-Path -Path "$ErlExec" -Write-Output "$ErlPath" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append -Write-Output "$ErlPath" | Out-File -FilePath pre_path.txt -Encoding utf8 -NoNewline +Write-Output "$ErlPath" | Out-File -FilePath otp_path.txt -Encoding utf8 -NoNewline Write-Output "Installed Erlang/OTP version follows" & "$ErlPath/erl.exe" "+V" | Write-Output diff --git a/dist/install-otp.sh b/dist/install-otp.sh index c96d8141..5313e133 100755 --- a/dist/install-otp.sh +++ b/dist/install-otp.sh @@ -14,6 +14,5 @@ wget -q -O "${FILE_OUTPUT}" "https://repo.hex.pm/builds/otp/${OS}/${FILE_INPUT}" mkdir -p "${DIR_FOR_BIN}" tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}" --strip-components=1 "${DIR_FOR_BIN}/Install" -minimal "$(pwd)/${DIR_FOR_BIN}" -echo "$(pwd)/${DIR_FOR_BIN}/bin" >> "$GITHUB_PATH" echo "Installed Erlang/OTP version follows" ${DIR_FOR_BIN}/bin/erl -version diff --git a/dist/install-rebar3.ps1 b/dist/install-rebar3.ps1 index 093346dd..e1aa09f6 100644 --- a/dist/install-rebar3.ps1 +++ b/dist/install-rebar3.ps1 @@ -14,10 +14,8 @@ Invoke-WebRequest "https://github.com/erlang/rebar3/releases/download/${VSN}/${F $ProgressPreference="Continue" New-Item "$DIR_FOR_BIN/bin" -ItemType Directory | Out-Null Move-Item "$FILE_OUTPUT" "$DIR_FOR_BIN/bin" -$PrePath = Get-Content pre_path.txt -Write-Output "& ""$PrePath\escript.exe"" $PWD/$DIR_FOR_BIN/bin/$FILE_OUTPUT `$args" | Out-File -FilePath "$FILE_OUTPUT_PS1" -Encoding utf8 -Append +Write-Output "& escript.exe $PWD/$DIR_FOR_BIN/bin/$FILE_OUTPUT `$args" | Out-File -FilePath "$FILE_OUTPUT_PS1" -Encoding utf8 -Append type $FILE_OUTPUT_PS1 Move-Item "$FILE_OUTPUT_PS1" "$DIR_FOR_BIN/bin" -Write-Output "$PWD/$DIR_FOR_BIN/bin" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append Write-Output "Installed rebar3 version follows" & "$DIR_FOR_BIN/bin/rebar3" "version" | Write-Output diff --git a/dist/install-rebar3.sh b/dist/install-rebar3.sh index f7fc7802..2daf23a6 100755 --- a/dist/install-rebar3.sh +++ b/dist/install-rebar3.sh @@ -13,6 +13,5 @@ wget -q -O "${FILE_OUTPUT}" "https://github.com/erlang/rebar3/releases/download/ mkdir -p "${DIR_FOR_BIN}/bin" chmod +x "${FILE_OUTPUT}" mv "${FILE_OUTPUT}" "${DIR_FOR_BIN}/bin" -echo "$(pwd)/${DIR_FOR_BIN}/bin" >> "$GITHUB_PATH" echo "Installed rebar3 version follows" ${DIR_FOR_BIN}/bin/rebar3 version diff --git a/src/install-elixir.ps1 b/src/install-elixir.ps1 index 7674016f..f822de2c 100644 --- a/src/install-elixir.ps1 +++ b/src/install-elixir.ps1 @@ -1,5 +1,19 @@ -Write-Output "Installer for Elixir for Windows not available" +param([Parameter(Mandatory=$true)][string]$VSN) $ErrorActionPreference="Stop" -Exit 1 +Set-Location $Env:RUNNER_TEMP + +$FILE_INPUT="${VSN}.zip" +$FILE_OUTPUT="elixir.zip" +$DIR_FOR_BIN=".setup-beam/elixir" + +$ProgressPreference="SilentlyContinue" +Invoke-WebRequest "https://repo.hex.pm/builds/elixir/${FILE_INPUT}" -OutFile "$FILE_OUTPUT" +$ProgressPreference="Continue" +New-Item "$DIR_FOR_BIN" -ItemType Directory | Out-Null +$ProgressPreference="SilentlyContinue" +Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}" +$ProgressPreference="Continue" +Write-Output "Installed Erlang/OTP version follows" +& "$DIR_FOR_BIN/bin/iex" "-v" | Write-Output diff --git a/src/install-elixir.sh b/src/install-elixir.sh index 22259e0e..21f64a29 100755 --- a/src/install-elixir.sh +++ b/src/install-elixir.sh @@ -12,6 +12,5 @@ DIR_FOR_BIN=.setup-beam/elixir wget -q -O "${FILE_OUTPUT}" "https://repo.hex.pm/builds/elixir/${FILE_INPUT}" mkdir -p "${DIR_FOR_BIN}" unzip -q -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}" -echo "$(pwd)/${DIR_FOR_BIN}/bin" >> "$GITHUB_PATH" echo "Installed Elixir version follows" ${DIR_FOR_BIN}/bin/iex -v diff --git a/src/install-otp.ps1 b/src/install-otp.ps1 index dcd810c4..bfd0adac 100644 --- a/src/install-otp.ps1 +++ b/src/install-otp.ps1 @@ -15,7 +15,6 @@ Move-Item "$FILE_OUTPUT" "$DIR_FOR_BIN" Start-Process "./$DIR_FOR_BIN/$FILE_OUTPUT" /S -Wait $ErlExec = Get-ChildItem -Path "C:/Program Files/" -Recurse -Depth 2 -Filter 'erl.exe' -Name | ForEach-Object { Write-Output "C:/Program Files/$_" } $ErlPath = Split-Path -Path "$ErlExec" -Write-Output "$ErlPath" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append -Write-Output "$ErlPath" | Out-File -FilePath pre_path.txt -Encoding utf8 -NoNewline +Write-Output "$ErlPath" | Out-File -FilePath otp_path.txt -Encoding utf8 -NoNewline Write-Output "Installed Erlang/OTP version follows" & "$ErlPath/erl.exe" "+V" | Write-Output diff --git a/src/install-otp.sh b/src/install-otp.sh index c96d8141..5313e133 100755 --- a/src/install-otp.sh +++ b/src/install-otp.sh @@ -14,6 +14,5 @@ wget -q -O "${FILE_OUTPUT}" "https://repo.hex.pm/builds/otp/${OS}/${FILE_INPUT}" mkdir -p "${DIR_FOR_BIN}" tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}" --strip-components=1 "${DIR_FOR_BIN}/Install" -minimal "$(pwd)/${DIR_FOR_BIN}" -echo "$(pwd)/${DIR_FOR_BIN}/bin" >> "$GITHUB_PATH" echo "Installed Erlang/OTP version follows" ${DIR_FOR_BIN}/bin/erl -version diff --git a/src/install-rebar3.ps1 b/src/install-rebar3.ps1 index 093346dd..e1aa09f6 100644 --- a/src/install-rebar3.ps1 +++ b/src/install-rebar3.ps1 @@ -14,10 +14,8 @@ Invoke-WebRequest "https://github.com/erlang/rebar3/releases/download/${VSN}/${F $ProgressPreference="Continue" New-Item "$DIR_FOR_BIN/bin" -ItemType Directory | Out-Null Move-Item "$FILE_OUTPUT" "$DIR_FOR_BIN/bin" -$PrePath = Get-Content pre_path.txt -Write-Output "& ""$PrePath\escript.exe"" $PWD/$DIR_FOR_BIN/bin/$FILE_OUTPUT `$args" | Out-File -FilePath "$FILE_OUTPUT_PS1" -Encoding utf8 -Append +Write-Output "& escript.exe $PWD/$DIR_FOR_BIN/bin/$FILE_OUTPUT `$args" | Out-File -FilePath "$FILE_OUTPUT_PS1" -Encoding utf8 -Append type $FILE_OUTPUT_PS1 Move-Item "$FILE_OUTPUT_PS1" "$DIR_FOR_BIN/bin" -Write-Output "$PWD/$DIR_FOR_BIN/bin" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append Write-Output "Installed rebar3 version follows" & "$DIR_FOR_BIN/bin/rebar3" "version" | Write-Output diff --git a/src/install-rebar3.sh b/src/install-rebar3.sh index f7fc7802..2daf23a6 100755 --- a/src/install-rebar3.sh +++ b/src/install-rebar3.sh @@ -13,6 +13,5 @@ wget -q -O "${FILE_OUTPUT}" "https://github.com/erlang/rebar3/releases/download/ mkdir -p "${DIR_FOR_BIN}/bin" chmod +x "${FILE_OUTPUT}" mv "${FILE_OUTPUT}" "${DIR_FOR_BIN}/bin" -echo "$(pwd)/${DIR_FOR_BIN}/bin" >> "$GITHUB_PATH" echo "Installed rebar3 version follows" ${DIR_FOR_BIN}/bin/rebar3 version diff --git a/src/installer.js b/src/installer.js index 275252ff..48609299 100644 --- a/src/installer.js +++ b/src/installer.js @@ -13,7 +13,7 @@ async function installOTP(osVersion, otpVersion) { await exec(path.join(__dirname, 'install-otp.sh'), [osVersion, otpVersion]) } else if (OS === 'win32') { const script = path.join(__dirname, 'install-otp.ps1') - await exec(`powershell.exe ${script} -VSN:${otpVersion}`) + await exec(`pwsh.exe ${script} -VSN:${otpVersion}`) } } @@ -28,7 +28,7 @@ async function installElixir(elixirVersion) { await exec(path.join(__dirname, 'install-elixir.sh'), [elixirVersion]) } else if (OS === 'win32') { const script = path.join(__dirname, 'install-elixir.ps1') - await exec(`powershell.exe ${script} ${elixirVersion}`) + await exec(`pwsh.exe ${script} -VSN:${elixirVersion}`) } } @@ -43,7 +43,7 @@ async function installRebar3(rebar3Version) { await exec(path.join(__dirname, 'install-rebar3.sh'), [rebar3Version]) } else if (OS === 'win32') { const script = path.join(__dirname, 'install-rebar3.ps1') - await exec(`powershell.exe ${script} -VSN:${rebar3Version}`) + await exec(`pwsh.exe ${script} -VSN:${rebar3Version}`) } } diff --git a/src/setup-beam.js b/src/setup-beam.js index ea4e52e9..aac72329 100644 --- a/src/setup-beam.js +++ b/src/setup-beam.js @@ -48,11 +48,11 @@ async function installOTP(otpSpec, osVersion) { if (process.platform === 'linux') { core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/otp/bin`) } else if (process.platform === 'win32') { - const prePath = fs.readFileSync(`${process.env.RUNNER_TEMP}/pre_path.txt`, { + const otpPath = fs.readFileSync(`${process.env.RUNNER_TEMP}/otp_path.txt`, { encoding: 'utf8', flag: 'r', }) - core.addPath(prePath) + core.addPath(otpPath) } console.log('##[endgroup]') From 6a40566c9de0f8533e68d3ea736cd1be99116e91 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Fri, 25 Jun 2021 03:11:40 +0100 Subject: [PATCH 05/16] Hopefully improve error/warning messages --- dist/index.js | 20 +++++++------------- src/setup-beam.js | 20 +++++++------------- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/dist/index.js b/dist/index.js index 1b823b13..b57eb160 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4731,12 +4731,6 @@ async function maybeInstallElixir(elixirSpec, otpVersion, shouldMixHex) { return true } - if (shouldMixHex) { - console.log( - "hex will not be installed (overriding default) since Elixir wasn't either", - ) - } - return false } @@ -4771,7 +4765,7 @@ async function getOTPVersion(otpSpec0, osVersion) { let otpVersion if (otpSpec[1]) { throw new Error( - `Requested Erlang/OTP version (from spec ${otpSpec0}) ` + + `Requested Erlang/OTP version (${otpSpec0}) ` + "should not contain 'OTP-'", ) } @@ -4783,7 +4777,7 @@ async function getOTPVersion(otpSpec0, osVersion) { } if (otpVersion === null) { throw new Error( - `Requested Erlang/OTP version (from spec ${otpSpec0}) not found in build listing`, + `Requested Erlang/OTP version (${otpSpec0}) not found in version list`, ) } @@ -4798,7 +4792,7 @@ async function getElixirVersion(exSpec0, otpVersion) { let elixirVersion if (exSpec[2]) { throw new Error( - `Requested Elixir / Erlang/OTP version (from spec ${exSpec0} / ${otpVersion}) ` + + `Requested Elixir / Erlang/OTP version (${exSpec0} / ${otpVersion}) ` + "should not contain '-otp-...'", ) } @@ -4807,7 +4801,7 @@ async function getElixirVersion(exSpec0, otpVersion) { } if (!exSpec || elixirVersion === null) { throw new Error( - `Requested Elixir version (from spec ${exSpec0}) not found in build listing`, + `Requested Elixir version (${exSpec0}) not found in version list`, ) } const otpMatch = otpVersion.match(/^(?:OTP-)?([^.]+)/) @@ -4829,8 +4823,8 @@ async function getElixirVersion(exSpec0, otpVersion) { } } else { throw new Error( - `Requested Elixir / Erlang/OTP version (from spec ${exSpec0} / ${otpVersion}) not ` + - 'found in build listing', + `Requested Elixir / Erlang/OTP version (${exSpec0} / ${otpVersion}) not ` + + 'found in version list', ) } @@ -4842,7 +4836,7 @@ async function getRebar3Version(r3Spec) { const rebar3Version = getVersionFromSpec(r3Spec, rebar3Versions) if (rebar3Version === null) { throw new Error( - `Requested rebar3 version (from spec ${r3Spec}) not found in build listing`, + `Requested rebar3 version (${r3Spec}) not found in version list`, ) } diff --git a/src/setup-beam.js b/src/setup-beam.js index aac72329..04382518 100644 --- a/src/setup-beam.js +++ b/src/setup-beam.js @@ -75,12 +75,6 @@ async function maybeInstallElixir(elixirSpec, otpVersion, shouldMixHex) { return true } - if (shouldMixHex) { - console.log( - "hex will not be installed (overriding default) since Elixir wasn't either", - ) - } - return false } @@ -115,7 +109,7 @@ async function getOTPVersion(otpSpec0, osVersion) { let otpVersion if (otpSpec[1]) { throw new Error( - `Requested Erlang/OTP version (from spec ${otpSpec0}) ` + + `Requested Erlang/OTP version (${otpSpec0}) ` + "should not contain 'OTP-'", ) } @@ -127,7 +121,7 @@ async function getOTPVersion(otpSpec0, osVersion) { } if (otpVersion === null) { throw new Error( - `Requested Erlang/OTP version (from spec ${otpSpec0}) not found in build listing`, + `Requested Erlang/OTP version (${otpSpec0}) not found in version list`, ) } @@ -142,7 +136,7 @@ async function getElixirVersion(exSpec0, otpVersion) { let elixirVersion if (exSpec[2]) { throw new Error( - `Requested Elixir / Erlang/OTP version (from spec ${exSpec0} / ${otpVersion}) ` + + `Requested Elixir / Erlang/OTP version (${exSpec0} / ${otpVersion}) ` + "should not contain '-otp-...'", ) } @@ -151,7 +145,7 @@ async function getElixirVersion(exSpec0, otpVersion) { } if (!exSpec || elixirVersion === null) { throw new Error( - `Requested Elixir version (from spec ${exSpec0}) not found in build listing`, + `Requested Elixir version (${exSpec0}) not found in version list`, ) } const otpMatch = otpVersion.match(/^(?:OTP-)?([^.]+)/) @@ -173,8 +167,8 @@ async function getElixirVersion(exSpec0, otpVersion) { } } else { throw new Error( - `Requested Elixir / Erlang/OTP version (from spec ${exSpec0} / ${otpVersion}) not ` + - 'found in build listing', + `Requested Elixir / Erlang/OTP version (${exSpec0} / ${otpVersion}) not ` + + 'found in version list', ) } @@ -186,7 +180,7 @@ async function getRebar3Version(r3Spec) { const rebar3Version = getVersionFromSpec(r3Spec, rebar3Versions) if (rebar3Version === null) { throw new Error( - `Requested rebar3 version (from spec ${r3Spec}) not found in build listing`, + `Requested rebar3 version (${r3Spec}) not found in version list`, ) } From e49bdda75163688b925dd3f1eefe5f354a3e6021 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Fri, 25 Jun 2021 03:14:28 +0100 Subject: [PATCH 06/16] Revert previous wrong decision --- dist/index.js | 14 +++++--------- src/setup-beam.js | 14 +++++--------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/dist/index.js b/dist/index.js index b57eb160..91de387d 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4674,19 +4674,15 @@ async function main() { const otpVersion = await installOTP(otpSpec, osVersion) const elixirSpec = core.getInput('elixir-version', { required: false }) - const shouldMixHex = core.getInput('install-hex', { - required: false, - }) - const elixirInstalled = await maybeInstallElixir( - elixirSpec, - otpVersion, - shouldMixHex, - ) + const elixirInstalled = await maybeInstallElixir(elixirSpec, otpVersion) if (elixirInstalled === true) { const shouldMixRebar = core.getInput('install-rebar', { required: false, }) await mix(shouldMixRebar, 'rebar') + const shouldMixHex = core.getInput('install-hex', { + required: false, + }) await mix(shouldMixHex, 'hex') } @@ -4715,7 +4711,7 @@ async function installOTP(otpSpec, osVersion) { return otpVersion } -async function maybeInstallElixir(elixirSpec, otpVersion, shouldMixHex) { +async function maybeInstallElixir(elixirSpec, otpVersion) { if (elixirSpec) { const elixirVersion = await getElixirVersion(elixirSpec, otpVersion) console.log(`##[group]Installing Elixir ${elixirVersion}`) diff --git a/src/setup-beam.js b/src/setup-beam.js index 04382518..92deb8cb 100644 --- a/src/setup-beam.js +++ b/src/setup-beam.js @@ -18,19 +18,15 @@ async function main() { const otpVersion = await installOTP(otpSpec, osVersion) const elixirSpec = core.getInput('elixir-version', { required: false }) - const shouldMixHex = core.getInput('install-hex', { - required: false, - }) - const elixirInstalled = await maybeInstallElixir( - elixirSpec, - otpVersion, - shouldMixHex, - ) + const elixirInstalled = await maybeInstallElixir(elixirSpec, otpVersion) if (elixirInstalled === true) { const shouldMixRebar = core.getInput('install-rebar', { required: false, }) await mix(shouldMixRebar, 'rebar') + const shouldMixHex = core.getInput('install-hex', { + required: false, + }) await mix(shouldMixHex, 'hex') } @@ -59,7 +55,7 @@ async function installOTP(otpSpec, osVersion) { return otpVersion } -async function maybeInstallElixir(elixirSpec, otpVersion, shouldMixHex) { +async function maybeInstallElixir(elixirSpec, otpVersion) { if (elixirSpec) { const elixirVersion = await getElixirVersion(elixirSpec, otpVersion) console.log(`##[group]Installing Elixir ${elixirVersion}`) From 16c77e1b6234aa5f748ad9353b7204803483d87a Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Fri, 25 Jun 2021 03:21:31 +0100 Subject: [PATCH 07/16] Improve development experience --- .github/workflows/action.yml | 42 ++++++++ .github/workflows/{test.yml => ubuntu.yml} | 113 +-------------------- .github/workflows/windows.yml | 87 ++++++++++++++++ README.md | 12 ++- 4 files changed, 140 insertions(+), 114 deletions(-) create mode 100644 .github/workflows/action.yml rename .github/workflows/{test.yml => ubuntu.yml} (53%) create mode 100644 .github/workflows/windows.yml diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml new file mode 100644 index 00000000..b30a3048 --- /dev/null +++ b/.github/workflows/action.yml @@ -0,0 +1,42 @@ +--- +name: action + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + check_integrity: + name: Expected local npm actions + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: '12' + - run: npm install -g npm + - run: npm install + - run: npm run build + - run: npm run format + - run: npm install -g markdownlint-cli + - run: npm run markdownlint + - run: npm run shellcheck + - run: npm run yamllint + - run: npm run jslint + - run: npm run licenses + - name: Check if build left artifacts + run: git diff --exit-code + + unit_test: + name: Unit tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: {node-version: '12'} + - run: npm ci + - run: npm test diff --git a/.github/workflows/test.yml b/.github/workflows/ubuntu.yml similarity index 53% rename from .github/workflows/test.yml rename to .github/workflows/ubuntu.yml index fa5d3949..ef014d66 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/ubuntu.yml @@ -1,5 +1,5 @@ --- -name: test +name: ubuntu on: push: @@ -10,39 +10,8 @@ on: - main jobs: - check_integrity: - name: Expected local npm actions - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '12' - - run: npm install -g npm - - run: npm install - - run: npm run build - - run: npm run format - - run: npm install -g markdownlint-cli - - run: npm run markdownlint - - run: npm run shellcheck - - run: npm run yamllint - - run: npm run jslint - - run: npm run licenses - - name: Check if build left artifacts - run: git diff --exit-code - - unit_test: - name: Unit tests - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: {node-version: '12'} - - run: npm ci - - run: npm test - - integration_test_ubuntu: - name: Test ${{matrix.combo.os}}, + integration_test: + name: > OTP ${{matrix.combo.otp-version}}, Elixir ${{matrix.combo.elixir-version}}, rebar3 ${{matrix.combo.rebar3-version}} @@ -157,79 +126,3 @@ jobs: cd test-projects/rebar3 rebar3 ct if: ${{matrix.combo.rebar3-version}} - - integration_test_windows: - name: Test ${{matrix.combo.os}}, - OTP ${{matrix.combo.otp-version}}, - Elixir ${{matrix.combo.elixir-version}}, - rebar3 ${{matrix.combo.rebar3-version}} - runs-on: ${{matrix.combo.os}} - strategy: - fail-fast: false - matrix: - combo: - - otp-version: '24.0.2' - rebar3-version: '3.16' - os: 'windows-2019' - - otp-version: '23.0' - rebar3-version: '3.15' - os: 'windows-2019' - - otp-version: '24.0.2' - rebar3-version: '3.16' - os: 'windows-2016' - - otp-version: '23.0' - rebar3-version: '3.15' - os: 'windows-2016' - - otp-version: '22.3' - rebar3-version: '3.15' - os: 'windows-2016' - - otp-version: '22.0' - rebar3-version: '3.15' - os: 'windows-2016' - - otp-version: '21.3' - rebar3-version: '3.15' - os: 'windows-2016' - - otp-version: '21.0' - rebar3-version: '3.15' - os: 'windows-2016' - - elixir-version: 'v1.10' - otp-version: '23' - rebar3-version: '3.14' - os: 'windows-latest' - - elixir-version: 'v1.11' - otp-version: '24' - rebar3-version: '3.15' - os: 'windows-latest' - steps: - - uses: actions/checkout@v2 - - name: Use erlef/setup-beam - id: setup-beam - uses: ./ - with: - otp-version: ${{matrix.combo.otp-version}} - elixir-version: ${{matrix.combo.elixir-version}} - rebar3-version: ${{matrix.combo.rebar3-version}} - - name: Erlang/OTP version (action) - run: echo "Erlang/OTP ${{steps.setup-beam.outputs.otp-version}}" - - name: Elixir version (action) - run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}" - if: ${{matrix.combo.elixir-version}} - - name: rebar3 version (action) - run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}" - - name: mix version and help (CLI) - run: | - mix -v - mix help local.rebar - mix help local.hex - if: ${{matrix.combo.elixir-version}} - - name: Run Mix project tests - run: | - cd test-projects/mix - mix deps.get - mix test - if: ${{matrix.combo.elixir-version}} - - name: Run rebar3 project tests - run: | - cd test-projects/rebar3 - rebar3 ct - if: ${{matrix.combo.rebar3-version}} diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 00000000..6bb1b47b --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,87 @@ +--- +name: windows + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + integration_test: + name: > + OTP ${{matrix.combo.otp-version}}, + Elixir ${{matrix.combo.elixir-version}}, + rebar3 ${{matrix.combo.rebar3-version}} + runs-on: ${{matrix.combo.os}} + strategy: + fail-fast: false + matrix: + combo: + - otp-version: '24.0.2' + rebar3-version: '3.16' + os: 'windows-2019' + - otp-version: '23.0' + rebar3-version: '3.15' + os: 'windows-2019' + - otp-version: '24.0.2' + rebar3-version: '3.16' + os: 'windows-2016' + - otp-version: '23.0' + rebar3-version: '3.15' + os: 'windows-2016' + - otp-version: '22.3' + rebar3-version: '3.15' + os: 'windows-2016' + - otp-version: '22.0' + rebar3-version: '3.15' + os: 'windows-2016' + - otp-version: '21.3' + rebar3-version: '3.15' + os: 'windows-2016' + - otp-version: '21.0' + rebar3-version: '3.15' + os: 'windows-2016' + - elixir-version: 'v1.10' + otp-version: '23' + rebar3-version: '3.14' + os: 'windows-latest' + - elixir-version: 'v1.11' + otp-version: '24' + rebar3-version: '3.15' + os: 'windows-latest' + steps: + - uses: actions/checkout@v2 + - name: Use erlef/setup-beam + id: setup-beam + uses: ./ + with: + otp-version: ${{matrix.combo.otp-version}} + elixir-version: ${{matrix.combo.elixir-version}} + rebar3-version: ${{matrix.combo.rebar3-version}} + - name: Erlang/OTP version (action) + run: echo "Erlang/OTP ${{steps.setup-beam.outputs.otp-version}}" + - name: Elixir version (action) + run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}" + if: ${{matrix.combo.elixir-version}} + - name: rebar3 version (action) + run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}" + - name: mix version and help (CLI) + run: | + mix -v + mix help local.rebar + mix help local.hex + if: ${{matrix.combo.elixir-version}} + - name: Run Mix project tests + run: | + cd test-projects/mix + mix deps.get + mix test + if: ${{matrix.combo.elixir-version}} + - name: Run rebar3 project tests + run: | + cd test-projects/rebar3 + rebar3 ct + if: ${{matrix.combo.rebar3-version}} diff --git a/README.md b/README.md index 244954f8..6874c0ac 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ -# setup-beam [![GitHub Actions Test][test-img]][test] [![GitHub Actions CI] - -[test]: https://github.com/erlef/setup-beam -[test-img]: https://github.com/erlef/setup-beam/workflows/test/badge.svg +# setup-beam [![GitHub Actions][action-img]][action] [![GitHub Actions][ubuntu-img]][ubuntu] [![GitHub Actions][windows-img]][windows] + +[action]: https://github.com/erlef/setup-beam +[action-img]: https://github.com/erlef/setup-beam/workflows/action/badge.svg +[ubuntu]: https://github.com/erlef/setup-beam +[ubuntu-img]: https://github.com/erlef/setup-beam/workflows/ubuntu/badge.svg +[windows]: https://github.com/erlef/setup-beam +[windows-img]: https://github.com/erlef/setup-beam/workflows/windows/badge.svg This action sets up an Erlang/OTP environment for use in a GitHub Actions workflow by: From a1c24c92601f24fa5a60043ca35d7e63259cb2a6 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Fri, 25 Jun 2021 03:35:15 +0100 Subject: [PATCH 08/16] Adapt the doc.s to the current reality --- README.md | 30 +++++++++++++++--------------- action.yml | 6 +++--- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 6874c0ac..f5723a31 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ workflow by: - optionally, installing `rebar3` - optionally, installing `hex` -**Note** Currently, this action only supports Actions' `ubuntu-` runtimes. +**Note** Currently, this action only supports Actions' `ubuntu-` and `windows-` runtimes. ## Usage @@ -37,22 +37,22 @@ For pre-release Elixir versions, such as `1.11.0-rc.0`, use the full version specifier (`1.11.0-rc.0`). Pre-release versions are opt-in, so `1.11.x` will not match a pre-release. -### Compatibility between Ubuntu and Erlang/OTP +### Compatibility between Operating System and Erlang/OTP -This list presents the known working version combos between Ubuntu +This list presents the known working version combos between the target operating system and Erlang/OTP. -| Ubuntu | Erlang/OTP | Status -|- |- |- -| ubuntu-16.04 | 17 - 24 | ✅ -| ubuntu-18.04 | 17 - 24 | ✅ -| ubuntu-20.04 | 20 - 24 | ✅ -| windows-2016 | 21* - 24 | ✅ -| windows-2019 | 21* - 24 | ✅ +| Operating system | Erlang/OTP | Status +|- |- |- +| ubuntu-16.04 | 17 - 24 | ✅ +| ubuntu-18.04 | 17 - 24 | ✅ +| ubuntu-20.04 | 20 - 24 | ✅ +| windows-2016 | 21* - 24 | ✅ +| windows-2019 | 21* - 24 | ✅ **Note** *: prior to 23, Windows builds are only available for minor versions, e.g. 21.0, 21.3, 22.0, etc. -### Basic example (Elixir) +### Basic example (Erlang/OTP + Elixir, on Ubuntu) ```yaml # create this in .github/workflows/ci.yml @@ -71,7 +71,7 @@ jobs: - run: mix test ``` -### Basic example (`rebar3`) +### Basic example (Erlang/OTP + `rebar3`, on Ubuntu) ```yaml # create this in .github/workflows/ci.yml @@ -89,7 +89,7 @@ jobs: - run: rebar3 ct ``` -### Matrix example (Elixir) +### Matrix example (Erlang/OTP + Elixir, on Ubuntu) ```yaml # create this in .github/workflows/ci.yml @@ -113,7 +113,7 @@ jobs: - run: mix test ``` -### Matrix example (`rebar3`) +### Matrix example (Erlang/OTP + `rebar3`, on Ubuntu) ```yaml # create this in .github/workflows/ci.yml @@ -136,7 +136,7 @@ jobs: - run: rebar3 ct ``` -### Basic example (`rebar3` on Windows 2016) +### Basic example (Erlang/OTP + `rebar3`, on Windows) ```yaml # create this in .github/workflows/ci.yml diff --git a/action.yml b/action.yml index 12754821..92792708 100644 --- a/action.yml +++ b/action.yml @@ -1,5 +1,5 @@ --- -name: Setup Erlang/OTP with optional Elixir and/or rebar3 +name: Setup Erlang/OTP with optional Elixir (and mix) and/or rebar3 description: > Set up a specific version of Erlang/OTP, Elixir, and/or rebar3 and add the command-line tools to the PATH @@ -13,10 +13,10 @@ inputs: otp-version: description: Version range or exact version of Erlang/OTP to use install-hex: - description: Whether to install Hex + description: Whether to install Hex (with Mix) default: true install-rebar: - description: Whether to install Rebar + description: Whether to install Rebar (with Mix) default: true rebar3-version: description: Version range or exact version of rebar3 to use From 2631e3148c988970a479ece75a1f92b143d4ef38 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Fri, 25 Jun 2021 04:07:20 +0100 Subject: [PATCH 09/16] Fix bug --- __tests__/setup-beam.test.js | 2 +- dist/index.js | 13 ++----------- src/setup-beam.js | 13 ++----------- 3 files changed, 5 insertions(+), 23 deletions(-) diff --git a/__tests__/setup-beam.test.js b/__tests__/setup-beam.test.js index 58b99379..e4edeb57 100644 --- a/__tests__/setup-beam.test.js +++ b/__tests__/setup-beam.test.js @@ -114,7 +114,7 @@ async function testOTPVersions() { spec = '20.0' osVersion = 'ubuntu-20.04' - expected = 'OTP-20.0' + expected = 'OTP-20.0.5' got = await setupBeam.getOTPVersion(spec, osVersion) assert.deepStrictEqual(got, expected) diff --git a/dist/index.js b/dist/index.js index 91de387d..747426e4 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4862,7 +4862,7 @@ async function getOTPVersions(osVersion) { const otpMatch = line.match(/^(OTP-)?([^ ]+)/) let otpVersion = otpMatch[2] - if (semver.validRange(otpVersion) && hasPatch(otpVersion)) { + if (semver.validRange(otpVersion)) { otpVersion = semver.minVersion(otpVersion).version } otpVersions.set(otpVersion, otpMatch[0]) // we keep the original for later reference @@ -4876,7 +4876,7 @@ async function getOTPVersions(osVersion) { .forEach((x) => { const otpMatch = x.name.match(/^otp_win64_(.*).exe$/) let otpVersion = otpMatch[1] - if (semver.validRange(otpVersion) && hasPatch(otpVersion)) { + if (semver.validRange(otpVersion)) { otpVersion = semver.minVersion(otpVersion).version } otpVersions.set(otpVersion, otpVersion) @@ -4993,15 +4993,6 @@ async function get(url0, pageIdxs) { return ret } -function hasPatch(v) { - try { - semver.patch(v) - } catch { - return false - } - - return true -} module.exports = { getOTPVersion, getElixirVersion, diff --git a/src/setup-beam.js b/src/setup-beam.js index 92deb8cb..a5747891 100644 --- a/src/setup-beam.js +++ b/src/setup-beam.js @@ -206,7 +206,7 @@ async function getOTPVersions(osVersion) { const otpMatch = line.match(/^(OTP-)?([^ ]+)/) let otpVersion = otpMatch[2] - if (semver.validRange(otpVersion) && hasPatch(otpVersion)) { + if (semver.validRange(otpVersion)) { otpVersion = semver.minVersion(otpVersion).version } otpVersions.set(otpVersion, otpMatch[0]) // we keep the original for later reference @@ -220,7 +220,7 @@ async function getOTPVersions(osVersion) { .forEach((x) => { const otpMatch = x.name.match(/^otp_win64_(.*).exe$/) let otpVersion = otpMatch[1] - if (semver.validRange(otpVersion) && hasPatch(otpVersion)) { + if (semver.validRange(otpVersion)) { otpVersion = semver.minVersion(otpVersion).version } otpVersions.set(otpVersion, otpVersion) @@ -337,15 +337,6 @@ async function get(url0, pageIdxs) { return ret } -function hasPatch(v) { - try { - semver.patch(v) - } catch { - return false - } - - return true -} module.exports = { getOTPVersion, getElixirVersion, From c553c322f862c3dc3f738271704b29e9ecb1071e Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Fri, 25 Jun 2021 04:42:02 +0100 Subject: [PATCH 10/16] Tentatively add option strict-version (false by default, for compatibility) --- README.md | 7 ++++--- __tests__/setup-beam.test.js | 2 +- action.yml | 4 ++++ dist/index.js | 16 ++++++---------- src/setup-beam.js | 16 ++++++---------- 5 files changed, 21 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index f5723a31..ebe7e03d 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,10 @@ See [action.yml](action.yml) for the action's specification. **Note**: The Erlang/OTP release version specification is [relatively complex](http://erlang.org/doc/system_principles/versions.html#version-scheme). For best results, we recommend specifying exact Erlang/OTP, Elixir versions, and -`rebar3` versions. +`rebar3` versions, and setting option `strict-version` to `true`. However, values like `22.x`, or even `>22`, are also accepted, and we attempt to resolve them -according to semantic versioning rules. +according to semantic versioning rules. This implicitly means `strict-version` is `false`, +which is also the default value for this option. Additionally, it is recommended that one specifies Erlang/OTP, Elixir and `rebar3` versions using YAML strings, as these examples do, so that numbers like `23.0` don't @@ -149,7 +150,7 @@ jobs: - uses: actions/checkout@v2 - uses: erlef/setup-beam@v1 with: - otp-version: '24.0.2' + otp-version: '24' rebar3-version: '3.16.1' - run: rebar3 ct ``` diff --git a/__tests__/setup-beam.test.js b/__tests__/setup-beam.test.js index e4edeb57..58b99379 100644 --- a/__tests__/setup-beam.test.js +++ b/__tests__/setup-beam.test.js @@ -114,7 +114,7 @@ async function testOTPVersions() { spec = '20.0' osVersion = 'ubuntu-20.04' - expected = 'OTP-20.0.5' + expected = 'OTP-20.0' got = await setupBeam.getOTPVersion(spec, osVersion) assert.deepStrictEqual(got, expected) diff --git a/action.yml b/action.yml index 92792708..d1d8a060 100644 --- a/action.yml +++ b/action.yml @@ -20,6 +20,10 @@ inputs: default: true rebar3-version: description: Version range or exact version of rebar3 to use + strict-version: + description: true means input is unchanged; false means we try + to guess a version + default: false outputs: elixir-version: description: Exact version of Elixir that was installed diff --git a/dist/index.js b/dist/index.js index 747426e4..c4b2e9c2 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4860,11 +4860,7 @@ async function getOTPVersions(osVersion) { .split('\n') .forEach((line) => { const otpMatch = line.match(/^(OTP-)?([^ ]+)/) - - let otpVersion = otpMatch[2] - if (semver.validRange(otpVersion)) { - otpVersion = semver.minVersion(otpVersion).version - } + const otpVersion = otpMatch[2] otpVersions.set(otpVersion, otpMatch[0]) // we keep the original for later reference }) } else if (process.platform === 'win32') { @@ -4875,10 +4871,7 @@ async function getOTPVersions(osVersion) { .filter((x) => x.name.match(/^otp_win64_.*.exe$/)) .forEach((x) => { const otpMatch = x.name.match(/^otp_win64_(.*).exe$/) - let otpVersion = otpMatch[1] - if (semver.validRange(otpVersion)) { - otpVersion = semver.minVersion(otpVersion).version - } + const otpVersion = otpMatch[1] otpVersions.set(otpVersion, otpVersion) }) }) @@ -4929,7 +4922,10 @@ async function getRebar3Versions() { } function getVersionFromSpec(spec, versions) { - if (versions.includes(spec)) { + if ( + versions.includes(spec) || + core.getInput('version-type', { required: false }) === 'strict' + ) { return spec } diff --git a/src/setup-beam.js b/src/setup-beam.js index a5747891..dff13104 100644 --- a/src/setup-beam.js +++ b/src/setup-beam.js @@ -204,11 +204,7 @@ async function getOTPVersions(osVersion) { .split('\n') .forEach((line) => { const otpMatch = line.match(/^(OTP-)?([^ ]+)/) - - let otpVersion = otpMatch[2] - if (semver.validRange(otpVersion)) { - otpVersion = semver.minVersion(otpVersion).version - } + const otpVersion = otpMatch[2] otpVersions.set(otpVersion, otpMatch[0]) // we keep the original for later reference }) } else if (process.platform === 'win32') { @@ -219,10 +215,7 @@ async function getOTPVersions(osVersion) { .filter((x) => x.name.match(/^otp_win64_.*.exe$/)) .forEach((x) => { const otpMatch = x.name.match(/^otp_win64_(.*).exe$/) - let otpVersion = otpMatch[1] - if (semver.validRange(otpVersion)) { - otpVersion = semver.minVersion(otpVersion).version - } + const otpVersion = otpMatch[1] otpVersions.set(otpVersion, otpVersion) }) }) @@ -273,7 +266,10 @@ async function getRebar3Versions() { } function getVersionFromSpec(spec, versions) { - if (versions.includes(spec)) { + if ( + versions.includes(spec) || + core.getInput('version-type', { required: false }) === 'strict' + ) { return spec } From 41fe67e3e164803d0ffefa1e6d48924c8e69dcd2 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Wed, 7 Jul 2021 14:35:00 +0100 Subject: [PATCH 11/16] Fix the way we find versions for non-semver stuff --- __tests__/setup-beam.test.js | 105 +++++++++++++++++++++++++++++++++++ dist/index.js | 23 ++++++-- src/setup-beam.js | 23 ++++++-- 3 files changed, 139 insertions(+), 12 deletions(-) diff --git a/__tests__/setup-beam.test.js b/__tests__/setup-beam.test.js index 58b99379..1b963a38 100644 --- a/__tests__/setup-beam.test.js +++ b/__tests__/setup-beam.test.js @@ -16,6 +16,8 @@ async function all() { await testOTPVersions() await testElixirVersions() await testRebar3Versions() + + await testGetVersionFromSpec() } async function testFailInstallOTP() { @@ -192,6 +194,109 @@ async function testRebar3Versions() { assert.deepStrictEqual(got, expected) } +async function testGetVersionFromSpec() { + let got + let expected + let spec + const versions = [ + '3.2.3.5', + '1', + '2', + '3.2.3.4.1', + '1.0', + '2.0', + '1.0.0', + '3.2.3.4.2', + '1.1.0', + '3.4.5.4', + '3.4.5.3', + '3.4.5.4.1', + '24.0-rc3', + '24.0-rc2', + '24.0', + '23.3.4', + '23.3.3', + '22.3.4.12.1', + '22.3.4.10.1', + ] + + spec = '1' + expected = '1.1.0' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + spec = '1.0' + expected = '1.0.0' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + simulateInput('version-type', 'strict') + spec = '1' + expected = '1' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + simulateInput('version-type', 'loose') + + simulateInput('version-type', 'strict') + spec = '1.0' + expected = '1.0' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + simulateInput('version-type', 'loose') + + spec = '2' + expected = '2.0' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + spec = '3' + expected = '3.4.5.4.1' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + spec = '3.2' + expected = '3.2.3.5' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + spec = '>20' + expected = '24.0' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + spec = '24.0' + expected = '24.0' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + simulateInput('version-type', 'strict') + spec = '24.0-rc3' + expected = '24.0-rc3' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + simulateInput('version-type', 'loose') + + spec = '22.3' + expected = '22.3.4.12.1' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + spec = '23.3.3' + expected = '23.3.3' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + spec = '24' + expected = '24.0' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + spec = '23.3' + expected = '23.3.4' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) +} + function simulateInput(key, value) { process.env[`INPUT_${key.replace(/ /g, '_').toUpperCase()}`] = value } diff --git a/dist/index.js b/dist/index.js index c4b2e9c2..9ded0af3 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4922,14 +4922,24 @@ async function getRebar3Versions() { } function getVersionFromSpec(spec, versions) { - if ( - versions.includes(spec) || - core.getInput('version-type', { required: false }) === 'strict' - ) { - return spec + if (core.getInput('version-type', { required: false }) === 'strict') { + if (versions.includes(spec)) { + return spec + } + return null } - return semver.maxSatisfying(versions, semver.validRange(spec)) + // We keep a map of semver => actualver in order to use semver ranges to find appropriate versions + const versionsMap = versions.sort().reduce((acc, v) => { + if (!v.match('rc')) { + // Release candidates require strict + acc[semver.coerce(v).version] = v + } + return acc + }, {}) + return versionsMap[ + semver.maxSatisfying(Object.keys(versionsMap), semver.validRange(spec)) + ] } function getRunnerOSVersion() { @@ -4993,6 +5003,7 @@ module.exports = { getOTPVersion, getElixirVersion, getRebar3Version, + getVersionFromSpec, } diff --git a/src/setup-beam.js b/src/setup-beam.js index dff13104..149f05a0 100644 --- a/src/setup-beam.js +++ b/src/setup-beam.js @@ -266,14 +266,24 @@ async function getRebar3Versions() { } function getVersionFromSpec(spec, versions) { - if ( - versions.includes(spec) || - core.getInput('version-type', { required: false }) === 'strict' - ) { - return spec + if (core.getInput('version-type', { required: false }) === 'strict') { + if (versions.includes(spec)) { + return spec + } + return null } - return semver.maxSatisfying(versions, semver.validRange(spec)) + // We keep a map of semver => actualver in order to use semver ranges to find appropriate versions + const versionsMap = versions.sort().reduce((acc, v) => { + if (!v.match('rc')) { + // Release candidates require strict + acc[semver.coerce(v).version] = v + } + return acc + }, {}) + return versionsMap[ + semver.maxSatisfying(Object.keys(versionsMap), semver.validRange(spec)) + ] } function getRunnerOSVersion() { @@ -337,4 +347,5 @@ module.exports = { getOTPVersion, getElixirVersion, getRebar3Version, + getVersionFromSpec, } From b051f67b68c1cb7ff7b1b388102cf8069bd15b2c Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Wed, 7 Jul 2021 14:42:19 +0100 Subject: [PATCH 12/16] Tweak version-type option name for documentation purposes --- README.md | 4 ++-- action.yml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ebe7e03d..65b6ee88 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,9 @@ See [action.yml](action.yml) for the action's specification. **Note**: The Erlang/OTP release version specification is [relatively complex](http://erlang.org/doc/system_principles/versions.html#version-scheme). For best results, we recommend specifying exact Erlang/OTP, Elixir versions, and -`rebar3` versions, and setting option `strict-version` to `true`. +`rebar3` versions, and setting option `version-type` to `strict`. However, values like `22.x`, or even `>22`, are also accepted, and we attempt to resolve them -according to semantic versioning rules. This implicitly means `strict-version` is `false`, +according to semantic versioning rules. This implicitly means `version-type` is `loose`, which is also the default value for this option. Additionally, it is recommended that one specifies Erlang/OTP, Elixir and `rebar3` versions diff --git a/action.yml b/action.yml index d1d8a060..59063c7a 100644 --- a/action.yml +++ b/action.yml @@ -20,10 +20,10 @@ inputs: default: true rebar3-version: description: Version range or exact version of rebar3 to use - strict-version: - description: true means input is unchanged; false means we try - to guess a version - default: false + version-type: + description: strict means the versions are take as-are; loose means we try + to guess versions based on semver rules + default: loose outputs: elixir-version: description: Exact version of Elixir that was installed From 7ff5753d82261e7ac81a9864a7caefb73b1785a0 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Wed, 7 Jul 2021 15:00:42 +0100 Subject: [PATCH 13/16] Add more tests and fix as per CI results --- __tests__/setup-beam.test.js | 13 ++++++++++ dist/index.js | 49 ++++++++++++++++++++++++------------ src/setup-beam.js | 49 ++++++++++++++++++++++++------------ 3 files changed, 79 insertions(+), 32 deletions(-) diff --git a/__tests__/setup-beam.test.js b/__tests__/setup-beam.test.js index 1b963a38..5c4ff823 100644 --- a/__tests__/setup-beam.test.js +++ b/__tests__/setup-beam.test.js @@ -218,6 +218,7 @@ async function testGetVersionFromSpec() { '23.3.3', '22.3.4.12.1', '22.3.4.10.1', + 'master', ] spec = '1' @@ -295,6 +296,18 @@ async function testGetVersionFromSpec() { expected = '23.3.4' got = setupBeam.getVersionFromSpec(spec, versions) assert.deepStrictEqual(got, expected) + + simulateInput('version-type', 'strict') + spec = 'master' + expected = 'master' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + simulateInput('version-type', 'loose') + + spec = 'master' + expected = 'master' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) } function simulateInput(key, value) { diff --git a/dist/index.js b/dist/index.js index 9ded0af3..0c8a139e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4712,6 +4712,8 @@ async function installOTP(otpSpec, osVersion) { } async function maybeInstallElixir(elixirSpec, otpVersion) { + let installed = false + if (elixirSpec) { const elixirVersion = await getElixirVersion(elixirSpec, otpVersion) console.log(`##[group]Installing Elixir ${elixirVersion}`) @@ -4724,10 +4726,10 @@ async function maybeInstallElixir(elixirSpec, otpVersion) { core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/elixir/bin`) console.log('##[endgroup]') - return true + installed = true } - return false + return installed } async function mix(shouldMix, what) { @@ -4741,6 +4743,8 @@ async function mix(shouldMix, what) { } async function maybeInstallRebar3(rebar3Spec) { + let installed = false + if (rebar3Spec) { const rebar3Version = await getRebar3Version(rebar3Spec) console.log(`##[group]Installing rebar3 ${rebar3Version}`) @@ -4749,10 +4753,10 @@ async function maybeInstallRebar3(rebar3Spec) { core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/rebar3/bin`) console.log('##[endgroup]') - return true + installed = true } - return false + return installed } async function getOTPVersion(otpSpec0, osVersion) { @@ -4922,24 +4926,37 @@ async function getRebar3Versions() { } function getVersionFromSpec(spec, versions) { + let version = null + if (core.getInput('version-type', { required: false }) === 'strict') { if (versions.includes(spec)) { - return spec + version = spec } - return null } - // We keep a map of semver => actualver in order to use semver ranges to find appropriate versions - const versionsMap = versions.sort().reduce((acc, v) => { - if (!v.match('rc')) { - // Release candidates require strict - acc[semver.coerce(v).version] = v + if (version === null) { + // We keep a map of semver => "spec" in order to use semver ranges to find appropriate versions + const versionsMap = versions.sort().reduce((acc, v) => { + if (!v.match('rc')) { + // Release candidates require strict; some stuff can't be coerced, like master + try { + acc[semver.coerce(v).version] = v + } catch { + acc[v] = v + } + } + return acc + }, {}) + const rangeForMax = semver.validRange(spec) + if (rangeForMax) { + version = + versionsMap[semver.maxSatisfying(Object.keys(versionsMap), rangeForMax)] + } else { + version = versionsMap[spec] } - return acc - }, {}) - return versionsMap[ - semver.maxSatisfying(Object.keys(versionsMap), semver.validRange(spec)) - ] + } + + return version } function getRunnerOSVersion() { diff --git a/src/setup-beam.js b/src/setup-beam.js index 149f05a0..687cd34a 100644 --- a/src/setup-beam.js +++ b/src/setup-beam.js @@ -56,6 +56,8 @@ async function installOTP(otpSpec, osVersion) { } async function maybeInstallElixir(elixirSpec, otpVersion) { + let installed = false + if (elixirSpec) { const elixirVersion = await getElixirVersion(elixirSpec, otpVersion) console.log(`##[group]Installing Elixir ${elixirVersion}`) @@ -68,10 +70,10 @@ async function maybeInstallElixir(elixirSpec, otpVersion) { core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/elixir/bin`) console.log('##[endgroup]') - return true + installed = true } - return false + return installed } async function mix(shouldMix, what) { @@ -85,6 +87,8 @@ async function mix(shouldMix, what) { } async function maybeInstallRebar3(rebar3Spec) { + let installed = false + if (rebar3Spec) { const rebar3Version = await getRebar3Version(rebar3Spec) console.log(`##[group]Installing rebar3 ${rebar3Version}`) @@ -93,10 +97,10 @@ async function maybeInstallRebar3(rebar3Spec) { core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/rebar3/bin`) console.log('##[endgroup]') - return true + installed = true } - return false + return installed } async function getOTPVersion(otpSpec0, osVersion) { @@ -266,24 +270,37 @@ async function getRebar3Versions() { } function getVersionFromSpec(spec, versions) { + let version = null + if (core.getInput('version-type', { required: false }) === 'strict') { if (versions.includes(spec)) { - return spec + version = spec } - return null } - // We keep a map of semver => actualver in order to use semver ranges to find appropriate versions - const versionsMap = versions.sort().reduce((acc, v) => { - if (!v.match('rc')) { - // Release candidates require strict - acc[semver.coerce(v).version] = v + if (version === null) { + // We keep a map of semver => "spec" in order to use semver ranges to find appropriate versions + const versionsMap = versions.sort().reduce((acc, v) => { + if (!v.match('rc')) { + // Release candidates require strict; some stuff can't be coerced, like master + try { + acc[semver.coerce(v).version] = v + } catch { + acc[v] = v + } + } + return acc + }, {}) + const rangeForMax = semver.validRange(spec) + if (rangeForMax) { + version = + versionsMap[semver.maxSatisfying(Object.keys(versionsMap), rangeForMax)] + } else { + version = versionsMap[spec] } - return acc - }, {}) - return versionsMap[ - semver.maxSatisfying(Object.keys(versionsMap), semver.validRange(spec)) - ] + } + + return version } function getRunnerOSVersion() { From 29bf4291a48ecc380f160fd00b69530f235f23cf Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Wed, 7 Jul 2021 15:03:00 +0100 Subject: [PATCH 14/16] Fix as per test results (put in evidence that some stuff was wrong, in the past) --- __tests__/setup-beam.test.js | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/__tests__/setup-beam.test.js b/__tests__/setup-beam.test.js index 5c4ff823..fc6bca1d 100644 --- a/__tests__/setup-beam.test.js +++ b/__tests__/setup-beam.test.js @@ -86,37 +86,37 @@ async function testOTPVersions() { if (process.platform === 'linux') { spec = '19.3.x' osVersion = 'ubuntu-16.04' - expected = 'OTP-19.3.6' + expected = 'OTP-19.3.6.13' got = await setupBeam.getOTPVersion(spec, osVersion) assert.deepStrictEqual(got, expected) spec = '^19.3.6' osVersion = 'ubuntu-16.04' - expected = 'OTP-19.3.6' + expected = 'OTP-19.3.6.13' got = await setupBeam.getOTPVersion(spec, osVersion) assert.deepStrictEqual(got, expected) spec = '^19.3' osVersion = 'ubuntu-18.04' - expected = 'OTP-19.3.6' + expected = 'OTP-19.3.6.13' got = await setupBeam.getOTPVersion(spec, osVersion) assert.deepStrictEqual(got, expected) spec = '20' osVersion = 'ubuntu-20.04' - expected = 'OTP-20.3.8' + expected = 'OTP-20.3.8.26' got = await setupBeam.getOTPVersion(spec, osVersion) assert.deepStrictEqual(got, expected) spec = '20.x' osVersion = 'ubuntu-20.04' - expected = 'OTP-20.3.8' + expected = 'OTP-20.3.8.26' got = await setupBeam.getOTPVersion(spec, osVersion) assert.deepStrictEqual(got, expected) spec = '20.0' osVersion = 'ubuntu-20.04' - expected = 'OTP-20.0' + expected = 'OTP-20.0.5' got = await setupBeam.getOTPVersion(spec, osVersion) assert.deepStrictEqual(got, expected) @@ -136,13 +136,13 @@ async function testOTPVersions() { spec = '23.2.x' osVersion = 'windows-2016' - expected = '23.2.7' + expected = '23.2.7.4' got = await setupBeam.getOTPVersion(spec, osVersion) assert.deepStrictEqual(got, expected) spec = '23.0' osVersion = 'windows-2019' - expected = '23.0' + expected = '23.0.4' got = await setupBeam.getOTPVersion(spec, osVersion) assert.deepStrictEqual(got, expected) } @@ -183,8 +183,8 @@ async function testRebar3Versions() { got = await setupBeam.getRebar3Version(spec) assert.deepStrictEqual(got, expected) - spec = '3.10.0' - expected = '3.10.0' + spec = '3.11' + expected = '3.11.1' got = await setupBeam.getRebar3Version(spec) assert.deepStrictEqual(got, expected) @@ -199,13 +199,18 @@ async function testGetVersionFromSpec() { let expected let spec const versions = [ + '3.2.30.5', '3.2.3.5', '1', '2', '3.2.3.4.1', - '1.0', + '1.0.9', + '3.2.3.40.1', + '1.0.2', '2.0', - '1.0.0', + '2.10', + '2.9', + '1.0', '3.2.3.4.2', '1.1.0', '3.4.5.4', @@ -216,6 +221,7 @@ async function testGetVersionFromSpec() { '24.0', '23.3.4', '23.3.3', + '22.3.4.9.1', '22.3.4.12.1', '22.3.4.10.1', 'master', @@ -227,7 +233,7 @@ async function testGetVersionFromSpec() { assert.deepStrictEqual(got, expected) spec = '1.0' - expected = '1.0.0' + expected = '1.0.9' got = setupBeam.getVersionFromSpec(spec, versions) assert.deepStrictEqual(got, expected) @@ -246,7 +252,7 @@ async function testGetVersionFromSpec() { simulateInput('version-type', 'loose') spec = '2' - expected = '2.0' + expected = '2.10' got = setupBeam.getVersionFromSpec(spec, versions) assert.deepStrictEqual(got, expected) @@ -256,7 +262,7 @@ async function testGetVersionFromSpec() { assert.deepStrictEqual(got, expected) spec = '3.2' - expected = '3.2.3.5' + expected = '3.2.30.5' got = setupBeam.getVersionFromSpec(spec, versions) assert.deepStrictEqual(got, expected) From ca7e8a33060d79411c7b382f2fdc9ec74ae5a5f0 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Wed, 7 Jul 2021 16:39:06 +0100 Subject: [PATCH 15/16] Improve version string comparison --- dist/index.js | 23 ++++++++++++++++++++++- src/setup-beam.js | 23 ++++++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/dist/index.js b/dist/index.js index 0c8a139e..2a1cdc07 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4936,7 +4936,7 @@ function getVersionFromSpec(spec, versions) { if (version === null) { // We keep a map of semver => "spec" in order to use semver ranges to find appropriate versions - const versionsMap = versions.sort().reduce((acc, v) => { + const versionsMap = versions.sort(sortVersions).reduce((acc, v) => { if (!v.match('rc')) { // Release candidates require strict; some stuff can't be coerced, like master try { @@ -4959,6 +4959,27 @@ function getVersionFromSpec(spec, versions) { return version } +function sortVersions(left, right) { + let ret = 0 + const newL = verAsComparableStr(left) + const newR = verAsComparableStr(right) + + function verAsComparableStr(ver) { + const matchGroups = 5 + const verSpec = '([^.]+)?.?([^.]+)?.?([^.]+)?.?([^.]+)?.?([^.]+)?' + const matches = ver.match(verSpec).splice(1, matchGroups) + return matches.reduce((acc, v) => acc + (v || '0').padStart(3, '0'), '') + } + + if (newL < newR) { + ret = -1 + } else if (newL > newR) { + ret = 1 + } + + return ret +} + function getRunnerOSVersion() { const ImageOSToContainer = { ubuntu16: 'ubuntu-16.04', diff --git a/src/setup-beam.js b/src/setup-beam.js index 687cd34a..3c77f848 100644 --- a/src/setup-beam.js +++ b/src/setup-beam.js @@ -280,7 +280,7 @@ function getVersionFromSpec(spec, versions) { if (version === null) { // We keep a map of semver => "spec" in order to use semver ranges to find appropriate versions - const versionsMap = versions.sort().reduce((acc, v) => { + const versionsMap = versions.sort(sortVersions).reduce((acc, v) => { if (!v.match('rc')) { // Release candidates require strict; some stuff can't be coerced, like master try { @@ -303,6 +303,27 @@ function getVersionFromSpec(spec, versions) { return version } +function sortVersions(left, right) { + let ret = 0 + const newL = verAsComparableStr(left) + const newR = verAsComparableStr(right) + + function verAsComparableStr(ver) { + const matchGroups = 5 + const verSpec = '([^.]+)?.?([^.]+)?.?([^.]+)?.?([^.]+)?.?([^.]+)?' + const matches = ver.match(verSpec).splice(1, matchGroups) + return matches.reduce((acc, v) => acc + (v || '0').padStart(3, '0'), '') + } + + if (newL < newR) { + ret = -1 + } else if (newL > newR) { + ret = 1 + } + + return ret +} + function getRunnerOSVersion() { const ImageOSToContainer = { ubuntu16: 'ubuntu-16.04', From c708abcd4fb44ed5ac3d2d05669d5b2872371074 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Wed, 7 Jul 2021 16:47:06 +0100 Subject: [PATCH 16/16] Fix as per test results (almost there?) --- __tests__/setup-beam.test.js | 25 ++++++++++++++++++++++++- dist/index.js | 18 +++++++----------- src/setup-beam.js | 18 +++++++----------- 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/__tests__/setup-beam.test.js b/__tests__/setup-beam.test.js index fc6bca1d..1307d945 100644 --- a/__tests__/setup-beam.test.js +++ b/__tests__/setup-beam.test.js @@ -166,11 +166,13 @@ async function testElixirVersions() { got = await setupBeam.getElixirVersion(spec, otpVersion) assert.deepStrictEqual(got, expected) - spec = '1.11.0-rc.0' + simulateInput('version-type', 'strict') + spec = 'v1.11.0-rc.0' otpVersion = 'OTP-23' expected = 'v1.11.0-rc.0-otp-23' got = await setupBeam.getElixirVersion(spec, otpVersion) assert.deepStrictEqual(got, expected) + simulateInput('version-type', 'loose') } async function testRebar3Versions() { @@ -225,6 +227,7 @@ async function testGetVersionFromSpec() { '22.3.4.12.1', '22.3.4.10.1', 'master', + 'v11.11.0-rc.0-otp-23', ] spec = '1' @@ -314,6 +317,26 @@ async function testGetVersionFromSpec() { expected = 'master' got = setupBeam.getVersionFromSpec(spec, versions) assert.deepStrictEqual(got, expected) + + spec = '11.11' + expected = 'v11.11.0-rc.0-otp-23' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + spec = '11.11.0' + expected = 'v11.11.0-rc.0-otp-23' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + spec = 'v11.11' + expected = 'v11.11.0-rc.0-otp-23' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) + + spec = 'v11.11.0' + expected = 'v11.11.0-rc.0-otp-23' + got = setupBeam.getVersionFromSpec(spec, versions) + assert.deepStrictEqual(got, expected) } function simulateInput(key, value) { diff --git a/dist/index.js b/dist/index.js index 2a1cdc07..85c92e4a 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4929,21 +4929,17 @@ function getVersionFromSpec(spec, versions) { let version = null if (core.getInput('version-type', { required: false }) === 'strict') { - if (versions.includes(spec)) { - version = spec - } + version = spec } if (version === null) { // We keep a map of semver => "spec" in order to use semver ranges to find appropriate versions const versionsMap = versions.sort(sortVersions).reduce((acc, v) => { - if (!v.match('rc')) { - // Release candidates require strict; some stuff can't be coerced, like master - try { - acc[semver.coerce(v).version] = v - } catch { - acc[v] = v - } + try { + acc[semver.coerce(v).version] = v + } catch { + // some stuff can't be coerced, like 'master' + acc[v] = v } return acc }, {}) @@ -4966,7 +4962,7 @@ function sortVersions(left, right) { function verAsComparableStr(ver) { const matchGroups = 5 - const verSpec = '([^.]+)?.?([^.]+)?.?([^.]+)?.?([^.]+)?.?([^.]+)?' + const verSpec = /([^.]+)?\.?([^.]+)?\.?([^.]+)?\.?([^.]+)?\.?([^.]+)?/ const matches = ver.match(verSpec).splice(1, matchGroups) return matches.reduce((acc, v) => acc + (v || '0').padStart(3, '0'), '') } diff --git a/src/setup-beam.js b/src/setup-beam.js index 3c77f848..5210dab0 100644 --- a/src/setup-beam.js +++ b/src/setup-beam.js @@ -273,21 +273,17 @@ function getVersionFromSpec(spec, versions) { let version = null if (core.getInput('version-type', { required: false }) === 'strict') { - if (versions.includes(spec)) { - version = spec - } + version = spec } if (version === null) { // We keep a map of semver => "spec" in order to use semver ranges to find appropriate versions const versionsMap = versions.sort(sortVersions).reduce((acc, v) => { - if (!v.match('rc')) { - // Release candidates require strict; some stuff can't be coerced, like master - try { - acc[semver.coerce(v).version] = v - } catch { - acc[v] = v - } + try { + acc[semver.coerce(v).version] = v + } catch { + // some stuff can't be coerced, like 'master' + acc[v] = v } return acc }, {}) @@ -310,7 +306,7 @@ function sortVersions(left, right) { function verAsComparableStr(ver) { const matchGroups = 5 - const verSpec = '([^.]+)?.?([^.]+)?.?([^.]+)?.?([^.]+)?.?([^.]+)?' + const verSpec = /([^.]+)?\.?([^.]+)?\.?([^.]+)?\.?([^.]+)?\.?([^.]+)?/ const matches = ver.match(verSpec).splice(1, matchGroups) return matches.reduce((acc, v) => acc + (v || '0').padStart(3, '0'), '') }