Compare commits

...

28 Commits

Author SHA1 Message Date
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
Paulo F. Oliveira 61e01a43a5 Fix post -main-merge issue (#213) 2023-06-21 15:08:08 -05:00
Christoph Grothaus df9a60921b 🐛 Fix OTP version null check (#211)
* Fix OTP version null check

* Revert "Fix OTP version null check"

This reverts commit 2c433c16ac.

* Check that the resolved versions contain the spec.

* Only perform semver version resolution when spec is not an rc and version-type is not strict

* Move version inclusion check to the end of the function, when we may have prepended a 'v'

* Refactor function return

* Add test case for strict version resolving a spec that is no available version
2023-06-15 14:45:56 +01:00
Jason Axelson 54d4f15c75 Link to the Elixir/Erlang compatibility page (#209)
* Link to the elixir/erlang compatibility page

Currently when a user encounters an incompatibility between the
requested elixir and erlang versions it isn't clear how to figure out
what the compatible versions are. This is the current error as shown to users:

> Error: Requested Elixir / Erlang/OTP version (1.11.3 / 24.2) not found in version list (did you check Compatibility between Elixir and Erlang/OTP?)

Example failure: https://github.com/ScenicFramework/scenic/pull/318/checks

This PR adds a link to
https://hexdocs.pm/elixir/compatibility-and-deprecations.html so user's
can easily see what versions are compatible.

* Update dist/index.js

* Act on review comment: on > at

---------

Co-authored-by: Paulo F. Oliveira <paulo.ferraz.oliveira@gmail.com>
2023-06-15 14:45:32 +01:00
Kian-Meng Ang ea13066252 Match the right Ubuntu version to Erlang/OTP-20 in readme (#212) 2023-06-15 14:08:54 +01:00
github-actions[bot] 53bf0a5069 Update 3rd party licenses (#207)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2023-05-17 13:07:48 +01:00
Paulo F. Oliveira 977eee5f6e Fix 3rd party licenses updater (action) (#202)
* Act on CI results: fix as per what GitHub Actions is requesting

Seems to have worked up until recently, but then it started
breaking :shrug

* Name the workflow a little better
2023-05-08 19:42:25 -05:00
Eric Meadows-Jönsson 51905b8795 Use @actions/tool-cache (#196) 2023-05-08 12:40:34 +02:00
Paulo F. Oliveira b9783cdeea Ease debugging, fix some CI issues, tweak folder structure (#200)
* Enable debug for OTP versions' listings

* Make it easier to detect

* Prevent error annotation on expected error

The fact that one mirror fails in the above test and others follow
working is test enough for me

A single failing mirror should fail, but it's confusing to have
an error annotation for a success (via continue-on-error) while
not being able to suppress it via GitHub Actions

* Trying to figure out why we have a rebar_core exception

Might simply be that the bug is already fixed and we need to bump rebar3

* Try to debug into non-JSON input

* Prevent error in rebar_core

We're getting Access Denied for
Fetching registry from "https://repo.hex.pm:443/registry.ets.gz?"

* Try to figure out what's breaking tests

* Make jsonParse(...).map failure more understandable

* Ease test maintenance

* Tweak folder structure while moving console._ to core._
2023-05-08 09:31:17 +01:00
Paul Guyot cf692c3264 New option to work with one or more hex.pm mirrors (#197)
* New option to work with one or more hex.pm mirrors

Add a new option called `hexpm-mirrors` for one or more hex.pm mirrors.
Default list is `builds.hex.pm`, so behavior is unaffected unless option is
used.

Signed-off-by: Paul Guyot <pguyot@kallisys.net>

* Implement suggested rewording changes from @paulo-ferraz-oliveira

Co-authored-by: Paulo F. Oliveira <paulo.ferraz.oliveira@gmail.com>
Signed-off-by: Paul Guyot <pguyot@kallisys.net>

---------

Signed-off-by: Paul Guyot <pguyot@kallisys.net>
Co-authored-by: Paulo F. Oliveira <paulo.ferraz.oliveira@gmail.com>
2023-05-04 07:27:05 +01:00
Luke Bakken 9641cb96c1 Be explicit about which file (.bat / .cm) is executed in the Windows installation flow (#198)
In my Windows 11 test environment, using Powershell Core 7.3.4, I get
the following message while running similar code to what this github
action uses:

```
Installed Elixir version follows
InvalidOperation: C:\Users\vagrant\setup-beam\src\test.ps1:4
Line |
   4 |  & "${DIR_FOR_BIN}/bin/elixir" "-v" | Write-Output
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Cannot run a document in the middle of a pipeline: C:\elixir\bin\elixir.
```

Adding `.bat` fixes the issue. This is probably not the root cause of
erlef/setup-beam#189, however.
2023-05-03 10:50:24 +01:00
Eric Meadows-Jönsson 94b8820fed Use @actions/http-client (#195) 2023-05-02 18:40:11 +02:00
64 changed files with 6792 additions and 6207 deletions
+6 -9
View File
@@ -1,21 +1,18 @@
---
env:
node: true
es2021: true
es2022: true
extends:
- airbnb
- eslint:recommended
parserOptions:
ecmaVersion: 12
ecmaVersion: 2022
rules:
indent: ["warn", 2]
max-len: ["warn", 100]
no-console: 0
no-undef: "error"
no-unused-vars: ["error", {"varsIgnorePattern": "^_"}]
indent: [warn, 2, {SwitchCase: 1}]
max-len: [warn, 100]
no-use-before-define: 0
operator-linebreak: 0
require-jsdoc: 0
semi: 0
implicit-arrow-linebreak: 0
settings:
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)
+6 -19
View File
@@ -1,12 +1,7 @@
---
name: action
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize]
on: [push, workflow_dispatch]
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
@@ -19,16 +14,8 @@ jobs:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '14'
- 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
node-version: '16'
- run: npm run build-dist
- name: Check if build left artifacts
run: git diff --exit-code --ignore-space-at-eol
@@ -39,14 +26,14 @@ jobs:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '14'
node-version: '16'
- run: npm ci
- run: npm test
- name: .tool-versions test
id: setup-beam
uses: ./
with:
version-file: __tests__/.tool-versions
version-file: test/.tool-versions
version-type: strict
unit_tests_windows:
@@ -56,6 +43,6 @@ jobs:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '14'
node-version: '16'
- run: npm install --production
- run: npm test
+31
View File
@@ -0,0 +1,31 @@
---
name: hexpm-mirrors
on: [push, workflow_dispatch]
jobs:
test-failing-first-mirror:
name: Test option hexpm-mirrors with a dummy first mirror
runs-on: ${{matrix.os}}
strategy:
fail-fast: false
matrix:
os: ['ubuntu-22.04', 'windows-2022']
otp-version: ['24']
elixir-version: ['v1.14', '']
install-rebar: [true, false]
install-hex: [true, false]
steps:
- uses: actions/checkout@v3
- name: Use erlef/setup-beam
id: setup-beam
uses: ./
with:
otp-version: ${{matrix.otp-version}}
elixir-version: ${{matrix.elixir-version}}
install-rebar: ${{matrix.install-rebar}}
install-hex: ${{matrix.install-hex}}
hexpm-mirrors: |
https://mirror.invalid
https://cdn.jsdelivr.net/hex
https://builds.hex.pm
+16 -15
View File
@@ -1,12 +1,7 @@
---
name: ubuntu
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize]
on: [push, workflow_dispatch]
jobs:
integration_test:
@@ -20,6 +15,14 @@ jobs:
fail-fast: false
matrix:
combo:
- 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'
elixir-version: '1.14.3'
os: 'ubuntu-latest'
@@ -53,7 +56,7 @@ jobs:
os: 'ubuntu-latest'
- elixir-version: 'v1.4'
otp-version: '20'
rebar3-version: '3.6.0'
rebar3-version: '3.15.0'
os: 'ubuntu-20.04'
- elixir-version: 'v1.4'
otp-version: '20'
@@ -103,12 +106,10 @@ jobs:
otp-version: '22.3.4.1'
os: 'ubuntu-20.04'
version-type: 'strict'
- elixir-version: '1.10.3'
otp-version: '22.3.4.1'
os: 'ubuntu-20.04'
- elixir-version: 'master'
- elixir-version: 'main'
otp-version: '23.1'
os: 'ubuntu-20.04'
version-type: 'strict'
- elixir-version: 'main'
otp-version: '25'
os: 'ubuntu-20.04'
@@ -165,23 +166,23 @@ jobs:
if: ${{matrix.combo.elixir-version}}
- name: Run Elixir/Mix project tests
run: |
cd test-projects/elixir_mix
cd test/projects/elixir_mix
mix deps.get
mix test
if: ${{matrix.combo.elixir-version}}
- name: Run Erlang/rebar3 project tests
run: |
cd test-projects/erlang_rebar3
cd test/projects/erlang_rebar3
rebar3 ct
if: ${{matrix.combo.rebar3-version}}
- name: Format Gleam project (without installing Erlang/OTP)
run: |
cd test-projects/gleam_gleam
cd test/projects/gleam_gleam
gleam format
if: ${{ matrix.combo.gleam-version && !matrix.combo.otp-version }}
- name: Run Gleam project tests (without `rebar3`)
run: |
cd test-projects/gleam_gleam
cd test/projects/gleam_gleam
gleam test
if: ${{ matrix.combo.gleam-version && matrix.combo.otp-version && !matrix.combo.rebar3-version }}
- name: Run escript
@@ -1,5 +1,5 @@
---
name: update_3rd_party_licenses
name: Update 3rd party licenses (automation)
on:
schedule:
@@ -12,8 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '14'
- run:
./.github/workflows/update_3rd_party_licenses.sh
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+17 -9
View File
@@ -1,12 +1,7 @@
---
name: windows
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize]
on: [push, workflow_dispatch]
jobs:
integration_test:
@@ -20,6 +15,18 @@ jobs:
fail-fast: false
matrix:
combo:
- 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'
rebar3-version: 'nightly'
os: 'windows-latest'
@@ -61,6 +68,7 @@ jobs:
elixir-version: ${{matrix.combo.elixir-version}}
gleam-version: ${{matrix.combo.gleam-version}}
rebar3-version: ${{matrix.combo.rebar3-version}}
version-type: ${{matrix.combo.version-type}}
- name: Erlang/OTP version (action)
run: echo "Erlang/OTP ${{steps.setup-beam.outputs.otp-version}}"
- name: Elixir version (action)
@@ -79,7 +87,7 @@ jobs:
if: ${{matrix.combo.rebar3-version}}
- name: rebar3 from Rust
run: |
cd test-projects/rust_rebar3_cmd
cd test/projects/rust_rebar3_cmd
cargo test -- --nocapture
if: ${{matrix.combo.rebar3-version}}
- name: mix version and help (CLI)
@@ -90,13 +98,13 @@ jobs:
if: ${{matrix.combo.elixir-version}}
- name: Run Elixir/Mix project tests
run: |
cd test-projects/elixir_mix
cd test/projects/elixir_mix
mix deps.get
mix test
if: ${{matrix.combo.elixir-version}}
- name: Run Erlang/rebar3 project tests
run: |
cd test-projects/erlang_rebar3
cd test/projects/erlang_rebar3
rebar3 ct
if: ${{matrix.combo.rebar3-version}}
- name: Run escript
+1 -1
View File
@@ -1,3 +1,3 @@
node_modules/**
dist/.github/workflows
__tests__/.tool-versions
test/.tool-versions
+1202 -1667
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,6 +1,6 @@
# Elixir Problem Matchers
Elixir Problem Matchers in [elixir-matchers.json](.github/elixir-matchers.json)
Elixir Problem Matchers in [elixir-matchers.json](matchers/elixir-matchers.json)
are adapted from [here](https://github.com/fr1zle/vscode-elixir/blob/45eddb589acd7ac98e0c7305d1c2b24668ca709a/package.json#L70-L118),
available under the [MIT license](https://github.com/fr1zle/vscode-elixir/blob/45eddb589acd7ac98e0c7305d1c2b24668ca709a/LICENSE.md):
+43 -2
View File
@@ -121,7 +121,7 @@ on: push
jobs:
test:
runs-on: ubuntu-latest
runs-on: ubuntu-20.04
name: OTP ${{matrix.otp}} / Elixir ${{matrix.elixir}}
strategy:
matrix:
@@ -145,7 +145,7 @@ on: push
jobs:
test:
runs-on: ubuntu-latest
runs-on: ubuntu-20.04
name: Erlang/OTP ${{matrix.otp}} / rebar3 ${{matrix.rebar3}}
strategy:
matrix:
@@ -216,6 +216,47 @@ jobs:
**Note**: the `otp-version: false` input is only applicable when installing Gleam.
## Alternative hex.pm mirrors
It is possible to use alternative hex.pm mirror(s), in their declared order, with
option `hexpm-mirrors`. By default, the action will use `builds.hex.pm`.
To use other alternative mirrors, add one per line, as shown below.
```yaml
# create this in .github/workflows/ci.yml
on: push
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: erlef/setup-beam@v1
with:
otp-version: '25'
# Use `cdn.jsdelivr.net/hex` as an alternative to `builds.hex.pm`
hexpm-mirrors: https://cdn.jsdelivr.net/hex
```
Alternatively, you may try `cdn.jsdelivr.net/hex` if `builds.hex.pm` fails:
```yaml
# create this in .github/workflows/ci.yml
on: push
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: erlef/setup-beam@v1
with:
otp-version: '25'
hexpm-mirrors: |
https://builds.hex.pm
https://cdn.jsdelivr.net/hex
```
## Environment variables
Base installation folders (useful for e.g. fetching headers for NIFs) are available in the following
+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.
-81
View File
@@ -1,81 +0,0 @@
const assert = require('assert')
const { problemMatcher } = require('../.github/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) => {
console.error(err)
process.exit(1)
})
+4
View File
@@ -45,6 +45,10 @@ inputs:
version-file:
description: a versions file (e.g. as used by `asdf`), which defines inputs
default: ''
hexpm-mirrors:
description: mirror(s) for hex.pm, one per line
default: |
https://builds.hex.pm
outputs:
elixir-version:
description: Exact version of Elixir that was installed
+3461 -394
View File
File diff suppressed because it is too large Load Diff
-24
View File
@@ -1,24 +0,0 @@
param([Parameter(Mandatory=$true)][string]${VSN})
$ErrorActionPreference="Stop"
Set-Location ${Env:RUNNER_TEMP}
$FILE_INPUT="${VSN}.zip"
$FILE_OUTPUT="elixir.zip"
$DIR_FOR_BIN=".setup-beam/elixir"
$ProgressPreference="SilentlyContinue"
Invoke-WebRequest "https://builds.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 Elixir version follows"
& "${DIR_FOR_BIN}/bin/elixir" "-v" | Write-Output
$ProgressPreference="Continue"
New-Item "%UserProfile%/.mix/escripts" -ItemType Directory | Out-Null
"INSTALL_DIR_FOR_ELIXIR=${Env:RUNNER_TEMP}/${DIR_FOR_BIN}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
-20
View File
@@ -1,20 +0,0 @@
#!/bin/bash
set -eo pipefail
cd "${RUNNER_TEMP}"
VSN=${1}
FILE_INPUT="${VSN}.zip"
FILE_OUTPUT=elixir.zip
DIR_FOR_BIN=.setup-beam/elixir
wget -q -O "${FILE_OUTPUT}" "https://builds.hex.pm/builds/elixir/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}"
unzip -q -o -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}"
echo "Installed Elixir version follows"
${DIR_FOR_BIN}/bin/elixir -v
mkdir -p "${HOME}/.mix/escripts"
echo "INSTALL_DIR_FOR_ELIXIR=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
-20
View File
@@ -1,20 +0,0 @@
param([Parameter(Mandatory=$true)][string]${VSN})
$ErrorActionPreference="Stop"
Set-Location ${Env:RUNNER_TEMP}
$FILE_INPUT="otp_win64_${VSN}.exe"
$FILE_OUTPUT="otp.exe"
$DIR_FOR_BIN="${Env:RUNNER_TEMP}\.setup-beam\otp"
$ProgressPreference="SilentlyContinue"
Invoke-WebRequest "https://github.com/erlang/otp/releases/download/OTP-${VSN}/${FILE_INPUT}" -OutFile "${FILE_OUTPUT}"
$ProgressPreference="Continue"
New-Item "${DIR_FOR_BIN}" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue"
Start-Process "${FILE_OUTPUT}" "/S /D=${DIR_FOR_BIN}" -Wait
Write-Output "Installed Erlang/OTP version follows"
& "${DIR_FOR_BIN}/bin/erl.exe" "+V" | Write-Output
"INSTALL_DIR_FOR_OTP=${DIR_FOR_BIN}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
-20
View File
@@ -1,20 +0,0 @@
#!/bin/bash
set -eo pipefail
cd "${RUNNER_TEMP}"
OS=${1}
VSN=${2}
FILE_INPUT="${VSN}.tar.gz"
FILE_OUTPUT=otp.tar.gz
DIR_FOR_BIN=.setup-beam/otp
wget -q -O "${FILE_OUTPUT}" "https://builds.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 "Installed Erlang/OTP version follows"
${DIR_FOR_BIN}/bin/erl -version
echo "INSTALL_DIR_FOR_OTP=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
+1 -1
View File
@@ -27,6 +27,6 @@ Write-Output "@echo off`r`nescript.exe ${PWD}/${DIR_FOR_BIN}/bin/${FILE_OUTPUT}
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" "version" | Write-Output
& "${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
+62
View File
@@ -0,0 +1,62 @@
{
"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
}
]
}
]
}
+1004 -3390
View File
File diff suppressed because it is too large Load Diff
+13 -21
View File
@@ -4,36 +4,28 @@
"private": true,
"scripts": {
"build": "ncc build src/setup-beam.js --no-cache",
"format": "prettier src/**/*.js --write && prettier __tests__/**/*.js --write",
"jslint": "eslint src/**/*.js && eslint __tests__/**/*.js",
"format": "prettier src/**/*.js --write && prettier test/**/*.js --write",
"jslint": "eslint src/**/*.js && eslint test/**/*.js",
"licenses": "yarn licenses generate-disclaimer > 3RD_PARTY_LICENSES",
"markdownlint": "markdownlint *.md",
"shellcheck": "shellcheck src/install-*.sh .github/workflows/*.sh",
"test": "node __tests__/setup-beam.test.js && node ./__tests__/problem-matchers.test.js",
"markdownlint": "markdownlint *.md ./github/**/*.md",
"shellcheck": "shellcheck .github/workflows/*.sh",
"test": "node test/setup-beam.test.js",
"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"
},
"husky": {
"hooks": {
"pre-commit": "npm run format -- --check && npm run build && git add dist/"
}
},
"dependencies": {
"@actions/core": "1.10.0",
"@actions/exec": "1.1.1",
"semver": "7.3.8"
"@actions/http-client": "2.1.0",
"@actions/tool-cache": "2.0.1",
"semver": "7.5.3"
},
"devDependencies": {
"@vercel/ncc": "0.34.0",
"eslint": "8.25.0",
"eslint-config-airbnb": "19.0.4",
"eslint-plugin-import": "2.26.0",
"eslint-plugin-jsx-a11y": "6.6.1",
"eslint-plugin-react": "7.31.10",
"husky": "8.0.1",
"markdownlint": "0.26.2",
"prettier": "2.7.1",
"shellcheck": "1.1.0",
"@vercel/ncc": "0.36.1",
"eslint": "8.43.0",
"markdownlint-cli": "0.35.0",
"prettier": "2.8.8",
"shellcheck": "2.2.0",
"yaml-lint": "1.7.0",
"yarn": "1.22.19"
},
-24
View File
@@ -1,24 +0,0 @@
param([Parameter(Mandatory=$true)][string]${VSN})
$ErrorActionPreference="Stop"
Set-Location ${Env:RUNNER_TEMP}
$FILE_INPUT="${VSN}.zip"
$FILE_OUTPUT="elixir.zip"
$DIR_FOR_BIN=".setup-beam/elixir"
$ProgressPreference="SilentlyContinue"
Invoke-WebRequest "https://builds.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 Elixir version follows"
& "${DIR_FOR_BIN}/bin/elixir" "-v" | Write-Output
$ProgressPreference="Continue"
New-Item "%UserProfile%/.mix/escripts" -ItemType Directory | Out-Null
"INSTALL_DIR_FOR_ELIXIR=${Env:RUNNER_TEMP}/${DIR_FOR_BIN}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
-20
View File
@@ -1,20 +0,0 @@
#!/bin/bash
set -eo pipefail
cd "${RUNNER_TEMP}"
VSN=${1}
FILE_INPUT="${VSN}.zip"
FILE_OUTPUT=elixir.zip
DIR_FOR_BIN=.setup-beam/elixir
wget -q -O "${FILE_OUTPUT}" "https://builds.hex.pm/builds/elixir/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}"
unzip -q -o -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}"
echo "Installed Elixir version follows"
${DIR_FOR_BIN}/bin/elixir -v
mkdir -p "${HOME}/.mix/escripts"
echo "INSTALL_DIR_FOR_ELIXIR=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
-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}"
-20
View File
@@ -1,20 +0,0 @@
param([Parameter(Mandatory=$true)][string]${VSN})
$ErrorActionPreference="Stop"
Set-Location ${Env:RUNNER_TEMP}
$FILE_INPUT="otp_win64_${VSN}.exe"
$FILE_OUTPUT="otp.exe"
$DIR_FOR_BIN="${Env:RUNNER_TEMP}\.setup-beam\otp"
$ProgressPreference="SilentlyContinue"
Invoke-WebRequest "https://github.com/erlang/otp/releases/download/OTP-${VSN}/${FILE_INPUT}" -OutFile "${FILE_OUTPUT}"
$ProgressPreference="Continue"
New-Item "${DIR_FOR_BIN}" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue"
Start-Process "${FILE_OUTPUT}" "/S /D=${DIR_FOR_BIN}" -Wait
Write-Output "Installed Erlang/OTP version follows"
& "${DIR_FOR_BIN}/bin/erl.exe" "+V" | Write-Output
"INSTALL_DIR_FOR_OTP=${DIR_FOR_BIN}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
-20
View File
@@ -1,20 +0,0 @@
#!/bin/bash
set -eo pipefail
cd "${RUNNER_TEMP}"
OS=${1}
VSN=${2}
FILE_INPUT="${VSN}.tar.gz"
FILE_OUTPUT=otp.tar.gz
DIR_FOR_BIN=.setup-beam/otp
wget -q -O "${FILE_OUTPUT}" "https://builds.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 "Installed Erlang/OTP version follows"
${DIR_FOR_BIN}/bin/erl -version
echo "INSTALL_DIR_FOR_OTP=${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" "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}"
-79
View File
@@ -1,79 +0,0 @@
const { exec } = require('@actions/exec')
const path = require('path')
/**
* Install Erlang/OTP.
*
* @param {string} osVersion
* @param {string} otpVersion
*/
async function installOTP(osVersion, otpVersion) {
const OS = process.platform
if (OS === 'linux') {
await exec(path.join(__dirname, 'install-otp.sh'), [osVersion, otpVersion])
} else if (OS === 'win32') {
const script = path.join(__dirname, 'install-otp.ps1')
await exec(`pwsh.exe ${script} -VSN:${otpVersion}`)
}
}
/**
* Install Elixir.
*
* @param {string} elixirVersion
*/
async function installElixir(elixirVersion) {
const OS = process.platform
if (OS === 'linux') {
await exec(path.join(__dirname, 'install-elixir.sh'), [elixirVersion])
} else if (OS === 'win32') {
const script = path.join(__dirname, 'install-elixir.ps1')
await exec(`pwsh.exe ${script} -VSN:${elixirVersion}`)
}
}
/**
* 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,
}
+603 -167
View File
File diff suppressed because it is too large Load Diff
@@ -4,11 +4,13 @@ simulateInput('rebar3-version', '3.20')
simulateInput('install-rebar', 'true')
simulateInput('install-hex', 'true')
simulateInput('github-token', process.env.GITHUB_TOKEN)
simulateInput('hexpm-mirrors', 'https://builds.hex.pm', { multiline: true })
const assert = require('assert')
const fs = require('fs')
const core = require('@actions/core')
const setupBeam = require('../src/setup-beam')
const installer = require('../src/installer')
const { problemMatcher } = require('../matchers/elixir-matchers.json')
async function all() {
await testFailInstallOTP()
@@ -24,6 +26,11 @@ async function all() {
await testGetVersionFromSpec()
await testParseVersionFile()
await testElixirMixCompileError()
await testElixirMixCompileWarning()
await testElixirMixTestFailure()
await testElixirCredoOutputDefault()
}
async function testFailInstallOTP() {
@@ -31,7 +38,11 @@ async function testFailInstallOTP() {
const otpVersion = 'OTP-23.2'
assert.rejects(
async () => {
await installer.installOTP(otpOSVersion, otpVersion)
await setupBeam.install('otp', {
hexMirror: 'https://builds.hex.pm',
otpOSVersion,
otpVersion,
})
},
(err) => {
assert.ok(err instanceof Error)
@@ -47,7 +58,10 @@ async function testFailInstallElixir() {
exVersion = '0.11'
assert.rejects(
async () => {
await installer.installElixir(exVersion)
await setupBeam.install('elixir', {
hexMirror: 'https://builds.hex.pm',
exVersion,
})
},
(err) => {
assert.ok(err instanceof Error)
@@ -59,7 +73,10 @@ async function testFailInstallElixir() {
exVersion = 'v1.0.0-otp-17'
assert.rejects(
async () => {
await installer.installElixir(exVersion)
await setupBeam.install('elixir', {
hexMirror: 'https://builds.hex.pm',
exVersion,
})
},
(err) => {
assert.ok(err instanceof Error)
@@ -73,7 +90,7 @@ async function testFailInstallGleam() {
const gleamVersion = '0.1.3'
assert.rejects(
async () => {
await installer.installGleam(gleamVersion)
await setupBeam.install('gleam', { gleamVersion })
},
(err) => {
assert.ok(err instanceof Error)
@@ -87,7 +104,7 @@ async function testFailInstallRebar3() {
const r3Version = '0.14.4'
assert.rejects(
async () => {
await installer.installRebar3(r3Version)
await setupBeam.install('rebar3', { r3Version })
},
(err) => {
assert.ok(err instanceof Error)
@@ -102,8 +119,22 @@ async function testOTPVersions() {
let expected
let spec
let osVersion
let before
const hexMirrors = simulateInput(
'hexpm-mirrors',
'https://repo.hex.pm, https://cdn.jsdelivr.net/hex',
{ multiline: true },
)
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'
osVersion = 'ubuntu-16.04'
expected = 'OTP-19.3.6.13'
@@ -128,6 +159,12 @@ async function testOTPVersions() {
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)
assert.deepStrictEqual(got, expected)
spec = '20.x'
osVersion = 'ubuntu-20.04'
expected = 'OTP-20.3.8.26'
@@ -166,6 +203,8 @@ async function testOTPVersions() {
got = await setupBeam.getOTPVersion(spec, osVersion)
assert.deepStrictEqual(got, expected)
}
simulateInput('hexpm-mirrors', hexMirrors, { multiline: true })
}
async function testElixirVersions() {
@@ -173,6 +212,10 @@ async function testElixirVersions() {
let expected
let spec
let otpVersion
let before
const hexMirrors = simulateInput('hexpm-mirrors', 'https://repo.hex.pm', {
multiline: true,
})
spec = '1.1.x'
otpVersion = 'OTP-17'
@@ -192,37 +235,47 @@ async function testElixirVersions() {
got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'strict')
before = simulateInput('version-type', 'strict')
spec = '1.14.0'
otpVersion = 'master'
otpVersion = 'main'
expected = 'v1.14.0'
got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose')
simulateInput('version-type', before)
simulateInput('version-type', 'strict')
before = 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')
simulateInput('version-type', before)
simulateInput('version-type', 'strict')
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)
simulateInput('version-type', before)
before = simulateInput('version-type', 'strict')
spec = 'v1.11.0'
otpVersion = '22.3.4.2'
expected = 'v1.11.0-otp-22'
got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose')
simulateInput('version-type', before)
simulateInput('version-type', 'strict')
before = simulateInput('version-type', 'strict')
spec = 'main'
otpVersion = '23.1'
expected = 'main-otp-23'
got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose')
simulateInput('version-type', before)
simulateInput('hexpm-mirrors', hexMirrors, { multiline: true })
}
async function testGleamVersions() {
@@ -243,13 +296,13 @@ async function testGleamVersions() {
got = await setupBeam.getGleamVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'strict')
const before = simulateInput('version-type', 'strict')
spec = 'v0.14.0-rc2'
otpVersion = 'OTP-22'
expected = 'v0.14.0-rc2'
got = await setupBeam.getGleamVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose')
simulateInput('version-type', before)
}
async function testRebar3Versions() {
@@ -277,7 +330,8 @@ async function testGetVersionFromSpec() {
let got
let expected
let spec
const versions = [
let before
const versions0 = [
'3.2.30.5',
'3.2.3.5',
'1',
@@ -303,10 +357,20 @@ async function testGetVersionFromSpec() {
'22.3.4.9.1',
'22.3.4.12.1',
'22.3.4.10.1',
'master',
'v11.11.0-rc.0-otp-23',
'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'
expected = '1.1.0'
@@ -318,19 +382,19 @@ async function testGetVersionFromSpec() {
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'strict')
before = simulateInput('version-type', 'strict')
spec = '1'
expected = '1'
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose')
simulateInput('version-type', before)
simulateInput('version-type', 'strict')
before = simulateInput('version-type', 'strict')
spec = '1.0'
expected = '1.0'
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose')
simulateInput('version-type', before)
spec = '2'
expected = '2.10'
@@ -357,12 +421,12 @@ async function testGetVersionFromSpec() {
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'strict')
before = 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')
simulateInput('version-type', before)
spec = '24.0-rc2'
expected = '24.0-rc2'
@@ -389,24 +453,51 @@ async function testGetVersionFromSpec() {
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'strict')
spec = 'master'
expected = 'master'
before = simulateInput('version-type', 'strict')
spec = 'main'
expected = 'main'
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose')
simulateInput('version-type', before)
spec = 'master'
expected = 'master'
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'strict')
before = simulateInput('version-type', 'strict')
spec = '22.3.4.2'
expected = '22.3.4.2'
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose')
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')
spec = '22.3.4.3'
expected = null
got = setupBeam.getVersionFromSpec(spec, versions)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', before)
}
async function testParseVersionFile() {
@@ -420,12 +511,12 @@ async function testParseVersionFile() {
const gleam = '0.23.0'
const rebar3 = '3.16.0'
const toolVersions = `# a comment
erlang ${erlang}# comment, no space
elixir ${elixir} # comment, with space
erlang ref:v${erlang}# comment, no space, and ref:v
elixir ref:${elixir} # comment, with space and ref:
not-gleam 0.23 # not picked up
gleam ${gleam}
rebar ${rebar3}`
const filename = '__tests__/.tool-versions'
const filename = 'test/.tool-versions'
fs.writeFileSync(filename, toolVersions)
process.env.GITHUB_WORKSPACE = ''
const appVersions = setupBeam.parseVersionFile(filename)
@@ -433,16 +524,16 @@ rebar ${rebar3}`
assert.strictEqual(appVersions.get('elixir'), elixir)
assert.ok(async () => {
await installer.installOTP(erlang)
await setupBeam.install('otp', { toolVersion: erlang })
})
assert.ok(async () => {
await installer.installElixir(elixir)
await setupBeam.install('elixir', { toolVersion: elixir })
})
assert.ok(async () => {
await installer.installGleam(gleam)
await setupBeam.install('gleam', { toolVersion: gleam })
})
assert.ok(async () => {
await installer.installRebar3(rebar3)
await setupBeam.install('rebar3', { toolVersion: rebar3 })
})
simulateInput('otp-version', otpVersion)
@@ -451,14 +542,88 @@ rebar ${rebar3}`
simulateInput('rebar3-version', rebar3Version)
}
function unsimulateInput(key) {
const before = process.env[input(key)]
simulateInput(key, '')
return before
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)
}
function simulateInput(key, value) {
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) {
return simulateInput(key, '')
}
function simulateInput(key, value0, opts) {
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
return before
}
function input(key) {
@@ -468,6 +633,6 @@ function input(key) {
all()
.then(() => process.exit(0))
.catch((err) => {
console.error(err)
core.error(err)
process.exit(1)
})