Compare commits

...

45 Commits

Author SHA1 Message Date
GitHub Actions 2f0cc07b4b Automation: update setup-beam version output to c36fc0c 2024-03-03 23:50:12 +00:00
Paulo F. Oliveira c36fc0ca1b Hack around rebar3 compiling your project to output its version (#256) 2024-03-03 17:49:50 -06:00
GitHub Actions 7c4882bbdd Automation: update setup-beam version output to cdb7a12 2024-03-03 23:49:23 +00:00
Paulo F. Oliveira cdb7a12eb6 Test on OTP-27.0-rc1 + a few minor README tweaks (#255) 2024-03-03 17:48:54 -06:00
GitHub Actions 904c511e63 Automation: update setup-beam version output to 4f55815 2024-02-29 22:37:38 +00:00
Jonatan Männchen 4f558159e6 Allow absolute version file paths (#258) 2024-02-29 22:37:17 +00:00
Paulo F. Oliveira 0430fb6cc6 Fix CI for pull requests (#259) 2024-02-29 22:03:16 +00:00
GitHub Actions 48f1d0ccc2 Automation: update setup-beam version output to 4ec4e80 2024-02-29 21:37:15 +00:00
github-actions[bot] 4ec4e80c33 Update 3rd party licenses (automation) (#257)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2024-02-29 21:36:50 +00:00
GitHub Actions a23b1fc445 Automation: update setup-beam version output to eb31c4c 2024-02-16 22:30:46 +00:00
github-actions[bot] eb31c4c998 Update 3rd party licenses (automation) (#254)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2024-02-16 22:30:20 +00:00
GitHub Actions 726c8cb9ac Automation: update setup-beam version output to 951dd85 2024-02-13 04:03:52 +00:00
Paulo F. Oliveira 951dd857ae Move bin path, in Windows, from D: to C: (#251) 2024-02-12 22:03:29 -06:00
GitHub Actions f2c1b65313 Automation: update setup-beam version output to 0352ab2 2024-02-04 21:22:13 +00:00
github-actions[bot] 0352ab2e65 Update 3rd party licenses (automation) (#253)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2024-02-04 21:21:48 +00:00
GitHub Actions 8b9cac4c04 Automation: update setup-beam version output to 6c8deb6 2024-01-31 08:24:47 +00:00
Andrew Shu 6c8deb6007 Update action.yml to use node20 (was node16) (#249) 2024-01-31 08:24:20 +00:00
Paulo F. Oliveira 98ca4dce66 Have npm run build-dist _always_ recreate dist (#247) 2024-01-28 16:45:05 -06:00
GitHub Actions b8913643d6 Automation: update setup-beam version output to cf854bf 2024-01-28 18:53:13 +00:00
Paulo F. Oliveira cf854bf149 Fix "Windows workflow broken since recent commit" (#246) 2024-01-28 12:52:46 -06:00
GitHub Actions 4a641b1000 Automation: update setup-beam version output to 07193a0 2024-01-28 18:52:29 +00:00
Paulo F. Oliveira 07193a0ba2 Update outdated/deprecated actions (#244) 2024-01-28 12:52:05 -06:00
GitHub Actions 4c35984bbc Automation: update setup-beam version output to b60baf4 2024-01-25 22:07:33 +00:00
Paulo F. Oliveira b60baf4753 Add known branch exceptions to version matching (#242) 2024-01-17 23:37:13 +00:00
GitHub Actions 213ca2eceb Automation: update setup-beam version output to bc84950 2024-01-17 23:33:13 +00:00
Paulo F. Oliveira bc84950393 Bump semver to 7.5.4 (#240) 2024-01-17 23:32:48 +00:00
GitHub Actions 980f47ea52 Update setup-beam version output to 4678b57 2024-01-12 19:46:30 +00:00
Paulo F. Oliveira 4678b57fab Have the action output a versioning element so it could be used as part of the cache restore key (#239)
* Do a bit of YAMLlint'ing

* Ease consumer cache invalidation

By providing an output with the action version we ease
cache invalidation on consumer, due to the fact we can
now stop worrying about changes to the action's cache itself

Might also be interesting for self-hosted runners...

* Remove duplicates

* Do further validations for robustness
2024-01-12 13:46:16 -06:00
Paulo F. Oliveira a34c98fd51 Fix typos in security policy (#237) 2024-01-06 14:37:38 -06:00
github-actions[bot] a1c4bb2505 Update 3rd party licenses (#235)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2023-10-21 11:19:51 -05:00
github-actions[bot] 508b7402b1 Update 3rd party licenses (#234)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2023-10-13 21:09:00 +01:00
github-actions[bot] 4f96fbfbc0 Update 3rd party licenses (#233)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2023-10-08 20:28:27 +01:00
github-actions[bot] 5462be1110 Update 3rd party licenses (#232)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2023-09-14 21:29:33 +01:00
github-actions[bot] 673a8fbd6e Update 3rd party licenses (#230)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2023-08-26 13:17:31 +01:00
Paulo F. Oliveira 2a21db5504 Ease pre-pull request fork CI as well as github-actions based dispatch (#229) 2023-08-25 17:04:51 +01:00
Damir Vandic f35f714d23 Add ref: (version) support to .tool-versions parsing (#228)
* Add support elixir ref in .tool-versions

* Make the v in ref:v optional

* Revert and refactor test changes

* Run build-dist
2023-08-15 14:05:23 +01:00
Paulo F. Oliveira afb8586fc4 Feature tool-cache for Gleam and rebar3 (#223)
* Make iterating over mirrors more flexible (and reusable)

At the same time we fix an error, where we aren't using the
mirrors for the OTP build :)

* Make installation of cache-based tool callback -based

This hopefully eases introduction of new languages at the cost
of a bit of abstraction (there's an extensive comment on how to
fill in the install options' object)

We'll soon test this abstraction by making Gleam and rebar3
cached too

* Increase our visibility when debugging

* Improve on lessons learned to ease incorporation of further caches

(starting with Gleam on Linux)

* Cache Gleam on Windows

* Cache Rebar3 on Linux

Also, gets rid of all .sh

* Cache Rebar3 on Windows

Also, gets rid of all .ps1

* Act on CI results

And also be consistent when it comes to using
fs....Sync vs fs.promise....

* Move tests to a single file

* Move main executable to a single file

* Decrease number of changes to ease review

* Expose function required for tests

* Don't async/await when not required

* Resolve post- merge-conflict resolution issues
2023-08-07 10:32:15 +01:00
github-actions[bot] 3ba5b86a2a Update 3rd party licenses (#226)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2023-07-22 18:53:26 +01:00
Paulo F. Oliveira f6a73a7bf1 Rework our version matching algorithm (#217)
* Update some dependencies' versions (also, get rid of husky)

* Introduce branch dependency execution

We want the most important things to fail first and prevent the
other ones from executing

e.g. if your dist/ is not updated, there's no point seeing the tests fail

* Rid ourselves of bloat

* Introduce expectations for upcoming version

* Tweak whitespace

* Tweak our calls to getVersionFromSpec (increase code consistency)

* Remove non-used variable

* Start coercing on input, stop sorting/maybe prepending 'v' on input

We'll deal with all this in a centralized place to make
it easier to reason on the code

* Revamp our getVersionFromSpec

1. stop accepting maybePrependWithV0, since this is only used in specialized
   cases
2. sort versions internally (don't expect it to come sorted)
3. compare rc/strict and .includes in a single go (don't separate these)
4. don't expect already coerced version arrays, coerce them when required
   (the maybeCoerced version had changed already, which means we're smarter
   at putting stuff inside the version array)
5. raise an exception if a semver-invalid version is not flagged as strict

* Reduce our expectations, but still be appropriate to our mission

* Update our tests for our new expectations (start the TDD bit)

* Execute npm run build-dist and keep results

* Increase inter-job dependency

* Don't expect markdownlint to be installed remotely

* Revert "Increase inter-job dependency"

This reverts commit 500b0fe7e9eec1c4f258b4d16b40719ee1d0a1ad.

* Revert "Introduce branch dependency execution"

This reverts commit fbe1317a800d7722f4e8b668c073218263d0ab17.

* Have all the CI workflows run under the same conditions

* Fix as per CI results

* Re-establish the possibility to match versions like 22.3.4.2.1.0

We cheat on the semver matching:
1. we keep an ordered list of versions that respect e.g. 22.3.4
2. if we match 22.3.4 when fetching a version, we get the last value
   from the list of versions that respect it, e.g. 22.3.4.2.1.0
   (since this is ordered, it should work as previously expected)

This increases code complexity for getVersionFromSpec,
but hopefully not by much...

We also remove throw-based test cases (non-versions will fail later,
with null), and add some tests to prove our need code.

* Trim out linting practices

But still keep them useful
2023-07-21 20:56:02 +01:00
dependabot[bot] efc884ac2f Bump word-wrap from 1.2.3 to 1.2.4 (#225)
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-20 00:11:25 +01:00
github-actions[bot] e3b13dc873 Update 3rd party licenses (#224)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2023-07-13 09:35:33 -05:00
Paulo F. Oliveira fa5c1c2428 Improve our community standards (#218)
* Add a bug report template

* Add a feature request template

* Add a pull request template

* Add a security policy

* Lint newer files
2023-07-01 11:26:50 -05:00
github-actions[bot] 7960f20020 Update 3rd party licenses (#221)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2023-06-28 13:10:29 +01:00
dependabot[bot] 3401fe12ae Bump semver from 7.3.8 to 7.5.2 (#219)
* Bump semver from 7.3.8 to 7.5.2

Bumps [semver](https://github.com/npm/node-semver) from 7.3.8 to 7.5.2.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.3.8...v7.5.2)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update as per `npm run build-dist`

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Paulo F. Oliveira <paulo.ferraz.oliveira@gmail.com>
2023-06-24 22:20:40 +01:00
Paulo F. Oliveira 145c80cf85 Test Erlang/OTP 26 + Elixir 1.14 on top Windows (#191)
* Add more stuff to test on

* Tweak our debugging (more verbose when the runner is in debug mode)

* Hopefully make it easier to debug

* Have the distribution work :-)

* Adapt to a better reality
2023-06-24 11:27:31 -05:00
31 changed files with 6036 additions and 8225 deletions
+6 -8
View File
@@ -1,20 +1,18 @@
--- ---
env: env:
node: true node: true
es2021: true es2022: true
extends: extends:
- airbnb - eslint:recommended
parserOptions: parserOptions:
ecmaVersion: 12 ecmaVersion: 2022
rules: rules:
indent: ["warn", 2] indent: [warn, 2, {SwitchCase: 1}]
max-len: ["warn", 100] max-len: [warn, 100]
no-undef: "error"
no-unused-vars: ["error", {"varsIgnorePattern": "^_"}]
no-use-before-define: 0 no-use-before-define: 0
operator-linebreak: 0 operator-linebreak: 0
require-jsdoc: 0
semi: 0 semi: 0
implicit-arrow-linebreak: 0
settings: settings:
react: react:
+35
View File
@@ -0,0 +1,35 @@
---
name: Bug report
about: Report a bug to improve this project
title: ''
labels: 'bug'
assignees: ''
---
#### The bug
A clear and concise description of what the bug is.
#### Software versions
A list of software versions where the bug is apparent, as detailed as possible:
* `setup-beam`: ...
* other (where applicable): ...
#### How to replicate
An ordered list of steps to replicate the bug:
1. run `...`
2. search for `...` in the error output
3. look at file `...`
#### Expected behaviour
What's expected to happen when you follow the steps listed above.
#### Additional context
Any other context about the bug.
+26
View File
@@ -0,0 +1,26 @@
---
name: Feature request
about: Request a feature for this project
title: ''
labels: 'feature'
assignees: ''
---
#### Is your feature request related to a problem?
A clear and concise description of what the problem is, e.g. "I'm always frustrated
when ..."
#### Describe the feature you'd like
A clear and concise description of what you want to happen after the new feature
is implemented.
#### Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
#### Additional context
Any other context about the feature request.
+8
View File
@@ -0,0 +1,8 @@
# Description
A brief description of your changes.
Closes #&lt;issue&gt;.
- [ ] I have performed a self-review of my changes
- [ ] I have read and understood the [contributing guidelines](/erlef/setup-beam/blob/main/CONTRIBUTING.md)
+35 -19
View File
@@ -6,29 +6,45 @@ on:
branches: branches:
- main - main
pull_request: pull_request:
types: [opened, synchronize] branches:
- "*"
workflow_dispatch: {}
env: env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
jobs: jobs:
version:
name: Version with commit unique id
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Version it!
run: |
# We expect a string such as const setupBeamVersion = 'undefined' in the code
SHA=$(git rev-parse --short HEAD)
sed -i'.bak' \
-e "s/const setupBeamVersion = '.*'/const setupBeamVersion = '${SHA}'/g" \
src/setup-beam.js
npm run build-dist
git config user.name "GitHub Actions"
git config user.email "actions@user.noreply.github.com"
git add src/setup-beam.js
git add dist/index.js
git commit -m "Automation: update setup-beam version output to ${SHA}"
git push origin main
check_integrity: check_integrity:
name: Expected local npm actions name: Expected local npm actions
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.ref != 'refs/heads/main'
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: actions/setup-node@v3 - uses: actions/setup-node@v4
with: with:
node-version: '14' node-version: '20'
- run: npm install -g npm - run: npm run build-dist
- 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
- name: Check if build left artifacts - name: Check if build left artifacts
run: git diff --exit-code --ignore-space-at-eol run: git diff --exit-code --ignore-space-at-eol
@@ -36,10 +52,10 @@ jobs:
name: Unit tests (Ubuntu) name: Unit tests (Ubuntu)
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: actions/setup-node@v3 - uses: actions/setup-node@v4
with: with:
node-version: '14' node-version: '20'
- run: npm ci - run: npm ci
- run: npm test - run: npm test
- name: .tool-versions test - name: .tool-versions test
@@ -53,9 +69,9 @@ jobs:
name: Unit tests (Windows) name: Unit tests (Windows)
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: actions/setup-node@v3 - uses: actions/setup-node@v4
with: with:
node-version: '14' node-version: '20'
- run: npm install --production - run: npm install --production
- run: npm test - run: npm test
+3 -2
View File
@@ -7,7 +7,8 @@ on:
- main - main
pull_request: pull_request:
branches: branches:
- main - "*"
workflow_dispatch: {}
jobs: jobs:
test-failing-first-mirror: test-failing-first-mirror:
@@ -22,7 +23,7 @@ jobs:
install-rebar: [true, false] install-rebar: [true, false]
install-hex: [true, false] install-hex: [true, false]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Use erlef/setup-beam - name: Use erlef/setup-beam
id: setup-beam id: setup-beam
uses: ./ uses: ./
+27 -32
View File
@@ -6,7 +6,9 @@ on:
branches: branches:
- main - main
pull_request: pull_request:
types: [opened, synchronize] branches:
- "*"
workflow_dispatch: {}
jobs: jobs:
integration_test: integration_test:
@@ -20,8 +22,18 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
combo: combo:
- otp-version: 'OTP-27.0-rc1'
os: 'ubuntu-latest'
- otp-version: '26.0'
elixir-version: 'v1.14-otp-25'
os: 'ubuntu-latest'
version-type: 'strict'
- otp-version: '26.0'
elixir-version: '1.14.5'
os: 'ubuntu-latest'
version-type: 'strict'
- otp-version: '25.2' - otp-version: '25.2'
elixir-version: '1.14.3' elixir-version: '1.14.2'
os: 'ubuntu-latest' os: 'ubuntu-latest'
- otp-version: '25.2' - otp-version: '25.2'
elixir-version: '1.14.3' elixir-version: '1.14.3'
@@ -63,14 +75,6 @@ jobs:
otp-version: '21' otp-version: '21'
rebar3-version: '3.12' rebar3-version: '3.12'
os: 'ubuntu-20.04' os: 'ubuntu-20.04'
- elixir-version: 'v1.6'
otp-version: '21'
rebar3-version: '3.12'
os: 'ubuntu-20.04'
- elixir-version: 'v1.7'
otp-version: '22'
rebar3-version: '3.13'
os: 'ubuntu-20.04'
- elixir-version: 'v1.7' - elixir-version: 'v1.7'
otp-version: '22' otp-version: '22'
rebar3-version: '3.13' rebar3-version: '3.13'
@@ -83,18 +87,10 @@ jobs:
otp-version: '25.0.2' otp-version: '25.0.2'
rebar3-version: '3.19' rebar3-version: '3.19'
os: 'ubuntu-20.04' os: 'ubuntu-20.04'
- elixir-version: 'v1.10'
otp-version: '23'
rebar3-version: '3.14'
os: 'ubuntu-20.04'
- elixir-version: 'v1.12' - elixir-version: 'v1.12'
otp-version: '24' otp-version: '24'
rebar3-version: '3.15' rebar3-version: '3.15'
os: 'ubuntu-20.04' os: 'ubuntu-20.04'
- elixir-version: 'v1.13.4'
otp-version: '25.0.2'
rebar3-version: '3.19'
os: 'ubuntu-20.04'
- elixir-version: 'v1.11.0' - elixir-version: 'v1.11.0'
otp-version: '22.3.4.2' otp-version: '22.3.4.2'
os: 'ubuntu-20.04' os: 'ubuntu-20.04'
@@ -103,15 +99,13 @@ jobs:
otp-version: '22.3.4.1' otp-version: '22.3.4.1'
os: 'ubuntu-20.04' os: 'ubuntu-20.04'
version-type: 'strict' version-type: 'strict'
- elixir-version: '1.10.3' - elixir-version: 'main'
otp-version: '22.3.4.1'
os: 'ubuntu-20.04'
- elixir-version: 'master'
otp-version: '23.1' otp-version: '23.1'
os: 'ubuntu-20.04' os: 'ubuntu-20.04'
version-type: 'strict'
- elixir-version: 'main' - elixir-version: 'main'
otp-version: '25' otp-version: '25'
os: 'ubuntu-20.04' os: 'ubuntu-20.04'
version-type: 'strict' version-type: 'strict'
- gleam-version: '0.23' - gleam-version: '0.23'
otp-version: '24' otp-version: '24'
@@ -125,7 +119,7 @@ jobs:
otp-version: false otp-version: false
os: 'ubuntu-latest' os: 'ubuntu-latest'
disable_problem_matchers: true disable_problem_matchers: true
- gleam-version: '0.22.0' # Version with Gleam's old archive naming convention - gleam-version: '0.22.0' # Version with Gleam's old archive naming convention
otp-version: '24' otp-version: '24'
os: 'ubuntu-latest' os: 'ubuntu-latest'
disable_problem_matchers: true disable_problem_matchers: true
@@ -135,7 +129,7 @@ jobs:
escript_script: 'protoc-gen-elixir --version' escript_script: 'protoc-gen-elixir --version'
os: 'ubuntu-latest' os: 'ubuntu-latest'
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Use erlef/setup-beam - name: Use erlef/setup-beam
id: setup-beam id: setup-beam
uses: ./ uses: ./
@@ -189,6 +183,7 @@ jobs:
mix escript.install --force ${{matrix.combo.escript_packages}} mix escript.install --force ${{matrix.combo.escript_packages}}
${{matrix.combo.escript_script}} ${{matrix.combo.escript_script}}
if: ${{matrix.combo.escript_packages && matrix.combo.escript_script}} if: ${{matrix.combo.escript_packages && matrix.combo.escript_script}}
environment_variables: environment_variables:
name: Environment variables name: Environment variables
runs-on: ${{matrix.combo.os}} runs-on: ${{matrix.combo.os}}
@@ -202,7 +197,7 @@ jobs:
rebar3-version: 'nightly' rebar3-version: 'nightly'
os: 'ubuntu-latest' os: 'ubuntu-latest'
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Use erlef/setup-beam - name: Use erlef/setup-beam
id: setup-beam id: setup-beam
uses: ./ uses: ./
@@ -212,9 +207,9 @@ jobs:
gleam-version: ${{matrix.combo.gleam-version}} gleam-version: ${{matrix.combo.gleam-version}}
rebar3-version: ${{matrix.combo.rebar3-version}} rebar3-version: ${{matrix.combo.rebar3-version}}
- run: env - run: env
- name: List environment variables - name: Check environment variables
run: | run: |
[ -n "${INSTALL_DIR_FOR_ELIXIR}" ] && echo "${INSTALL_DIR_FOR_ELIXIR}" ${INSTALL_DIR_FOR_ELIXIR}/bin/elixir -v
[ -n "${INSTALL_DIR_FOR_GLEAM}" ] && echo "${INSTALL_DIR_FOR_GLEAM}" ${INSTALL_DIR_FOR_GLEAM}/bin/gleam --version
[ -n "${INSTALL_DIR_FOR_OTP}" ] && echo "${INSTALL_DIR_FOR_OTP}" ${INSTALL_DIR_FOR_OTP}/bin/erl -version
[ -n "${INSTALL_DIR_FOR_REBAR3}" ] && echo "${INSTALL_DIR_FOR_REBAR3}" ${INSTALL_DIR_FOR_REBAR3}/bin/rebar3 version
@@ -11,10 +11,7 @@ jobs:
name: Update 3rd party licenses name: Update 3rd party licenses
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: actions/setup-node@v3
with:
node-version: '14'
- run: - run:
./.github/workflows/update_3rd_party_licenses.sh ./.github/workflows/update_3rd_party_licenses.sh
env: env:
+27 -9
View File
@@ -6,7 +6,9 @@ on:
branches: branches:
- main - main
pull_request: pull_request:
types: [opened, synchronize] branches:
- "*"
workflow_dispatch: {}
jobs: jobs:
integration_test: integration_test:
@@ -20,6 +22,20 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
combo: combo:
- otp-version: 'OTP-27.0-rc1'
os: 'windows-latest'
- otp-version: '26.0'
elixir-version: 'main'
os: 'windows-latest'
version-type: 'strict'
- otp-version: '26.0'
elixir-version: 'v1.14-otp-25'
os: 'windows-latest'
version-type: 'strict'
- otp-version: '26.0'
elixir-version: '1.14.5'
os: 'windows-latest'
version-type: 'strict'
- otp-version: '25' - otp-version: '25'
rebar3-version: 'nightly' rebar3-version: 'nightly'
os: 'windows-latest' os: 'windows-latest'
@@ -52,7 +68,7 @@ jobs:
escript_script: 'protoc-gen-elixir --version' escript_script: 'protoc-gen-elixir --version'
os: 'windows-latest' os: 'windows-latest'
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Use erlef/setup-beam - name: Use erlef/setup-beam
id: setup-beam id: setup-beam
uses: ./ uses: ./
@@ -61,6 +77,7 @@ jobs:
elixir-version: ${{matrix.combo.elixir-version}} elixir-version: ${{matrix.combo.elixir-version}}
gleam-version: ${{matrix.combo.gleam-version}} gleam-version: ${{matrix.combo.gleam-version}}
rebar3-version: ${{matrix.combo.rebar3-version}} rebar3-version: ${{matrix.combo.rebar3-version}}
version-type: ${{matrix.combo.version-type}}
- name: Erlang/OTP version (action) - name: Erlang/OTP version (action)
run: echo "Erlang/OTP ${{steps.setup-beam.outputs.otp-version}}" run: echo "Erlang/OTP ${{steps.setup-beam.outputs.otp-version}}"
- name: Elixir version (action) - name: Elixir version (action)
@@ -104,6 +121,7 @@ jobs:
mix escript.install --force ${{matrix.combo.escript_packages}} mix escript.install --force ${{matrix.combo.escript_packages}}
${{matrix.combo.escript_script}} ${{matrix.combo.escript_script}}
if: ${{matrix.combo.escript_packages && matrix.combo.escript_script}} if: ${{matrix.combo.escript_packages && matrix.combo.escript_script}}
environment_variables: environment_variables:
name: Environment variables name: Environment variables
runs-on: ${{matrix.combo.os}} runs-on: ${{matrix.combo.os}}
@@ -117,7 +135,7 @@ jobs:
rebar3-version: 'nightly' rebar3-version: 'nightly'
os: 'windows-latest' os: 'windows-latest'
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Use erlef/setup-beam - name: Use erlef/setup-beam
id: setup-beam id: setup-beam
uses: ./ uses: ./
@@ -127,10 +145,10 @@ jobs:
gleam-version: ${{matrix.combo.gleam-version}} gleam-version: ${{matrix.combo.gleam-version}}
rebar3-version: ${{matrix.combo.rebar3-version}} rebar3-version: ${{matrix.combo.rebar3-version}}
- run: env - run: env
- name: List environment variables - name: Check environment variables
run: | run: |
[ -n "${INSTALL_DIR_FOR_ELIXIR}" ] && echo "${INSTALL_DIR_FOR_ELIXIR}" & "$Env:INSTALL_DIR_FOR_ELIXIR/bin/elixir" "-v"
[ -n "${INSTALL_DIR_FOR_GLEAM}" ] && echo "${INSTALL_DIR_FOR_GLEAM}" & "$Env:INSTALL_DIR_FOR_GLEAM/bin/gleam.exe" "--version"
[ -n "${INSTALL_DIR_FOR_OTP}" ] && echo "${INSTALL_DIR_FOR_OTP}" & "$Env:INSTALL_DIR_FOR_OTP/bin/erl.exe" "+V"
[ -n "${INSTALL_DIR_FOR_REBAR3}" ] && echo "${INSTALL_DIR_FOR_REBAR3}" & "$Env:INSTALL_DIR_FOR_REBAR3/bin/rebar3.cmd" "version"
shell: bash & "$Env:INSTALL_DIR_FOR_REBAR3/bin/rebar3.ps1" "version"
-1
View File
@@ -1,3 +1,2 @@
node_modules/** node_modules/**
dist/.github/workflows
test/.tool-versions test/.tool-versions
+1177 -1642
View File
File diff suppressed because it is too large Load Diff
+35 -17
View File
@@ -53,9 +53,9 @@ and Erlang/OTP.
|- |- |- |- |- |-
| ubuntu-18.04 | 17 - 25 | ✅ | ubuntu-18.04 | 17 - 25 | ✅
| ubuntu-20.04 | 20 - 25 | ✅ | ubuntu-20.04 | 20 - 25 | ✅
| ubuntu-22.04 | 24.2 - 25 | ✅ | ubuntu-22.04 | 24.2 - 26 | ✅
| windows-2019 | 21* - 25 | ✅ | windows-2019 | 21* - 25 | ✅
| windows-2022 | 21* - 25 | ✅ | windows-2022 | 21* - 26 | ✅
**Note** *: prior to 23, Windows builds are only available for minor versions, e.g. 21.0, 21.3, 22.0, etc. **Note** *: prior to 23, Windows builds are only available for minor versions, e.g. 21.0, 21.3, 22.0, etc.
@@ -83,11 +83,26 @@ jobs:
env: env:
ImageOS: ubuntu20 # equivalent to runs-on ubuntu-20.04 ImageOS: ubuntu20 # equivalent to runs-on ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: erlef/setup-beam@v1 - uses: erlef/setup-beam@v1
... ...
``` ```
### Outputs
The action provides the following outputs:
| Output | Content
|- |-
| otp-version | The Erlang version, e.g. `OTP-26.0`
| elixir-version | The Elixir version, e.g. `v1.14-otp-26`
| gleam-version | The Gleam version, e.g. `v0.23.0`
| rebar3-version | The `rebar3` version, e.g. `3.18.0`
| setup-beam-version | The commit unique id of the executed action version, e.g. `a34c98f`
accessible as `${{steps.<setup-beam-step-id>.outputs.<Output>}}`,
e.g. `${{steps.setup-beam.outputs.erlang-version}}`
### Version file ### Version file
A version file is specified via input `version-file` (e.g.`.tool-versions`). This A version file is specified via input `version-file` (e.g.`.tool-versions`). This
@@ -107,11 +122,11 @@ with the following correspondence.
#### `.tool-versions` format #### `.tool-versions` format
| YML | `.tool-versions` | | YML | `.tool-versions` |
|- |- |- |- |
| `otp-version` | `erlang` | `otp-version` | `erlang` |
| `elixir-version` | `elixir` | `elixir-version` | `elixir` |
| `gleam-version` | `gleam` | `gleam-version` | `gleam` |
| `rebar3-version` | `rebar` | `rebar3-version` | `rebar` |
### Example (Erlang/OTP + Elixir, on Ubuntu) ### Example (Erlang/OTP + Elixir, on Ubuntu)
@@ -128,7 +143,7 @@ jobs:
otp: ['20.3', '21.3', '22.2'] otp: ['20.3', '21.3', '22.2']
elixir: ['1.8.2', '1.9.4'] elixir: ['1.8.2', '1.9.4']
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: erlef/setup-beam@v1 - uses: erlef/setup-beam@v1
with: with:
otp-version: ${{matrix.otp}} otp-version: ${{matrix.otp}}
@@ -152,7 +167,7 @@ jobs:
otp: ['20.3', '21.3', '22.2'] otp: ['20.3', '21.3', '22.2']
rebar3: ['3.14.1', '3.14.3'] rebar3: ['3.14.1', '3.14.3']
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: erlef/setup-beam@v1 - uses: erlef/setup-beam@v1
with: with:
otp-version: ${{matrix.otp}} otp-version: ${{matrix.otp}}
@@ -170,7 +185,7 @@ jobs:
test: test:
runs-on: windows-2022 runs-on: windows-2022
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: erlef/setup-beam@v1 - uses: erlef/setup-beam@v1
with: with:
otp-version: '24' otp-version: '24'
@@ -188,7 +203,7 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: erlef/setup-beam@v1 - uses: erlef/setup-beam@v1
with: with:
otp-version: '24' otp-version: '24'
@@ -206,7 +221,7 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: erlef/setup-beam@v1 - uses: erlef/setup-beam@v1
with: with:
otp-version: false otp-version: false
@@ -230,10 +245,10 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- uses: erlef/setup-beam@v1 - uses: erlef/setup-beam@v1
with: with:
otp-version: '25' otp-version: '26'
# Use `cdn.jsdelivr.net/hex` as an alternative to `builds.hex.pm` # Use `cdn.jsdelivr.net/hex` as an alternative to `builds.hex.pm`
hexpm-mirrors: https://cdn.jsdelivr.net/hex hexpm-mirrors: https://cdn.jsdelivr.net/hex
``` ```
@@ -248,10 +263,10 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- uses: erlef/setup-beam@v1 - uses: erlef/setup-beam@v1
with: with:
otp-version: '25' otp-version: '26'
hexpm-mirrors: | hexpm-mirrors: |
https://builds.hex.pm https://builds.hex.pm
https://cdn.jsdelivr.net/hex https://cdn.jsdelivr.net/hex
@@ -267,6 +282,9 @@ environment variables:
- `INSTALL_DIR_FOR_GLEAM`: base folder for Gleam - `INSTALL_DIR_FOR_GLEAM`: base folder for Gleam
- `INSTALL_DIR_FOR_REBAR3`: base folder for `rebar3` - `INSTALL_DIR_FOR_REBAR3`: base folder for `rebar3`
In each of these you'll find folder `bin` where the appropriate binaries, platform-dependant,
are found (i.e. `erl`, `erl.exe`, `rebar3`, `rebar3.exe`, ...).
## Elixir Problem Matchers ## Elixir Problem Matchers
The Elixir Problem Matchers in this repository are adapted from The Elixir Problem Matchers in this repository are adapted from
+34
View File
@@ -0,0 +1,34 @@
# Security policy
Thanks for helping make `setup-beam` safer for everyone.
Find below updated information on our security policy.
## Security
We take the security of this software seriously.
We don't implement a bug bounty program or bounty rewards, but will work with
you to ensure that your findings get the appropriate handling.
## Reporting Security Issues
If you believe you have found a security vulnerability in this repository,
please report it to <bryan.paxton@erlef.org>.
Please do not report security vulnerabilities through public channels, like
GitHub issues, discussions, or pull requests.
Please include as much of the information listed below as you can to help us
better understand and resolve the issue:
- the type of issue (e.g., buffer overflow, SQL injection, or cross-site
scripting)
- full paths of source file(s) related to the manifestation of the issue
- the location of the affected source code (tag/branch/commit or direct URL)
- any special configuration required to reproduce the issue
- step-by-step instructions to reproduce the issue
- proof-of-concept or exploit code (if possible)
- impact of the issue, including how an attacker might exploit the issue
This information will help us triage your report more quickly.
+3 -1
View File
@@ -58,6 +58,8 @@ outputs:
description: Exact version of Gleam that was installed description: Exact version of Gleam that was installed
rebar3-version: rebar3-version:
description: Exact version of rebar3 that was installed description: Exact version of rebar3 that was installed
setup-beam-version:
description: The commit unique id of the execution action version
runs: runs:
using: node16 using: node20
main: dist/index.js main: dist/index.js
-62
View File
@@ -1,62 +0,0 @@
{
"problemMatcher": [
{
"owner": "elixir-mixCompileError",
"severity": "error",
"pattern": [
{
"regexp": "^\\*\\* \\((\\w+)\\) (.*):(\\d+): (.*)$",
"file": 2,
"line": 3,
"message": 0
}
]
},
{
"owner": "elixir-mixCompileWarning",
"severity": "warning",
"pattern": [
{
"regexp": "^warning: (.*)$",
"message": 1
},
{
"regexp": "^ (.*):(\\d+).*$",
"file": 1,
"line": 2
}
]
},
{
"owner": "elixir-mixTestFailure",
"severity": "error",
"pattern": [
{
"regexp": "^\\s*\\d+\\) (.*)$",
"message": 1
},
{
"regexp": "^\\s*(.*):(\\d+)$",
"file": 1,
"line": 2
}
]
},
{
"owner": "elixir-credoOutputDefault",
"severity": "warning",
"pattern": [
{
"regexp": "^\u2503\\s\\[\\w\\]\\s[\u2191|\u2197|\u2192|\u2198|\u2193]\\s(.*)$",
"message": 1
},
{
"regexp": "^\u2503\\s{7}(.*):(\\d+):(\\d+)\\s.*$",
"file": 1,
"line": 2,
"column": 3
}
]
}
]
}
+2555 -2176
View File
File diff suppressed because it is too large Load Diff
-37
View File
@@ -1,37 +0,0 @@
param([Parameter(Mandatory=$true)][string]${VSN})
$ErrorActionPreference="Stop"
Set-Location ${Env:RUNNER_TEMP}
$FILE_OUTPUT="gleam.zip"
$DIR_FOR_BIN=".setup-beam/gleam"
function Version-Greater-Than([string]${THIS_ONE}, [string]${REFERENCE}) {
$THIS_ONE=$THIS_ONE.replace('v', '')
$THIS_ONE=$THIS_ONE.replace('rc', '')
$THIS_ONE=$THIS_ONE.replace('-', '')
return [version]${THIS_ONE} -gt [version]${REFERENCE}
}
function Uses-LLVM-Triplets([string]${THIS_VSN}) {
return "${THIS_VSN}" -eq "nightly" -or (Version-Greater-Than "${THIS_VSN}" "0.22.1")
}
if (Uses-LLVM-Triplets "$VSN") {
$FILE_INPUT="gleam-${VSN}-x86_64-pc-windows-msvc.zip"
} else {
$FILE_INPUT="gleam-${VSN}-windows-64bit.zip"
}
$ProgressPreference="SilentlyContinue"
Invoke-WebRequest "https://github.com/gleam-lang/gleam/releases/download/${VSN}/${FILE_INPUT}" -OutFile "${FILE_OUTPUT}"
$ProgressPreference="Continue"
New-Item "${DIR_FOR_BIN}/bin" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue"
Expand-Archive -DestinationPath "${DIR_FOR_BIN}/bin" -Path "${FILE_OUTPUT}"
$ProgressPreference="Continue"
Write-Output "Installed Gleam version follows"
& "${DIR_FOR_BIN}/bin/gleam" "--version" | Write-Output
"INSTALL_DIR_FOR_GLEAM=${Env:RUNNER_TEMP}/${DIR_FOR_BIN}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
-35
View File
@@ -1,35 +0,0 @@
#!/bin/bash
set -eo pipefail
cd "${RUNNER_TEMP}"
VSN="$1"
FILE_OUTPUT=gleam.tar.gz
DIR_FOR_BIN=.setup-beam/gleam
version_gt() {
REFERENCE=$1
test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$REFERENCE"
}
uses_llvm_triplets() {
local VERSION="$1"
test "${VERSION}" = "nightly" || version_gt "${VERSION}" "v0.22.1"
}
if uses_llvm_triplets "$VSN"
then
FILE_INPUT="gleam-${VSN}-x86_64-unknown-linux-musl.tar.gz"
else
FILE_INPUT="gleam-${VSN}-linux-amd64.tar.gz"
fi
wget -q -O "${FILE_OUTPUT}" "https://github.com/gleam-lang/gleam/releases/download/${VSN}/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}/bin"
tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}/bin"
echo "Installed Gleam version follows"
${DIR_FOR_BIN}/bin/gleam --version
echo "INSTALL_DIR_FOR_GLEAM=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
-32
View File
@@ -1,32 +0,0 @@
param([Parameter(Mandatory=$true)][string]${VSN})
$ErrorActionPreference="Stop"
Set-Location ${Env:RUNNER_TEMP}
$FILE_INPUT="rebar3"
$FILE_OUTPUT="rebar3"
$FILE_OUTPUT_PS1="rebar3.ps1"
$FILE_OUTPUT_CMD="rebar3.cmd"
$DIR_FOR_BIN=".setup-beam/rebar3"
$ProgressPreference="SilentlyContinue"
$REBAR3_TARGET="https://github.com/erlang/rebar3/releases/download/${VSN}/${FILE_INPUT}"
$REBAR3_NIGHTLY=""
If ( ${VSN} -eq "nightly" )
{
$REBAR3_TARGET="https://s3.amazonaws.com/rebar3-nightly/rebar3"
$REBAR3_NIGHTLY=" (from nightly build)"
}
Invoke-WebRequest "${REBAR3_TARGET}" -OutFile "${FILE_OUTPUT}"
$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
Write-Output "@echo off`r`nescript.exe ${PWD}/${DIR_FOR_BIN}/bin/${FILE_OUTPUT} %*" | Out-File -FilePath "${FILE_OUTPUT_CMD}" -Encoding utf8 -Append
Move-Item "${FILE_OUTPUT_PS1}" "${DIR_FOR_BIN}/bin"
Move-Item "${FILE_OUTPUT_CMD}" "${DIR_FOR_BIN}/bin"
Write-Output "Installed rebar3 version${REBAR3_NIGHTLY} follows"
& "${DIR_FOR_BIN}/bin/rebar3.cmd" "version" | Write-Output
"INSTALL_DIR_FOR_REBAR3=${Env:RUNNER_TEMP}/${DIR_FOR_BIN}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
-25
View File
@@ -1,25 +0,0 @@
#!/bin/bash
set -eo pipefail
cd "${RUNNER_TEMP}"
VSN=${1}
FILE_INPUT=rebar3
FILE_OUTPUT=rebar3
DIR_FOR_BIN=.setup-beam/rebar3
REBAR3_TARGET="https://github.com/erlang/rebar3/releases/download/${VSN}/${FILE_INPUT}"
REBAR3_NIGHTLY=""
if [ "${VSN}" == "nightly" ]; then
REBAR3_TARGET="https://s3.amazonaws.com/rebar3-nightly/rebar3"
REBAR3_NIGHTLY=" (from nightly build)"
fi
wget -q -O "${FILE_OUTPUT}" "${REBAR3_TARGET}"
mkdir -p "${DIR_FOR_BIN}/bin"
chmod +x "${FILE_OUTPUT}"
mv "${FILE_OUTPUT}" "${DIR_FOR_BIN}/bin"
echo "Installed rebar3 version${REBAR3_NIGHTLY} follows"
${DIR_FOR_BIN}/bin/rebar3 version
echo "INSTALL_DIR_FOR_REBAR3=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
+1249 -3519
View File
File diff suppressed because it is too large Load Diff
+14 -22
View File
@@ -7,39 +7,31 @@
"format": "prettier src/**/*.js --write && prettier test/**/*.js --write", "format": "prettier src/**/*.js --write && prettier test/**/*.js --write",
"jslint": "eslint src/**/*.js && eslint test/**/*.js", "jslint": "eslint src/**/*.js && eslint test/**/*.js",
"licenses": "yarn licenses generate-disclaimer > 3RD_PARTY_LICENSES", "licenses": "yarn licenses generate-disclaimer > 3RD_PARTY_LICENSES",
"markdownlint": "markdownlint *.md", "markdownlint": "markdownlint *.md ./github/**/*.md",
"shellcheck": "shellcheck src/install-*.sh .github/workflows/*.sh", "shellcheck": "shellcheck .github/workflows/*.sh",
"test": "node test/setup-beam.test.js && node ./test/problem-matchers.test.js", "test": "node test/setup-beam.test.js",
"yamllint": "yamllint .github/workflows/**.yml && yamllint .*.yml && yamllint *.yml", "yamllint": "yamllint .github/workflows/**.yml && yamllint .*.yml && yamllint *.yml",
"build-dist": "npm install && npm run build && npm run format && npm run markdownlint && npm run shellcheck && npm run yamllint && npm run jslint" "clean-dist": "rm -rf ./dist",
}, "lint": "npm run markdownlint && npm run shellcheck && npm run yamllint && npm run jslint",
"husky": { "build-dist": "npm run clean-dist && npm install && npm run build && npm run format && npm run lint"
"hooks": {
"pre-commit": "npm run format -- --check && npm run build && git add dist/"
}
}, },
"dependencies": { "dependencies": {
"@actions/core": "1.10.0", "@actions/core": "1.10.0",
"@actions/exec": "1.1.1", "@actions/exec": "1.1.1",
"@actions/http-client": "2.1.0", "@actions/http-client": "2.1.0",
"@actions/tool-cache": "^2.0.1", "@actions/tool-cache": "2.0.1",
"semver": "7.3.8" "semver": "7.5.4"
}, },
"devDependencies": { "devDependencies": {
"@vercel/ncc": "0.34.0", "@vercel/ncc": "0.36.1",
"eslint": "8.25.0", "eslint": "8.43.0",
"eslint-config-airbnb": "19.0.4", "markdownlint-cli": "0.35.0",
"eslint-plugin-import": "2.26.0", "prettier": "2.8.8",
"eslint-plugin-jsx-a11y": "6.6.1", "shellcheck": "2.2.0",
"eslint-plugin-react": "7.31.10",
"husky": "8.0.1",
"markdownlint": "0.26.2",
"prettier": "2.7.1",
"shellcheck": "1.1.0",
"yaml-lint": "1.7.0", "yaml-lint": "1.7.0",
"yarn": "1.22.19" "yarn": "1.22.19"
}, },
"engines": { "engines": {
"node": ">=16" "node": ">=20"
} }
} }
-37
View File
@@ -1,37 +0,0 @@
param([Parameter(Mandatory=$true)][string]${VSN})
$ErrorActionPreference="Stop"
Set-Location ${Env:RUNNER_TEMP}
$FILE_OUTPUT="gleam.zip"
$DIR_FOR_BIN=".setup-beam/gleam"
function Version-Greater-Than([string]${THIS_ONE}, [string]${REFERENCE}) {
$THIS_ONE=$THIS_ONE.replace('v', '')
$THIS_ONE=$THIS_ONE.replace('rc', '')
$THIS_ONE=$THIS_ONE.replace('-', '')
return [version]${THIS_ONE} -gt [version]${REFERENCE}
}
function Uses-LLVM-Triplets([string]${THIS_VSN}) {
return "${THIS_VSN}" -eq "nightly" -or (Version-Greater-Than "${THIS_VSN}" "0.22.1")
}
if (Uses-LLVM-Triplets "$VSN") {
$FILE_INPUT="gleam-${VSN}-x86_64-pc-windows-msvc.zip"
} else {
$FILE_INPUT="gleam-${VSN}-windows-64bit.zip"
}
$ProgressPreference="SilentlyContinue"
Invoke-WebRequest "https://github.com/gleam-lang/gleam/releases/download/${VSN}/${FILE_INPUT}" -OutFile "${FILE_OUTPUT}"
$ProgressPreference="Continue"
New-Item "${DIR_FOR_BIN}/bin" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue"
Expand-Archive -DestinationPath "${DIR_FOR_BIN}/bin" -Path "${FILE_OUTPUT}"
$ProgressPreference="Continue"
Write-Output "Installed Gleam version follows"
& "${DIR_FOR_BIN}/bin/gleam" "--version" | Write-Output
"INSTALL_DIR_FOR_GLEAM=${Env:RUNNER_TEMP}/${DIR_FOR_BIN}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
-35
View File
@@ -1,35 +0,0 @@
#!/bin/bash
set -eo pipefail
cd "${RUNNER_TEMP}"
VSN="$1"
FILE_OUTPUT=gleam.tar.gz
DIR_FOR_BIN=.setup-beam/gleam
version_gt() {
REFERENCE=$1
test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$REFERENCE"
}
uses_llvm_triplets() {
local VERSION="$1"
test "${VERSION}" = "nightly" || version_gt "${VERSION}" "v0.22.1"
}
if uses_llvm_triplets "$VSN"
then
FILE_INPUT="gleam-${VSN}-x86_64-unknown-linux-musl.tar.gz"
else
FILE_INPUT="gleam-${VSN}-linux-amd64.tar.gz"
fi
wget -q -O "${FILE_OUTPUT}" "https://github.com/gleam-lang/gleam/releases/download/${VSN}/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}/bin"
tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}/bin"
echo "Installed Gleam version follows"
${DIR_FOR_BIN}/bin/gleam --version
echo "INSTALL_DIR_FOR_GLEAM=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
-32
View File
@@ -1,32 +0,0 @@
param([Parameter(Mandatory=$true)][string]${VSN})
$ErrorActionPreference="Stop"
Set-Location ${Env:RUNNER_TEMP}
$FILE_INPUT="rebar3"
$FILE_OUTPUT="rebar3"
$FILE_OUTPUT_PS1="rebar3.ps1"
$FILE_OUTPUT_CMD="rebar3.cmd"
$DIR_FOR_BIN=".setup-beam/rebar3"
$ProgressPreference="SilentlyContinue"
$REBAR3_TARGET="https://github.com/erlang/rebar3/releases/download/${VSN}/${FILE_INPUT}"
$REBAR3_NIGHTLY=""
If ( ${VSN} -eq "nightly" )
{
$REBAR3_TARGET="https://s3.amazonaws.com/rebar3-nightly/rebar3"
$REBAR3_NIGHTLY=" (from nightly build)"
}
Invoke-WebRequest "${REBAR3_TARGET}" -OutFile "${FILE_OUTPUT}"
$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
Write-Output "@echo off`r`nescript.exe ${PWD}/${DIR_FOR_BIN}/bin/${FILE_OUTPUT} %*" | Out-File -FilePath "${FILE_OUTPUT_CMD}" -Encoding utf8 -Append
Move-Item "${FILE_OUTPUT_PS1}" "${DIR_FOR_BIN}/bin"
Move-Item "${FILE_OUTPUT_CMD}" "${DIR_FOR_BIN}/bin"
Write-Output "Installed rebar3 version${REBAR3_NIGHTLY} follows"
& "${DIR_FOR_BIN}/bin/rebar3.cmd" "version" | Write-Output
"INSTALL_DIR_FOR_REBAR3=${Env:RUNNER_TEMP}/${DIR_FOR_BIN}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
-25
View File
@@ -1,25 +0,0 @@
#!/bin/bash
set -eo pipefail
cd "${RUNNER_TEMP}"
VSN=${1}
FILE_INPUT=rebar3
FILE_OUTPUT=rebar3
DIR_FOR_BIN=.setup-beam/rebar3
REBAR3_TARGET="https://github.com/erlang/rebar3/releases/download/${VSN}/${FILE_INPUT}"
REBAR3_NIGHTLY=""
if [ "${VSN}" == "nightly" ]; then
REBAR3_TARGET="https://s3.amazonaws.com/rebar3-nightly/rebar3"
REBAR3_NIGHTLY=" (from nightly build)"
fi
wget -q -O "${FILE_OUTPUT}" "${REBAR3_TARGET}"
mkdir -p "${DIR_FOR_BIN}/bin"
chmod +x "${FILE_OUTPUT}"
mv "${FILE_OUTPUT}" "${DIR_FOR_BIN}/bin"
echo "Installed rebar3 version${REBAR3_NIGHTLY} follows"
${DIR_FOR_BIN}/bin/rebar3 version
echo "INSTALL_DIR_FOR_REBAR3=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
-164
View File
@@ -1,164 +0,0 @@
const core = require('@actions/core')
const { exec } = require('@actions/exec')
const tc = require('@actions/tool-cache')
const path = require('path')
const fs = require('fs')
const os = require('os')
/**
* Install Erlang/OTP.
*
* @param {string} osVersion
* @param {string} otpVersion
* @param {string[]} hexMirrors
*/
async function installOTP(osVersion, otpVersion, hexMirrors) {
if (hexMirrors.length === 0) {
throw new Error(
`Could not install Erlang/OTP ${otpVersion} from any hex.pm mirror`,
)
}
const [hexMirror, ...hexMirrorsT] = hexMirrors
const fullVersion = `${osVersion}/${otpVersion}`
let cachedPath = tc.find('otp', fullVersion)
const OS = process.platform
try {
if (OS === 'linux') {
if (!cachedPath) {
const tarPath = await tc.downloadTool(
`https://builds.hex.pm/builds/otp/${fullVersion}.tar.gz`,
)
const extractPath = await tc.extractTar(tarPath, undefined, [
'zx',
'--strip-components=1',
])
cachedPath = await tc.cacheDir(extractPath, 'otp', fullVersion)
}
await exec(path.join(cachedPath, 'Install'), ['-minimal', cachedPath])
const otpPath = path.join(cachedPath, 'bin')
core.addPath(otpPath)
core.exportVariable('INSTALL_DIR_FOR_OTP', cachedPath)
core.info('Installed Erlang/OTP version')
await exec(path.join(otpPath, 'erl'), ['-version'])
} else if (OS === 'win32') {
if (!cachedPath) {
const exePath = await tc.downloadTool(
'https://github.com/erlang/otp/releases/download/' +
`OTP-${otpVersion}/otp_win64_${otpVersion}.exe`,
)
cachedPath = await tc.cacheFile(exePath, 'otp.exe', 'otp', fullVersion)
}
const otpDir = path.join(process.env.RUNNER_TEMP, '.setup-beam', 'otp')
const otpPath = path.join(otpDir, 'bin')
await fs.promises.mkdir(otpDir, { recursive: true })
await exec(path.join(cachedPath, 'otp.exe'), ['/S', `/D=${otpDir}`])
core.addPath(otpPath)
core.exportVariable('INSTALL_DIR_FOR_OTP', otpDir)
core.info('Installed Erlang/OTP version')
await exec(path.join(otpPath, 'erl'), ['+V'])
}
} catch (err) {
core.info(`Install OTP failed for mirror ${hexMirror}`)
core.info(`${err}\n${err.stack}`)
await installOTP(osVersion, otpVersion, hexMirrorsT)
}
}
/**
* Install Elixir.
*
* @param {string} elixirVersion
* @param {string[]} hexMirrors
*/
async function installElixir(elixirVersion, hexMirrors) {
if (hexMirrors.length === 0) {
throw new Error(
`Could not install Elixir ${elixirVersion} from any hex.pm mirror`,
)
}
const [hexMirror, ...hexMirrorsT] = hexMirrors
try {
let cachedPath = tc.find('elixir', elixirVersion)
if (!cachedPath) {
const zipPath = await tc.downloadTool(
`${hexMirror}/builds/elixir/${elixirVersion}.zip`,
)
const extractPath = await tc.extractZip(zipPath)
cachedPath = await tc.cacheDir(extractPath, 'elixir', elixirVersion)
}
const elixirPath = path.join(cachedPath, 'bin')
const escriptsPath = path.join(os.homedir(), '.mix', 'escripts')
core.addPath(elixirPath)
core.addPath(escriptsPath)
core.exportVariable('INSTALL_DIR_FOR_ELIXIR', cachedPath)
core.info('Installed Elixir version')
await exec(path.join(elixirPath, 'elixir'), ['-v'])
await fs.promises.mkdir(escriptsPath, { recursive: true })
} catch (err) {
core.info(`Elixir install failed for mirror ${hexMirror}`)
core.info(`${err}\n${err.stack}`)
await installElixir(elixirVersion, hexMirrorsT)
}
}
/**
* Install Gleam.
*
* @param {string} gleamVersion
*/
async function installGleam(gleamVersion) {
const OS = process.platform
if (OS === 'linux') {
await exec(path.join(__dirname, 'install-gleam.sh'), [gleamVersion])
} else if (OS === 'win32') {
const script = path.join(__dirname, 'install-gleam.ps1')
await exec(`pwsh.exe ${script} -VSN:${gleamVersion}`)
}
}
/**
* Install rebar3.
*
* @param {string} rebar3Version
*/
async function installRebar3(rebar3Version) {
const OS = process.platform
if (OS === 'linux') {
await exec(path.join(__dirname, 'install-rebar3.sh'), [rebar3Version])
} else if (OS === 'win32') {
const script = path.join(__dirname, 'install-rebar3.ps1')
await exec(`pwsh.exe ${script} -VSN:${rebar3Version}`)
}
}
function checkPlatform() {
if (process.platform !== 'linux' && process.platform !== 'win32') {
throw new Error(
'@erlef/setup-beam only supports Ubuntu and Windows at this time',
)
}
}
module.exports = {
installOTP,
installElixir,
installGleam,
installRebar3,
checkPlatform,
}
+582 -162
View File
File diff suppressed because it is too large Load Diff
-82
View File
@@ -1,82 +0,0 @@
const assert = require('assert')
const core = require('@actions/core')
const { problemMatcher } = require('../matchers/elixir-matchers.json')
async function all() {
await testElixirMixCompileError()
await testElixirMixCompileWarning()
await testElixirMixTestFailure()
await testElixirCredoOutputDefault()
}
async function testElixirMixCompileError() {
const [matcher] = problemMatcher.find(
({ owner }) => owner === 'elixir-mixCompileError',
).pattern
const output = '** (CompileError) lib/test.ex:16: undefined function err/0'
const [message, , file, line] = output.match(matcher.regexp)
assert.equal(file, 'lib/test.ex')
assert.equal(line, '16')
assert.equal(message, output)
}
async function testElixirMixCompileWarning() {
const [messagePattern, filePattern] = problemMatcher.find(
({ owner }) => owner === 'elixir-mixCompileWarning',
).pattern
const firstOutput =
'warning: variable "err" does not exist and is being expanded to "err()"'
const secondOutput = ' lib/test.ex:16: Test.hello/0'
const [, message] = firstOutput.match(messagePattern.regexp)
assert.equal(
message,
'variable "err" does not exist and is being expanded to "err()"',
)
const [, file, line] = secondOutput.match(filePattern.regexp)
assert.equal(file, 'lib/test.ex')
assert.equal(line, '16')
}
async function testElixirMixTestFailure() {
const [messagePattern, filePattern] = problemMatcher.find(
({ owner }) => owner === 'elixir-mixTestFailure',
).pattern
const firstOutput = '1) test throws (TestTest)'
const secondOutput = ' test/test_test.exs:9'
const [, message] = firstOutput.match(messagePattern.regexp)
assert.equal(message, 'test throws (TestTest)')
const [, file, line] = secondOutput.match(filePattern.regexp)
assert.equal(file, 'test/test_test.exs')
assert.equal(line, '9')
}
async function testElixirCredoOutputDefault() {
const [messagePattern, filePattern] = problemMatcher.find(
({ owner }) => owner === 'elixir-credoOutputDefault',
).pattern
const firstOutput = '┃ [F] → Function is too complex (CC is 29, max is 9).'
const secondOutput = '┃ lib/test.ex:15:7 #(Test.hello)'
const [, message] = firstOutput.match(messagePattern.regexp)
assert.equal(message, 'Function is too complex (CC is 29, max is 9).')
const [, file, line, column] = secondOutput.match(filePattern.regexp)
assert.equal(file, 'lib/test.ex')
assert.equal(line, '15')
assert.equal(column, '7')
}
all()
.then(() => process.exit(0))
.catch((err) => {
core.error(err)
process.exit(1)
})
+2 -2
View File
@@ -11,8 +11,8 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2.0.0 - uses: actions/checkout@v4
- uses: erlef/setup-beam@v1.9.0 - uses: erlef/setup-beam@v1
with: with:
otp-version: "23.2" otp-version: "23.2"
gleam-version: "0.23.0-rc1" gleam-version: "0.23.0-rc1"
+217 -43
View File
@@ -4,13 +4,15 @@ simulateInput('rebar3-version', '3.20')
simulateInput('install-rebar', 'true') simulateInput('install-rebar', 'true')
simulateInput('install-hex', 'true') simulateInput('install-hex', 'true')
simulateInput('github-token', process.env.GITHUB_TOKEN) simulateInput('github-token', process.env.GITHUB_TOKEN)
simulateInput('hexpm-mirrors', ['https://builds.hex.pm']) simulateInput('hexpm-mirrors', 'https://builds.hex.pm', { multiline: true })
const assert = require('assert') const assert = require('assert')
const fs = require('fs') const fs = require('fs')
const os = require('os')
const path = require('path')
const core = require('@actions/core') const core = require('@actions/core')
const setupBeam = require('../src/setup-beam') const setupBeam = require('../src/setup-beam')
const installer = require('../src/installer') const { problemMatcher } = require('../matchers/elixir-matchers.json')
async function all() { async function all() {
await testFailInstallOTP() await testFailInstallOTP()
@@ -26,6 +28,11 @@ async function all() {
await testGetVersionFromSpec() await testGetVersionFromSpec()
await testParseVersionFile() await testParseVersionFile()
await testElixirMixCompileError()
await testElixirMixCompileWarning()
await testElixirMixTestFailure()
await testElixirCredoOutputDefault()
} }
async function testFailInstallOTP() { async function testFailInstallOTP() {
@@ -33,7 +40,11 @@ async function testFailInstallOTP() {
const otpVersion = 'OTP-23.2' const otpVersion = 'OTP-23.2'
assert.rejects( assert.rejects(
async () => { async () => {
await installer.installOTP(otpOSVersion, otpVersion) await setupBeam.install('otp', {
hexMirror: 'https://builds.hex.pm',
otpOSVersion,
otpVersion,
})
}, },
(err) => { (err) => {
assert.ok(err instanceof Error) assert.ok(err instanceof Error)
@@ -49,7 +60,10 @@ async function testFailInstallElixir() {
exVersion = '0.11' exVersion = '0.11'
assert.rejects( assert.rejects(
async () => { async () => {
await installer.installElixir(exVersion) await setupBeam.install('elixir', {
hexMirror: 'https://builds.hex.pm',
exVersion,
})
}, },
(err) => { (err) => {
assert.ok(err instanceof Error) assert.ok(err instanceof Error)
@@ -61,7 +75,10 @@ async function testFailInstallElixir() {
exVersion = 'v1.0.0-otp-17' exVersion = 'v1.0.0-otp-17'
assert.rejects( assert.rejects(
async () => { async () => {
await installer.installElixir(exVersion) await setupBeam.install('elixir', {
hexMirror: 'https://builds.hex.pm',
exVersion,
})
}, },
(err) => { (err) => {
assert.ok(err instanceof Error) assert.ok(err instanceof Error)
@@ -75,7 +92,7 @@ async function testFailInstallGleam() {
const gleamVersion = '0.1.3' const gleamVersion = '0.1.3'
assert.rejects( assert.rejects(
async () => { async () => {
await installer.installGleam(gleamVersion) await setupBeam.install('gleam', { gleamVersion })
}, },
(err) => { (err) => {
assert.ok(err instanceof Error) assert.ok(err instanceof Error)
@@ -89,7 +106,7 @@ async function testFailInstallRebar3() {
const r3Version = '0.14.4' const r3Version = '0.14.4'
assert.rejects( assert.rejects(
async () => { async () => {
await installer.installRebar3(r3Version) await setupBeam.install('rebar3', { r3Version })
}, },
(err) => { (err) => {
assert.ok(err instanceof Error) assert.ok(err instanceof Error)
@@ -104,48 +121,79 @@ async function testOTPVersions() {
let expected let expected
let spec let spec
let osVersion let osVersion
const hexMirrors = ['https://repo.hex.pm', 'https://cdn.jsdelivr.net/hex'] let before
const hexMirrors = simulateInput(
'hexpm-mirrors',
'https://repo.hex.pm, https://cdn.jsdelivr.net/hex',
{ multiline: true },
)
if (process.platform === 'linux') { if (process.platform === 'linux') {
before = simulateInput('version-type', 'strict')
spec = '25.3.2.1'
osVersion = 'ubuntu-20.04'
expected = 'OTP-25.3.2.1'
got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', before)
spec = '19.3.x' spec = '19.3.x'
osVersion = 'ubuntu-16.04' osVersion = 'ubuntu-16.04'
expected = 'OTP-19.3.6.13' expected = 'OTP-19.3.6.13'
got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors) got = await setupBeam.getOTPVersion(spec, osVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
spec = '^19.3.6' spec = '^19.3.6'
osVersion = 'ubuntu-16.04' osVersion = 'ubuntu-16.04'
expected = 'OTP-19.3.6.13' expected = 'OTP-19.3.6.13'
got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors) got = await setupBeam.getOTPVersion(spec, osVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
spec = '^19.3' spec = '^19.3'
osVersion = 'ubuntu-18.04' osVersion = 'ubuntu-18.04'
expected = 'OTP-19.3.6.13' expected = 'OTP-19.3.6.13'
got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors) got = await setupBeam.getOTPVersion(spec, osVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
spec = '20' spec = '20'
osVersion = 'ubuntu-20.04' osVersion = 'ubuntu-20.04'
expected = 'OTP-20.3.8.26' expected = 'OTP-20.3.8.26'
got = await setupBeam.getOTPVersion(spec, osVersion)
assert.deepStrictEqual(got, expected)
spec = '20.3.8.26'
osVersion = 'ubuntu-20.04'
expected = 'OTP-20.3.8.26'
got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors) got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
spec = '20.x' spec = '20.x'
osVersion = 'ubuntu-20.04' osVersion = 'ubuntu-20.04'
expected = 'OTP-20.3.8.26' expected = 'OTP-20.3.8.26'
got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors) got = await setupBeam.getOTPVersion(spec, osVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
spec = '20.0' spec = '20.0'
osVersion = 'ubuntu-20.04' osVersion = 'ubuntu-20.04'
expected = 'OTP-20.0.5' expected = 'OTP-20.0.5'
got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors) got = await setupBeam.getOTPVersion(spec, osVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
spec = '20.0.x' spec = '20.0.x'
osVersion = 'ubuntu-20.04' osVersion = 'ubuntu-20.04'
expected = 'OTP-20.0.5' expected = 'OTP-20.0.5'
got = await setupBeam.getOTPVersion(spec, osVersion)
assert.deepStrictEqual(got, expected)
spec = 'maint'
osVersion = 'ubuntu-22.04'
expected = 'maint'
got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors)
assert.deepStrictEqual(got, expected)
spec = 'master'
osVersion = 'ubuntu-22.04'
expected = 'master'
got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors) got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
} }
@@ -154,21 +202,23 @@ async function testOTPVersions() {
spec = '24.0.1' spec = '24.0.1'
osVersion = 'windows-latest' osVersion = 'windows-latest'
expected = '24.0.1' expected = '24.0.1'
got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors) got = await setupBeam.getOTPVersion(spec, osVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
spec = '23.2.x' spec = '23.2.x'
osVersion = 'windows-2016' osVersion = 'windows-2016'
expected = '23.2.7' expected = '23.2.7'
got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors) got = await setupBeam.getOTPVersion(spec, osVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
spec = '23.0' spec = '23.0'
osVersion = 'windows-2019' osVersion = 'windows-2019'
expected = '23.0.4' expected = '23.0.4'
got = await setupBeam.getOTPVersion(spec, osVersion, hexMirrors) got = await setupBeam.getOTPVersion(spec, osVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
} }
simulateInput('hexpm-mirrors', hexMirrors, { multiline: true })
} }
async function testElixirVersions() { async function testElixirVersions() {
@@ -177,31 +227,33 @@ async function testElixirVersions() {
let spec let spec
let otpVersion let otpVersion
let before let before
const hexMirrors = ['https://repo.hex.pm'] const hexMirrors = simulateInput('hexpm-mirrors', 'https://repo.hex.pm', {
multiline: true,
})
spec = '1.1.x' spec = '1.1.x'
otpVersion = 'OTP-17' otpVersion = 'OTP-17'
expected = 'v1.1.1-otp-17' expected = 'v1.1.1-otp-17'
got = await setupBeam.getElixirVersion(spec, otpVersion, hexMirrors) got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
spec = '1.10.4' spec = '1.10.4'
otpVersion = 'OTP-23' otpVersion = 'OTP-23'
expected = 'v1.10.4-otp-23' expected = 'v1.10.4-otp-23'
got = await setupBeam.getElixirVersion(spec, otpVersion, hexMirrors) got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
spec = '1.12.1' spec = '1.12.1'
otpVersion = 'OTP-24.0.2' otpVersion = 'OTP-24.0.2'
expected = 'v1.12.1-otp-24' expected = 'v1.12.1-otp-24'
got = await setupBeam.getElixirVersion(spec, otpVersion, hexMirrors) got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
before = simulateInput('version-type', 'strict') before = simulateInput('version-type', 'strict')
spec = '1.14.0' spec = '1.14.0'
otpVersion = 'master' otpVersion = 'main'
expected = 'v1.14.0' expected = 'v1.14.0'
got = await setupBeam.getElixirVersion(spec, otpVersion, hexMirrors) got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
simulateInput('version-type', before) simulateInput('version-type', before)
@@ -209,7 +261,15 @@ async function testElixirVersions() {
spec = 'v1.11.0-rc.0' spec = 'v1.11.0-rc.0'
otpVersion = 'OTP-23' otpVersion = 'OTP-23'
expected = 'v1.11.0-rc.0-otp-23' expected = 'v1.11.0-rc.0-otp-23'
got = await setupBeam.getElixirVersion(spec, otpVersion, hexMirrors) got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', before)
before = simulateInput('version-type', 'strict')
spec = 'v1.11.0-rc.0-otp-23'
otpVersion = 'OTP-23'
expected = 'v1.11.0-rc.0-otp-23'
got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
simulateInput('version-type', before) simulateInput('version-type', before)
@@ -217,7 +277,7 @@ async function testElixirVersions() {
spec = 'v1.11.0' spec = 'v1.11.0'
otpVersion = '22.3.4.2' otpVersion = '22.3.4.2'
expected = 'v1.11.0-otp-22' expected = 'v1.11.0-otp-22'
got = await setupBeam.getElixirVersion(spec, otpVersion, hexMirrors) got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
simulateInput('version-type', before) simulateInput('version-type', before)
@@ -225,9 +285,11 @@ async function testElixirVersions() {
spec = 'main' spec = 'main'
otpVersion = '23.1' otpVersion = '23.1'
expected = 'main-otp-23' expected = 'main-otp-23'
got = await setupBeam.getElixirVersion(spec, otpVersion, hexMirrors) got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
simulateInput('version-type', before) simulateInput('version-type', before)
simulateInput('hexpm-mirrors', hexMirrors, { multiline: true })
} }
async function testGleamVersions() { async function testGleamVersions() {
@@ -283,7 +345,7 @@ async function testGetVersionFromSpec() {
let expected let expected
let spec let spec
let before let before
const versions = [ const versions0 = [
'3.2.30.5', '3.2.30.5',
'3.2.3.5', '3.2.3.5',
'1', '1',
@@ -309,10 +371,20 @@ async function testGetVersionFromSpec() {
'22.3.4.9.1', '22.3.4.9.1',
'22.3.4.12.1', '22.3.4.12.1',
'22.3.4.10.1', '22.3.4.10.1',
'master',
'v11.11.0-rc.0-otp-23',
'22.3.4.2', '22.3.4.2',
'main',
'v11.11.0-rc.0-otp-23',
'22.3.4.2.1.0',
'12.1.2.2',
'12.1.2.4',
'12.1.2.0',
'12.1.2.3',
'12.1.2.3.0',
] ]
const versions = {}
versions0.forEach((version) => {
versions[version] = version
})
spec = '1' spec = '1'
expected = '1.1.0' expected = '1.1.0'
@@ -396,17 +468,12 @@ async function testGetVersionFromSpec() {
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
before = simulateInput('version-type', 'strict') before = simulateInput('version-type', 'strict')
spec = 'master' spec = 'main'
expected = 'master' expected = 'main'
got = setupBeam.getVersionFromSpec(spec, versions) got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
simulateInput('version-type', before) simulateInput('version-type', before)
spec = 'master'
expected = 'master'
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
before = simulateInput('version-type', 'strict') before = simulateInput('version-type', 'strict')
spec = '22.3.4.2' spec = '22.3.4.2'
expected = '22.3.4.2' expected = '22.3.4.2'
@@ -414,6 +481,31 @@ async function testGetVersionFromSpec() {
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
simulateInput('version-type', before) simulateInput('version-type', before)
spec = '22.3.4.2'
expected = '22.3.4.2.1.0'
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
spec = '22.3.4.2.1'
expected = '22.3.4.2.1.0'
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
spec = '22.3.4.2.1.0'
expected = '22.3.4.2.1.0'
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
spec = '12.1.2.3'
expected = '12.1.2.3.0'
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
spec = '22.3.4.2.1.0.1'
expected = null
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
before = simulateInput('version-type', 'strict') before = simulateInput('version-type', 'strict')
spec = '22.3.4.3' spec = '22.3.4.3'
expected = null expected = null
@@ -433,8 +525,8 @@ async function testParseVersionFile() {
const gleam = '0.23.0' const gleam = '0.23.0'
const rebar3 = '3.16.0' const rebar3 = '3.16.0'
const toolVersions = `# a comment const toolVersions = `# a comment
erlang ${erlang}# comment, no space erlang ref:v${erlang}# comment, no space, and ref:v
elixir ${elixir} # comment, with space elixir ref:${elixir} # comment, with space and ref:
not-gleam 0.23 # not picked up not-gleam 0.23 # not picked up
gleam ${gleam} gleam ${gleam}
rebar ${rebar3}` rebar ${rebar3}`
@@ -445,17 +537,25 @@ rebar ${rebar3}`
assert.strictEqual(appVersions.get('erlang'), erlang) assert.strictEqual(appVersions.get('erlang'), erlang)
assert.strictEqual(appVersions.get('elixir'), elixir) assert.strictEqual(appVersions.get('elixir'), elixir)
const absoluteFilename = path.join(os.tmpdir(), '.tool-versions')
fs.writeFileSync(absoluteFilename, toolVersions)
process.env.GITHUB_WORKSPACE = process.cwd()
const absoluteAppVersions = setupBeam.parseVersionFile(absoluteFilename)
assert.strictEqual(absoluteAppVersions.get('erlang'), erlang)
assert.strictEqual(absoluteAppVersions.get('elixir'), elixir)
assert.ok(async () => { assert.ok(async () => {
await installer.installOTP(erlang) await setupBeam.install('otp', { toolVersion: erlang })
}) })
assert.ok(async () => { assert.ok(async () => {
await installer.installElixir(elixir) await setupBeam.install('elixir', { toolVersion: elixir })
}) })
assert.ok(async () => { assert.ok(async () => {
await installer.installGleam(gleam) await setupBeam.install('gleam', { toolVersion: gleam })
}) })
assert.ok(async () => { assert.ok(async () => {
await installer.installRebar3(rebar3) await setupBeam.install('rebar3', { toolVersion: rebar3 })
}) })
simulateInput('otp-version', otpVersion) simulateInput('otp-version', otpVersion)
@@ -464,12 +564,86 @@ rebar ${rebar3}`
simulateInput('rebar3-version', rebar3Version) simulateInput('rebar3-version', rebar3Version)
} }
async function testElixirMixCompileError() {
const [matcher] = problemMatcher.find(
({ owner }) => owner === 'elixir-mixCompileError',
).pattern
const output = '** (CompileError) lib/test.ex:16: undefined function err/0'
const [message, , file, line] = output.match(matcher.regexp)
assert.equal(file, 'lib/test.ex')
assert.equal(line, '16')
assert.equal(message, output)
}
async function testElixirMixCompileWarning() {
const [messagePattern, filePattern] = problemMatcher.find(
({ owner }) => owner === 'elixir-mixCompileWarning',
).pattern
const firstOutput =
'warning: variable "err" does not exist and is being expanded to "err()"'
const secondOutput = ' lib/test.ex:16: Test.hello/0'
const [, message] = firstOutput.match(messagePattern.regexp)
assert.equal(
message,
'variable "err" does not exist and is being expanded to "err()"',
)
const [, file, line] = secondOutput.match(filePattern.regexp)
assert.equal(file, 'lib/test.ex')
assert.equal(line, '16')
}
async function testElixirMixTestFailure() {
const [messagePattern, filePattern] = problemMatcher.find(
({ owner }) => owner === 'elixir-mixTestFailure',
).pattern
const firstOutput = '1) test throws (TestTest)'
const secondOutput = ' test/test_test.exs:9'
const [, message] = firstOutput.match(messagePattern.regexp)
assert.equal(message, 'test throws (TestTest)')
const [, file, line] = secondOutput.match(filePattern.regexp)
assert.equal(file, 'test/test_test.exs')
assert.equal(line, '9')
}
async function testElixirCredoOutputDefault() {
const [messagePattern, filePattern] = problemMatcher.find(
({ owner }) => owner === 'elixir-credoOutputDefault',
).pattern
const firstOutput = '┃ [F] → Function is too complex (CC is 29, max is 9).'
const secondOutput = '┃ lib/test.ex:15:7 #(Test.hello)'
const [, message] = firstOutput.match(messagePattern.regexp)
assert.equal(message, 'Function is too complex (CC is 29, max is 9).')
const [, file, line, column] = secondOutput.match(filePattern.regexp)
assert.equal(file, 'lib/test.ex')
assert.equal(line, '15')
assert.equal(column, '7')
}
function unsimulateInput(key) { function unsimulateInput(key) {
return simulateInput(key, '') return simulateInput(key, '')
} }
function simulateInput(key, value) { function simulateInput(key, value0, opts) {
const before = process.env[input(key)] const { multiline } = opts || {}
const before = process.env[input(key, opts)]
let value = value0
if (multiline) {
if (value.indexOf(', ') !== -1) {
value = value0.replace(/, /g, '\n')
} else {
value = value0.replace(/\n/g, ', ')
}
}
process.env[input(key)] = value process.env[input(key)] = value
return before return before
} }