Compare commits

...

16 Commits

Author SHA1 Message Date
Paulo F. Oliveira 730ac65cba Fix failing CI (#87) 2022-01-12 18:22:12 +00:00
Michał Łępicki 3179686d1f Make OTP installation optional (#81) 2022-01-12 14:26:44 +00:00
Paulo F. Oliveira 65219deb69 Prevent deprecation warnings (#83) 2022-01-12 14:25:57 +00:00
Paulo F. Oliveira c71c5c91bb Allow using rebar3 nightly builds (#84) 2022-01-12 14:25:40 +00:00
Paulo F. Oliveira e6ab31075d Allow disabling problem matchers (#85) 2022-01-12 11:41:23 +00:00
Paulo F. Oliveira 3250a83e5a Automate updating 3rd party licenses (#82) 2022-01-12 11:40:11 +00:00
Bryan Paxton ccc3fdea3c Update third party licenses (#86) 2022-01-11 14:47:37 +00:00
Jason Axelson 782d47cc60 Mention what problem matchers do in the README (#75)
Otherwise it is difficult to know that the erlef/setup-beam matchers are
what is creating the warning/error annotations on PR's
2021-12-18 19:24:24 -06:00
Paulo F. Oliveira c255c7e97f Fix CI as per failure in main (action.yml) (#71)
* Fix CI as per failure in main (action.yml)

* Apply Dependabot alert from GitHub security alert digest

* Keep up with Node.js

* Run action.yml on Node 14 (locally)
2021-09-07 04:15:25 +01:00
Wojtek Mach 988e02bfe6 Update dist/ 2021-08-19 12:31:27 +02:00
Wojtek Mach 8a644c6f28 Use elixir executable to print the version, closes #70 2021-08-19 12:28:30 +02:00
Paulo F. Oliveira c988d89031 Add Gleam (#67) 2021-08-03 18:56:12 +01:00
Blake Kostner 4fbbcf2e6c Add Elixir/credo and Elixir/dialyzer problem matchers (#65) 2021-07-27 22:43:22 +01:00
Blake Kostner bae9638cba Add tests for github actions problem matchers (#64) 2021-07-27 17:50:40 +01:00
Paulo F. Oliveira 14d4bc3919 Ease debugging around ImageOS env.var (#63) 2021-07-26 17:30:18 +01:00
Bryan Paxton ade4f1d567 Don't preprend v when elixir version does not start with digits (#61) 2021-07-20 14:08:24 -05:00
60 changed files with 2802 additions and 711 deletions
+32
View File
@@ -41,6 +41,38 @@
"line": 2 "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
}
]
},
{
"owner": "elixir-dialyzerOutputDefault",
"severity": "warning",
"pattern": [
{
"regexp": "^(.*):(\\d+):(.*)",
"file": 1,
"line": 2,
"code": 3
},
{
"regexp": "^(.*)$",
"message": 1
}
]
} }
] ]
} }
+3 -3
View File
@@ -17,7 +17,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions/setup-node@v1 - uses: actions/setup-node@v1
with: with:
node-version: 12 node-version: '14'
- run: npm install -g npm - run: npm install -g npm
- run: npm install - run: npm install
- run: npm run build - run: npm run build
@@ -38,7 +38,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions/setup-node@v1 - uses: actions/setup-node@v1
with: with:
node-version: 12 node-version: '14'
- run: npm ci - run: npm ci
- run: npm test - run: npm test
@@ -49,6 +49,6 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions/setup-node@v1 - uses: actions/setup-node@v1
with: with:
node-version: 12 node-version: '14'
- run: npm install --production - run: npm install --production
- run: npm test - run: npm test
+41 -30
View File
@@ -14,36 +14,26 @@ jobs:
name: > name: >
OTP ${{matrix.combo.otp-version}}, OTP ${{matrix.combo.otp-version}},
Elixir ${{matrix.combo.elixir-version}}, Elixir ${{matrix.combo.elixir-version}},
Gleam ${{matrix.combo.gleam-version}},
rebar3 ${{matrix.combo.rebar3-version}} rebar3 ${{matrix.combo.rebar3-version}}
runs-on: ${{matrix.combo.os}} runs-on: ${{matrix.combo.os}}
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
combo: combo:
- elixir-version: 'v1.0' - otp-version: '24'
otp-version: '17' rebar3-version: 'nightly'
os: 'ubuntu-16.04' os: 'ubuntu-latest'
- elixir-version: 'v1.0' - elixir-version: 'v1.0'
otp-version: '17' otp-version: '17'
os: 'ubuntu-18.04' os: 'ubuntu-18.04'
- elixir-version: 'v1.1'
otp-version: '18'
os: 'ubuntu-16.04'
- elixir-version: 'v1.1' - elixir-version: 'v1.1'
otp-version: '18' otp-version: '18'
os: 'ubuntu-18.04' os: 'ubuntu-18.04'
- elixir-version: 'v1.2'
otp-version: '19'
rebar3-version: '3.10'
os: 'ubuntu-16.04'
- elixir-version: 'v1.2' - elixir-version: 'v1.2'
otp-version: '19' otp-version: '19'
rebar3-version: '3.10' rebar3-version: '3.10'
os: 'ubuntu-18.04' os: 'ubuntu-18.04'
- elixir-version: 'v1.4'
otp-version: '20'
rebar3-version: '3.11'
os: 'ubuntu-16.04'
- elixir-version: 'v1.4' - elixir-version: 'v1.4'
otp-version: '20' otp-version: '20'
rebar3-version: '3.6.0' rebar3-version: '3.6.0'
@@ -52,10 +42,6 @@ jobs:
otp-version: '20' otp-version: '20'
rebar3-version: '3.11' rebar3-version: '3.11'
os: 'ubuntu-20.04' os: 'ubuntu-20.04'
- elixir-version: 'v1.6'
otp-version: '21'
rebar3-version: '3.12'
os: 'ubuntu-16.04'
- elixir-version: 'v1.6' - elixir-version: 'v1.6'
otp-version: '21' otp-version: '21'
rebar3-version: '3.12' rebar3-version: '3.12'
@@ -64,10 +50,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.7'
otp-version: '22'
rebar3-version: '3.13'
os: 'ubuntu-16.04'
- elixir-version: 'v1.7' - elixir-version: 'v1.7'
otp-version: '22' otp-version: '22'
rebar3-version: '3.13' rebar3-version: '3.13'
@@ -76,10 +58,6 @@ jobs:
otp-version: '22' otp-version: '22'
rebar3-version: '3.13' rebar3-version: '3.13'
os: 'ubuntu-20.04' os: 'ubuntu-20.04'
- elixir-version: 'v1.10'
otp-version: '23'
rebar3-version: '3.14'
os: 'ubuntu-16.04'
- elixir-version: 'v1.10' - elixir-version: 'v1.10'
otp-version: '23' otp-version: '23'
rebar3-version: '3.14' rebar3-version: '3.14'
@@ -103,6 +81,19 @@ jobs:
- elixir-version: '1.10.3' - elixir-version: '1.10.3'
otp-version: '22.3.4.1' otp-version: '22.3.4.1'
os: 'ubuntu-20.04' os: 'ubuntu-20.04'
- elixir-version: 'master'
otp-version: '23.1'
os: 'ubuntu-20.04'
- gleam-version: '0.16'
otp-version: '24'
rebar3-version: '3.16'
os: 'ubuntu-latest'
- gleam-version: '0.19.0-rc3'
otp-version: '24'
os: 'ubuntu-latest'
- gleam-version: '0.19.0-rc3'
otp-version: false
os: 'ubuntu-latest'
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Use erlef/setup-beam - name: Use erlef/setup-beam
@@ -111,13 +102,18 @@ jobs:
with: with:
otp-version: ${{matrix.combo.otp-version}} otp-version: ${{matrix.combo.otp-version}}
elixir-version: ${{matrix.combo.elixir-version}} elixir-version: ${{matrix.combo.elixir-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}} 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}}"
if: ${{matrix.combo.otp-version}}
- name: Elixir version (action) - name: Elixir version (action)
run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}" run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}"
if: ${{matrix.combo.elixir-version}} if: ${{matrix.combo.elixir-version}}
- name: Gleam version (action)
run: echo "Gleam ${{steps.setup-beam.outputs.gleam-version}}"
if: ${{matrix.combo.gleam-version}}
- name: rebar3 version (action) - name: rebar3 version (action)
run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}" run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}"
if: ${{matrix.combo.rebar3-version}} if: ${{matrix.combo.rebar3-version}}
@@ -127,14 +123,29 @@ jobs:
mix help local.rebar mix help local.rebar
mix help local.hex mix help local.hex
if: ${{matrix.combo.elixir-version}} if: ${{matrix.combo.elixir-version}}
- name: Run Mix project tests - name: Run Elixir/Mix project tests
run: | run: |
cd test-projects/mix cd test-projects/elixir_mix
mix deps.get mix deps.get
mix test mix test
if: ${{matrix.combo.elixir-version}} if: ${{matrix.combo.elixir-version}}
- name: Run rebar3 project tests - name: Run Erlang/rebar3 project tests
run: | run: |
cd test-projects/rebar3 cd test-projects/erlang_rebar3
rebar3 ct rebar3 ct
if: ${{matrix.combo.rebar3-version}} if: ${{matrix.combo.rebar3-version}}
- name: Run Gleam/rebar3 project tests
run: |
cd test-projects/gleam_rebar3
rebar3 eunit
if: ${{matrix.combo.gleam-version}}
- name: Type check Gleam project (without installing Erlang/OTP)
run: |
cd test-projects/gleam_gleam
gleam check
if: ${{ matrix.combo.gleam-version && !matrix.combo.otp-version }}
- name: Run Gleam project tests (without `rebar3`)
run: |
cd test-projects/gleam_gleam
gleam test
if: ${{ matrix.combo.gleam-version && matrix.combo.otp-version && !matrix.combo.rebar3-version }}
+13
View File
@@ -0,0 +1,13 @@
#!/usr/bin/env bash
set -eux
git config user.name "GitHub Actions"
git config user.email "actions@user.noreply.github.com"
git checkout main
npm run licenses
git add 3RD_PARTY_LICENSES
git commit -m "Update 3rd party licenses" || true
git push origin
@@ -0,0 +1,19 @@
---
name: update_3rd_party_licenses
on:
schedule:
- cron: '0 12 * * *'
workflow_dispatch:
jobs:
update:
name: Update 3rd party licenses
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: '14'
- run:
./.github/workflows/update_3rd_party_licenses.sh
+21 -22
View File
@@ -14,6 +14,7 @@ jobs:
name: > name: >
OTP ${{matrix.combo.otp-version}}, OTP ${{matrix.combo.otp-version}},
Elixir ${{matrix.combo.elixir-version}}, Elixir ${{matrix.combo.elixir-version}},
Gleam ${{matrix.combo.gleam-version}},
rebar3 ${{matrix.combo.rebar3-version}} rebar3 ${{matrix.combo.rebar3-version}}
runs-on: ${{matrix.combo.os}} runs-on: ${{matrix.combo.os}}
strategy: strategy:
@@ -23,27 +24,12 @@ jobs:
- otp-version: '24.0.2' - otp-version: '24.0.2'
rebar3-version: '3.16' rebar3-version: '3.16'
os: 'windows-2019' os: 'windows-2019'
- otp-version: '24.0.2'
rebar3-version: 'nightly'
os: 'windows-2019'
- otp-version: '23.0' - otp-version: '23.0'
rebar3-version: '3.15' rebar3-version: '3.15'
os: 'windows-2019' os: 'windows-2019'
- otp-version: '24.0.2'
rebar3-version: '3.16'
os: 'windows-2016'
- otp-version: '23.0'
rebar3-version: '3.15'
os: 'windows-2016'
- otp-version: '22.3'
rebar3-version: '3.15'
os: 'windows-2016'
- otp-version: '22.0'
rebar3-version: '3.15'
os: 'windows-2016'
- otp-version: '21.3'
rebar3-version: '3.15'
os: 'windows-2016'
- otp-version: '21.0'
rebar3-version: '3.15'
os: 'windows-2016'
- elixir-version: 'v1.10' - elixir-version: 'v1.10'
otp-version: '23' otp-version: '23'
rebar3-version: '3.14' rebar3-version: '3.14'
@@ -52,6 +38,10 @@ jobs:
otp-version: '24' otp-version: '24'
rebar3-version: '3.15' rebar3-version: '3.15'
os: 'windows-latest' os: 'windows-latest'
- gleam-version: '0.16'
otp-version: '24'
rebar3-version: '3.16'
os: 'windows-latest'
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Use erlef/setup-beam - name: Use erlef/setup-beam
@@ -60,12 +50,16 @@ jobs:
with: with:
otp-version: ${{matrix.combo.otp-version}} otp-version: ${{matrix.combo.otp-version}}
elixir-version: ${{matrix.combo.elixir-version}} elixir-version: ${{matrix.combo.elixir-version}}
gleam-version: ${{matrix.combo.gleam-version}}
rebar3-version: ${{matrix.combo.rebar3-version}} rebar3-version: ${{matrix.combo.rebar3-version}}
- 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)
run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}" run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}"
if: ${{matrix.combo.elixir-version}} if: ${{matrix.combo.elixir-version}}
- name: Gleam version (action)
run: echo "Gleam ${{steps.setup-beam.outputs.gleam-version}}"
if: ${{matrix.combo.gleam-version}}
- name: rebar3 version (action) - name: rebar3 version (action)
run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}" run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}"
- name: mix version and help (CLI) - name: mix version and help (CLI)
@@ -74,14 +68,19 @@ jobs:
mix help local.rebar mix help local.rebar
mix help local.hex mix help local.hex
if: ${{matrix.combo.elixir-version}} if: ${{matrix.combo.elixir-version}}
- name: Run Mix project tests - name: Run Elixir/Mix project tests
run: | run: |
cd test-projects/mix cd test-projects/elixir_mix
mix deps.get mix deps.get
mix test mix test
if: ${{matrix.combo.elixir-version}} if: ${{matrix.combo.elixir-version}}
- name: Run rebar3 project tests - name: Run Erlang/rebar3 project tests
run: | run: |
cd test-projects/rebar3 cd test-projects/erlang_rebar3
rebar3 ct rebar3 ct
if: ${{matrix.combo.rebar3-version}} if: ${{matrix.combo.rebar3-version}}
- name: Run Gleam/rebar3 project tests
run: |
cd test-projects/gleam_rebar3
rebar3 eunit
if: ${{matrix.combo.gleam-version}}
+1575 -35
View File
File diff suppressed because it is too large Load Diff
+60 -57
View File
@@ -11,26 +11,30 @@
This action sets up an Erlang/OTP environment for use in a GitHub Actions This action sets up an Erlang/OTP environment for use in a GitHub Actions
workflow by: workflow by:
- installing Erlang/OTP - installing [Erlang/OTP](https://www.erlang.org/)
- optionally, installing Elixir - optionally, installing [Elixir](https://elixir-lang.org/)
- optionally, installing `rebar3` - optionally, installing [Gleam](https://gleam.run/)
- optionally, installing `hex` - optionally, installing [`rebar3`](https://www.rebar3.org/)
- optionally, installing [`hex`](https://hex.pm/)
- optionally, having
[problem matchers](https://github.com/actions/toolkit/blob/main/docs/problem-matchers.md) show
warnings and errors on pull requestsotp-version: false)
**Note** Currently, this action only supports Actions' `ubuntu-` and `windows-` runtimes. **Note**: currently, this action only supports Actions' `ubuntu-` and `windows-` runtimes.
## Usage ## Usage
See [action.yml](action.yml) for the action's specification. See [action.yml](action.yml) for the action's specification.
**Note**: The Erlang/OTP release version specification is [relatively **Note**: the Erlang/OTP release version specification is [relatively
complex](http://erlang.org/doc/system_principles/versions.html#version-scheme). complex](http://erlang.org/doc/system_principles/versions.html#version-scheme).
For best results, we recommend specifying exact Erlang/OTP, Elixir versions, and For best results, we recommend specifying exact
`rebar3` versions, and setting option `version-type` to `strict`. versions, and setting option `version-type` to `strict`.
However, values like `22.x`, or even `>22`, are also accepted, and we attempt to resolve them However, values like `22.x`, or even `>22`, are also accepted, and we attempt to resolve them
according to semantic versioning rules. This implicitly means `version-type` is `loose`, according to semantic versioning rules. This implicitly means `version-type` is `loose`,
which is also the default value for this option. which is also the default value for this option.
Additionally, it is recommended that one specifies Erlang/OTP, Elixir and `rebar3` versions Additionally, it is recommended that one specifies versions
using YAML strings, as these examples do, so that numbers like `23.0` don't using YAML strings, as these examples do, so that numbers like `23.0` don't
end up being parsed as `23`, which is not equivalent. end up being parsed as `23`, which is not equivalent.
@@ -45,10 +49,8 @@ and Erlang/OTP.
| Operating system | Erlang/OTP | Status | Operating system | Erlang/OTP | Status
|- |- |- |- |- |-
| ubuntu-16.04 | 17 - 24 | ✅
| ubuntu-18.04 | 17 - 24 | ✅ | ubuntu-18.04 | 17 - 24 | ✅
| ubuntu-20.04 | 20 - 24 | ✅ | ubuntu-20.04 | 20 - 24 | ✅
| windows-2016 | 21* - 24 | ✅
| windows-2019 | 21* - 24 | ✅ | windows-2019 | 21* - 24 | ✅
**Note** *: prior to 23, Windows builds are only available for minor versions, e.g. 21.0, 21.3, 22.0, etc. **Note** *: prior to 23, Windows builds are only available for minor versions, e.g. 21.0, 21.3, 22.0, etc.
@@ -60,10 +62,8 @@ uses that to download assets:
| ImageOS | Operating system | ImageOS | Operating system
|- |- |- |-
| ubuntu16 | ubuntu-16.04
| ubuntu18 | ubuntu-18.04 | ubuntu18 | ubuntu-18.04
| ubuntu20 | ubuntu-20.04 | ubuntu20 | ubuntu-20.04
| win16 | windows-2016
| win19 | windows-2019 | win19 | windows-2019
as per the following example: as per the following example:
@@ -82,44 +82,7 @@ jobs:
... ...
``` ```
### Basic example (Erlang/OTP + Elixir, on Ubuntu) ### Example (Erlang/OTP + Elixir, on Ubuntu)
```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: '22.2'
elixir-version: '1.9.4'
- run: mix deps.get
- run: mix test
```
### Basic example (Erlang/OTP + `rebar3`, on Ubuntu)
```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: '22.2'
rebar3-version: '3.14.2'
- run: rebar3 ct
```
### Matrix example (Erlang/OTP + Elixir, on Ubuntu)
```yaml ```yaml
# create this in .github/workflows/ci.yml # create this in .github/workflows/ci.yml
@@ -143,7 +106,7 @@ jobs:
- run: mix test - run: mix test
``` ```
### Matrix example (Erlang/OTP + `rebar3`, on Ubuntu) ### Example (Erlang/OTP + `rebar3`, on Ubuntu)
```yaml ```yaml
# create this in .github/workflows/ci.yml # create this in .github/workflows/ci.yml
@@ -166,7 +129,7 @@ jobs:
- run: rebar3 ct - run: rebar3 ct
``` ```
### Basic example (Erlang/OTP + `rebar3`, on Windows) ### Example (Erlang/OTP + `rebar3`, on Windows)
```yaml ```yaml
# create this in .github/workflows/ci.yml # create this in .github/workflows/ci.yml
@@ -184,9 +147,49 @@ jobs:
- run: rebar3 ct - run: rebar3 ct
``` ```
### Example (Gleam on Ubuntu)
```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: '24'
gleam-version: '0.19.0-rc3'
- run: gleam test
```
### Example (Gleam on Ubuntu without OTP)
```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: false
gleam-version: '0.19.0-rc3'
- run: gleam check
```
**Note**: the `otp-version: false` input is only applicable when installing Gleam.
## Elixir Problem Matchers ## Elixir Problem Matchers
The Elixir Problem Matchers in this repository are adapted from [here](https://github.com/fr1zle/vscode-elixir/blob/45eddb589acd7ac98e0c7305d1c2b24668ca709a/package.json#L70-L118). See [MATCHER_NOTICE](MATCHER_NOTICE.md) for license details. The Elixir Problem Matchers in this repository are adapted from
[here](https://github.com/fr1zle/vscode-elixir/blob/45eddb589acd7ac98e0c7305d1c2b24668ca709a/package.json#L70-L118).
See [MATCHER_NOTICE](MATCHER_NOTICE.md) for license details.
## Action versioning ## Action versioning
@@ -196,9 +199,9 @@ The Elixir Problem Matchers in this repository are adapted from [here](https://g
- `@v1.8`: the latest in the `1.8.z` series (this tag is movable), - `@v1.8`: the latest in the `1.8.z` series (this tag is movable),
- `@v1.8.0`: release `1.8.0` (this tag is not movable). - `@v1.8.0`: release `1.8.0` (this tag is not movable).
To prevent issues in CI (unless you're OK with potential incompatibility between versions - we We make a real effort to not introduce incompatibilities without changing the major
make real a effort to not introduce those without bumping major) we suggest you to use `@vx.y.z`, version number. To be extra safe against changes causing issues in your CI you should specify
whenever possible. an exact version with `@vx.y.z`.
## License ## License
+100
View File
@@ -0,0 +1,100 @@
const assert = require('assert')
const { problemMatcher } = require('../.github/elixir-matchers.json')
async function all() {
await testElixirMixCompileError()
await testElixirMixCompileWarning()
await testElixirMixTestFailure()
await testElixirCredoOutputDefault()
await testElixirDialyzerOutputDefault()
}
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')
}
async function testElixirDialyzerOutputDefault() {
const [messagePattern, filePattern] = problemMatcher.find(
({ owner }) => owner === 'elixir-dialyzerOutputDefault',
).pattern
const firstOutput = 'lib/test.ex:15:invalid_contract'
const secondOutput =
'The @spec for the function does not match the success typing of the function.'
const [, file, line, code] = firstOutput.match(messagePattern.regexp)
assert.equal(file, 'lib/test.ex')
assert.equal(line, '15')
assert.equal(code, 'invalid_contract')
const [, message] = secondOutput.match(filePattern.regexp)
assert.equal(message, secondOutput)
}
all()
.then(() => process.exit(0))
.catch((err) => {
console.error(err)
process.exit(1)
})
+51
View File
@@ -11,10 +11,12 @@ const installer = require('../src/installer')
async function all() { async function all() {
await testFailInstallOTP() await testFailInstallOTP()
await testFailInstallElixir() await testFailInstallElixir()
await testFailInstallGleam()
await testFailInstallRebar3() await testFailInstallRebar3()
await testOTPVersions() await testOTPVersions()
await testElixirVersions() await testElixirVersions()
await testGleamVersions()
await testRebar3Versions() await testRebar3Versions()
await testGetVersionFromSpec() await testGetVersionFromSpec()
@@ -63,6 +65,20 @@ async function testFailInstallElixir() {
) )
} }
async function testFailInstallGleam() {
const gleamVersion = '0.1.3'
assert.rejects(
async () => {
await installer.installGleam(gleamVersion)
},
(err) => {
assert.ok(err instanceof Error)
return true
},
`Installing Gleam ${gleamVersion} is supposed to fail`,
)
}
async function testFailInstallRebar3() { async function testFailInstallRebar3() {
const r3Version = '0.14.4' const r3Version = '0.14.4'
assert.rejects( assert.rejects(
@@ -187,6 +203,41 @@ async function testElixirVersions() {
got = await setupBeam.getElixirVersion(spec, otpVersion) got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected) assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose') simulateInput('version-type', 'loose')
simulateInput('version-type', 'strict')
spec = 'master'
otpVersion = '23.1'
expected = 'master-otp-23'
got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose')
}
async function testGleamVersions() {
let got
let expected
let spec
let otpVersion
spec = 'v0.3.0'
otpVersion = 'OTP-23'
expected = 'v0.3.0'
got = await setupBeam.getGleamVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
spec = '0.13.2'
otpVersion = 'OTP-24'
expected = 'v0.13.2'
got = await setupBeam.getGleamVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
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')
} }
async function testRebar3Versions() { async function testRebar3Versions() {
+16 -5
View File
@@ -8,27 +8,38 @@ branding:
color: blue color: blue
icon: code icon: code
inputs: inputs:
otp-version:
description: Version range or exact version of Erlang/OTP to use,
or false when installing only Gleam without OTP
required: true
elixir-version: elixir-version:
description: Version range or exact version of Elixir to use description: Version range or exact version of Elixir to use
otp-version: gleam-version:
description: Version range or exact version of Erlang/OTP to use description: Version range or exact version of Gleam to use
install-hex: install-hex:
description: Whether to install Hex (with Mix) description: Whether to install Hex (with mix local.hex
when installing Elixir)
default: true default: true
install-rebar: install-rebar:
description: Whether to install Rebar (with Mix) description: Whether to install Rebar (with mix local.rebar
when installing Elixir)
default: true default: true
rebar3-version: rebar3-version:
description: Version range or exact version of rebar3 to use description: Version range or exact version of rebar3 to use (or nightly)
version-type: version-type:
description: strict means the versions are take as-are; loose means we try description: strict means the versions are take as-are; loose means we try
to guess versions based on semver rules to guess versions based on semver rules
default: loose default: loose
disable_problem_matchers:
description: whether to have the problem matchers present in the results (or not)
default: false
outputs: outputs:
elixir-version: elixir-version:
description: Exact version of Elixir that was installed description: Exact version of Elixir that was installed
otp-version: otp-version:
description: Exact version of Erlang/OTP that was installed description: Exact version of Erlang/OTP that was installed
gleam-version:
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
runs: runs:
+32
View File
@@ -41,6 +41,38 @@
"line": 2 "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
}
]
},
{
"owner": "elixir-dialyzerOutputDefault",
"severity": "warning",
"pattern": [
{
"regexp": "^(.*):(\\d+):(.*)",
"file": 1,
"line": 2,
"code": 3
},
{
"regexp": "^(.*)$",
"message": 1
}
]
} }
] ]
} }
+111 -24
View File
@@ -4618,6 +4618,21 @@ async function installElixir(elixirVersion) {
} }
} }
/**
* Install Gleam.
*
* @param {string} gleamVersion
*/
async function installGleam(gleamVersion) {
const OS = process.platform
if (OS === 'linux') {
await exec(__nccwpck_require__.ab + "install-gleam.sh", [gleamVersion])
} else if (OS === 'win32') {
const script = __nccwpck_require__.ab + "install-gleam.ps1"
await exec(`pwsh.exe ${script} -VSN:${gleamVersion}`)
}
}
/** /**
* Install rebar3. * Install rebar3.
* *
@@ -4644,6 +4659,7 @@ function checkPlatform() {
module.exports = { module.exports = {
installOTP, installOTP,
installElixir, installElixir,
installGleam,
installRebar3, installRebar3,
checkPlatform, checkPlatform,
} }
@@ -4671,22 +4687,29 @@ async function main() {
const osVersion = getRunnerOSVersion() const osVersion = getRunnerOSVersion()
const otpSpec = core.getInput('otp-version', { required: true }) const otpSpec = core.getInput('otp-version', { required: true })
const otpVersion = await installOTP(otpSpec, osVersion)
const elixirSpec = core.getInput('elixir-version', { required: false }) const elixirSpec = core.getInput('elixir-version', { required: false })
const elixirInstalled = await maybeInstallElixir(elixirSpec, otpVersion) const gleamSpec = core.getInput('gleam-version', { required: false })
if (elixirInstalled === true) { const rebar3Spec = core.getInput('rebar3-version', { required: false })
const shouldMixRebar = core.getInput('install-rebar', {
required: false, if (otpSpec !== 'false') {
}) const otpVersion = await installOTP(otpSpec, osVersion)
await mix(shouldMixRebar, 'rebar') const elixirInstalled = await maybeInstallElixir(elixirSpec, otpVersion)
const shouldMixHex = core.getInput('install-hex', {
required: false, if (elixirInstalled === true) {
}) const shouldMixRebar = core.getInput('install-rebar', {
await mix(shouldMixHex, 'hex') required: false,
})
await mix(shouldMixRebar, 'rebar')
const shouldMixHex = core.getInput('install-hex', {
required: false,
})
await mix(shouldMixHex, 'hex')
}
} else if (!gleamSpec) {
throw new Error('otp-version=false is only available when installing Gleam')
} }
const rebar3Spec = core.getInput('rebar3-version', { required: false }) await maybeInstallGleam(gleamSpec)
await maybeInstallRebar3(rebar3Spec) await maybeInstallRebar3(rebar3Spec)
} }
@@ -4719,10 +4742,15 @@ async function maybeInstallElixir(elixirSpec, otpVersion) {
console.log(`##[group]Installing Elixir ${elixirVersion}`) console.log(`##[group]Installing Elixir ${elixirVersion}`)
await installer.installElixir(elixirVersion) await installer.installElixir(elixirVersion)
core.setOutput('elixir-version', elixirVersion) core.setOutput('elixir-version', elixirVersion)
const matchersPath = __nccwpck_require__.ab + ".github" const disableProblemMatchers = core.getInput('disable_problem_matchers', {
console.log( required: false,
`##[add-matcher]${path.join(matchersPath, 'elixir-matchers.json')}`, })
) if (!disableProblemMatchers) {
const matchersPath = __nccwpck_require__.ab + ".github"
console.log(
`##[add-matcher]${path.join(matchersPath, 'elixir-matchers.json')}`,
)
}
core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/elixir/bin`) core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/elixir/bin`)
console.log('##[endgroup]') console.log('##[endgroup]')
@@ -4742,11 +4770,33 @@ async function mix(shouldMix, what) {
} }
} }
async function maybeInstallRebar3(rebar3Spec) { async function maybeInstallGleam(gleamSpec) {
let installed = false let installed = false
if (gleamSpec) {
const gleamVersion = await getGleamVersion(gleamSpec)
console.log(`##[group]Installing Gleam ${gleamVersion}`)
await installer.installGleam(gleamVersion)
core.setOutput('gleam-version', gleamVersion)
core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/gleam/bin`)
console.log('##[endgroup]')
installed = true
}
return installed
}
async function maybeInstallRebar3(rebar3Spec) {
let installed = false
let rebar3Version
if (rebar3Spec) { if (rebar3Spec) {
const rebar3Version = await getRebar3Version(rebar3Spec) if (rebar3Spec === 'nightly') {
rebar3Version = 'nightly'
} else {
rebar3Version = await getRebar3Version(rebar3Spec)
}
console.log(`##[group]Installing rebar3 ${rebar3Version}`) console.log(`##[group]Installing rebar3 ${rebar3Version}`)
await installer.installRebar3(rebar3Version) await installer.installRebar3(rebar3Version)
core.setOutput('rebar3-version', rebar3Version) core.setOutput('rebar3-version', rebar3Version)
@@ -4830,7 +4880,21 @@ async function getElixirVersion(exSpec0, otpVersion) {
) )
} }
return `v${elixirVersionWithOTP}` return maybePrependWithV(elixirVersionWithOTP, elixirVersion)
}
async function getGleamVersion(gleamSpec0) {
const gleamSpec = gleamSpec0.match(/^v?(.+)/)
const gleamVersions = await getGleamVersions()
const gleamVersion = getVersionFromSpec(gleamSpec[1], gleamVersions)
if (gleamVersion === null) {
throw new Error(
`Requested Gleam version (${gleamSpec0}) not found in version list ` +
"(should you be using option 'version-type': 'strict'?)",
)
}
return maybePrependWithV(gleamVersion, gleamVersion)
} }
async function getRebar3Version(r3Spec) { async function getRebar3Version(r3Spec) {
@@ -4913,6 +4977,21 @@ async function getElixirVersions() {
return otpVersionsForElixirMap return otpVersionsForElixirMap
} }
async function getGleamVersions() {
const resultJSONs = await get(
'https://api.github.com/repos/gleam-lang/gleam/releases?per_page=100',
[1, 2, 3],
)
const gleamVersionsListing = []
resultJSONs.forEach((resultJSON) => {
JSON.parse(resultJSON)
.map((x) => x.tag_name)
.sort()
.forEach((v) => gleamVersionsListing.push(v))
})
return gleamVersionsListing
}
async function getRebar3Versions() { async function getRebar3Versions() {
const resultJSONs = await get( const resultJSONs = await get(
'https://api.github.com/repos/erlang/rebar3/releases?per_page=100', 'https://api.github.com/repos/erlang/rebar3/releases?per_page=100',
@@ -4956,7 +5035,7 @@ function getVersionFromSpec(spec, versions) {
} }
} }
return version return version === null || version === undefined ? null : version
} }
function maybeCoerced(v) { function maybeCoerced(v) {
@@ -4995,17 +5074,17 @@ function sortVersions(left, right) {
function getRunnerOSVersion() { function getRunnerOSVersion() {
const ImageOSToContainer = { const ImageOSToContainer = {
ubuntu16: 'ubuntu-16.04',
ubuntu18: 'ubuntu-18.04', ubuntu18: 'ubuntu-18.04',
ubuntu20: 'ubuntu-20.04', ubuntu20: 'ubuntu-20.04',
win16: 'windows-2016',
win19: 'windows-2019', win19: 'windows-2019',
} }
const containerFromEnvImageOS = ImageOSToContainer[process.env.ImageOS] const containerFromEnvImageOS = ImageOSToContainer[process.env.ImageOS]
if (!containerFromEnvImageOS) { if (!containerFromEnvImageOS) {
throw new Error( throw new Error(
"Tried to map a target OS from env. variable 'ImageOS', but failed. If you're using a " + "Tried to map a target OS from env. variable 'ImageOS' (got " +
`${process.env.ImageOS}` +
"), but failed. If you're using a " +
"self-hosted runner, you should set 'env': 'ImageOS': ... to one of the following: " + "self-hosted runner, you should set 'env': 'ImageOS': ... to one of the following: " +
"['" + "['" +
`${Object.keys(ImageOSToContainer).join("', '")}` + `${Object.keys(ImageOSToContainer).join("', '")}` +
@@ -5061,9 +5140,17 @@ async function get(url0, pageIdxs) {
return ret return ret
} }
function maybePrependWithV(versionToPrepend, specVersion) {
const digitStart = new RegExp('^\\d+')
return digitStart.test(specVersion)
? `v${versionToPrepend}`
: versionToPrepend
}
module.exports = { module.exports = {
getOTPVersion, getOTPVersion,
getElixirVersion, getElixirVersion,
getGleamVersion,
getRebar3Version, getRebar3Version,
getVersionFromSpec, getVersionFromSpec,
} }
+2 -2
View File
@@ -15,5 +15,5 @@ New-Item "$DIR_FOR_BIN" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue" $ProgressPreference="SilentlyContinue"
Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}" Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}"
$ProgressPreference="Continue" $ProgressPreference="Continue"
Write-Output "Installed Erlang/OTP version follows" Write-Output "Installed Elixir version follows"
& "$DIR_FOR_BIN/bin/iex" "-v" | Write-Output & "$DIR_FOR_BIN/bin/elixir" "-v" | Write-Output
+1 -1
View File
@@ -13,4 +13,4 @@ wget -q -O "${FILE_OUTPUT}" "https://repo.hex.pm/builds/elixir/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}" mkdir -p "${DIR_FOR_BIN}"
unzip -q -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}" unzip -q -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}"
echo "Installed Elixir version follows" echo "Installed Elixir version follows"
${DIR_FOR_BIN}/bin/iex -v ${DIR_FOR_BIN}/bin/elixir -v
+19
View File
@@ -0,0 +1,19 @@
param([Parameter(Mandatory=$true)][string]$VSN)
$ErrorActionPreference="Stop"
Set-Location $Env:RUNNER_TEMP
$FILE_INPUT="gleam-${VSN}-windows-64bit.zip"
$FILE_OUTPUT="gleam.zip"
$DIR_FOR_BIN=".setup-beam/gleam/bin"
$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" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue"
Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}"
$ProgressPreference="Continue"
Write-Output "Installed Gleam version follows"
& "$DIR_FOR_BIN/gleam" "--version" | Write-Output
Vendored Executable
+17
View File
@@ -0,0 +1,17 @@
#!/bin/bash
set -eo pipefail
cd "$RUNNER_TEMP"
VSN=${1}
FILE_INPUT=gleam-${VSN}-linux-amd64.tar.gz
FILE_OUTPUT=gleam.tar.gz
DIR_FOR_BIN=.setup-beam/gleam/bin
wget -q -O "${FILE_OUTPUT}" "https://github.com/gleam-lang/gleam/releases/download/${VSN}/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}"
tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}"
echo "Installed Gleam version follows"
${DIR_FOR_BIN}/gleam --version
+9 -2
View File
@@ -10,12 +10,19 @@ $FILE_OUTPUT_PS1="rebar3.ps1"
$DIR_FOR_BIN=".setup-beam/rebar3" $DIR_FOR_BIN=".setup-beam/rebar3"
$ProgressPreference="SilentlyContinue" $ProgressPreference="SilentlyContinue"
Invoke-WebRequest "https://github.com/erlang/rebar3/releases/download/${VSN}/${FILE_INPUT}" -OutFile "$FILE_OUTPUT" $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" $ProgressPreference="Continue"
New-Item "$DIR_FOR_BIN/bin" -ItemType Directory | Out-Null New-Item "$DIR_FOR_BIN/bin" -ItemType Directory | Out-Null
Move-Item "$FILE_OUTPUT" "$DIR_FOR_BIN/bin" 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 "& escript.exe $PWD/$DIR_FOR_BIN/bin/$FILE_OUTPUT `$args" | Out-File -FilePath "$FILE_OUTPUT_PS1" -Encoding utf8 -Append
type $FILE_OUTPUT_PS1 type $FILE_OUTPUT_PS1
Move-Item "$FILE_OUTPUT_PS1" "$DIR_FOR_BIN/bin" Move-Item "$FILE_OUTPUT_PS1" "$DIR_FOR_BIN/bin"
Write-Output "Installed rebar3 version follows" Write-Output "Installed rebar3 version$REBAR3_NIGHTLY follows"
& "$DIR_FOR_BIN/bin/rebar3" "version" | Write-Output & "$DIR_FOR_BIN/bin/rebar3" "version" | Write-Output
+8 -2
View File
@@ -9,9 +9,15 @@ FILE_INPUT=rebar3
FILE_OUTPUT=rebar3 FILE_OUTPUT=rebar3
DIR_FOR_BIN=.setup-beam/rebar3 DIR_FOR_BIN=.setup-beam/rebar3
wget -q -O "${FILE_OUTPUT}" "https://github.com/erlang/rebar3/releases/download/${VSN}/${FILE_INPUT}" 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" mkdir -p "${DIR_FOR_BIN}/bin"
chmod +x "${FILE_OUTPUT}" chmod +x "${FILE_OUTPUT}"
mv "${FILE_OUTPUT}" "${DIR_FOR_BIN}/bin" mv "${FILE_OUTPUT}" "${DIR_FOR_BIN}/bin"
echo "Installed rebar3 version follows" echo "Installed rebar3 version$REBAR3_NIGHTLY follows"
${DIR_FOR_BIN}/bin/rebar3 version ${DIR_FOR_BIN}/bin/rebar3 version
+304 -495
View File
File diff suppressed because it is too large Load Diff
+5 -2
View File
@@ -8,8 +8,8 @@
"jslint": "eslint src/**/*.js && eslint __tests__/**/*.js", "jslint": "eslint src/**/*.js && eslint __tests__/**/*.js",
"licenses": "yarn licenses generate-disclaimer > 3RD_PARTY_LICENSES", "licenses": "yarn licenses generate-disclaimer > 3RD_PARTY_LICENSES",
"markdownlint": "markdownlint *.md", "markdownlint": "markdownlint *.md",
"shellcheck": "shellcheck src/install-*.sh", "shellcheck": "shellcheck src/install-*.sh .github/workflows/*.sh",
"test": "node __tests__/setup-beam.test.js", "test": "node __tests__/setup-beam.test.js && node ./__tests__/problem-matchers.test.js",
"yamllint": "yamllint .github/workflows/**.yml && yamllint .*.yml && yamllint *.yml" "yamllint": "yamllint .github/workflows/**.yml && yamllint .*.yml && yamllint *.yml"
}, },
"husky": { "husky": {
@@ -26,6 +26,9 @@
"@vercel/ncc": "0.27.0", "@vercel/ncc": "0.27.0",
"eslint": "7.22.0", "eslint": "7.22.0",
"eslint-config-airbnb": "v18.2.1", "eslint-config-airbnb": "v18.2.1",
"eslint-plugin-import": "^2.24.2",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-react": "^7.25.1",
"husky": "5.2.0", "husky": "5.2.0",
"markdownlint": "0.23.1", "markdownlint": "0.23.1",
"prettier": "2.2.1", "prettier": "2.2.1",
+2 -2
View File
@@ -15,5 +15,5 @@ New-Item "$DIR_FOR_BIN" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue" $ProgressPreference="SilentlyContinue"
Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}" Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}"
$ProgressPreference="Continue" $ProgressPreference="Continue"
Write-Output "Installed Erlang/OTP version follows" Write-Output "Installed Elixir version follows"
& "$DIR_FOR_BIN/bin/iex" "-v" | Write-Output & "$DIR_FOR_BIN/bin/elixir" "-v" | Write-Output
+1 -1
View File
@@ -13,4 +13,4 @@ wget -q -O "${FILE_OUTPUT}" "https://repo.hex.pm/builds/elixir/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}" mkdir -p "${DIR_FOR_BIN}"
unzip -q -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}" unzip -q -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}"
echo "Installed Elixir version follows" echo "Installed Elixir version follows"
${DIR_FOR_BIN}/bin/iex -v ${DIR_FOR_BIN}/bin/elixir -v
+19
View File
@@ -0,0 +1,19 @@
param([Parameter(Mandatory=$true)][string]$VSN)
$ErrorActionPreference="Stop"
Set-Location $Env:RUNNER_TEMP
$FILE_INPUT="gleam-${VSN}-windows-64bit.zip"
$FILE_OUTPUT="gleam.zip"
$DIR_FOR_BIN=".setup-beam/gleam/bin"
$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" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue"
Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}"
$ProgressPreference="Continue"
Write-Output "Installed Gleam version follows"
& "$DIR_FOR_BIN/gleam" "--version" | Write-Output
+17
View File
@@ -0,0 +1,17 @@
#!/bin/bash
set -eo pipefail
cd "$RUNNER_TEMP"
VSN=${1}
FILE_INPUT=gleam-${VSN}-linux-amd64.tar.gz
FILE_OUTPUT=gleam.tar.gz
DIR_FOR_BIN=.setup-beam/gleam/bin
wget -q -O "${FILE_OUTPUT}" "https://github.com/gleam-lang/gleam/releases/download/${VSN}/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}"
tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}"
echo "Installed Gleam version follows"
${DIR_FOR_BIN}/gleam --version
+9 -2
View File
@@ -10,12 +10,19 @@ $FILE_OUTPUT_PS1="rebar3.ps1"
$DIR_FOR_BIN=".setup-beam/rebar3" $DIR_FOR_BIN=".setup-beam/rebar3"
$ProgressPreference="SilentlyContinue" $ProgressPreference="SilentlyContinue"
Invoke-WebRequest "https://github.com/erlang/rebar3/releases/download/${VSN}/${FILE_INPUT}" -OutFile "$FILE_OUTPUT" $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" $ProgressPreference="Continue"
New-Item "$DIR_FOR_BIN/bin" -ItemType Directory | Out-Null New-Item "$DIR_FOR_BIN/bin" -ItemType Directory | Out-Null
Move-Item "$FILE_OUTPUT" "$DIR_FOR_BIN/bin" 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 "& escript.exe $PWD/$DIR_FOR_BIN/bin/$FILE_OUTPUT `$args" | Out-File -FilePath "$FILE_OUTPUT_PS1" -Encoding utf8 -Append
type $FILE_OUTPUT_PS1 type $FILE_OUTPUT_PS1
Move-Item "$FILE_OUTPUT_PS1" "$DIR_FOR_BIN/bin" Move-Item "$FILE_OUTPUT_PS1" "$DIR_FOR_BIN/bin"
Write-Output "Installed rebar3 version follows" Write-Output "Installed rebar3 version$REBAR3_NIGHTLY follows"
& "$DIR_FOR_BIN/bin/rebar3" "version" | Write-Output & "$DIR_FOR_BIN/bin/rebar3" "version" | Write-Output
+8 -2
View File
@@ -9,9 +9,15 @@ FILE_INPUT=rebar3
FILE_OUTPUT=rebar3 FILE_OUTPUT=rebar3
DIR_FOR_BIN=.setup-beam/rebar3 DIR_FOR_BIN=.setup-beam/rebar3
wget -q -O "${FILE_OUTPUT}" "https://github.com/erlang/rebar3/releases/download/${VSN}/${FILE_INPUT}" 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" mkdir -p "${DIR_FOR_BIN}/bin"
chmod +x "${FILE_OUTPUT}" chmod +x "${FILE_OUTPUT}"
mv "${FILE_OUTPUT}" "${DIR_FOR_BIN}/bin" mv "${FILE_OUTPUT}" "${DIR_FOR_BIN}/bin"
echo "Installed rebar3 version follows" echo "Installed rebar3 version$REBAR3_NIGHTLY follows"
${DIR_FOR_BIN}/bin/rebar3 version ${DIR_FOR_BIN}/bin/rebar3 version
+16
View File
@@ -32,6 +32,21 @@ async function installElixir(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. * Install rebar3.
* *
@@ -58,6 +73,7 @@ function checkPlatform() {
module.exports = { module.exports = {
installOTP, installOTP,
installElixir, installElixir,
installGleam,
installRebar3, installRebar3,
checkPlatform, checkPlatform,
} }
+95 -24
View File
@@ -15,22 +15,29 @@ async function main() {
const osVersion = getRunnerOSVersion() const osVersion = getRunnerOSVersion()
const otpSpec = core.getInput('otp-version', { required: true }) const otpSpec = core.getInput('otp-version', { required: true })
const otpVersion = await installOTP(otpSpec, osVersion)
const elixirSpec = core.getInput('elixir-version', { required: false }) const elixirSpec = core.getInput('elixir-version', { required: false })
const elixirInstalled = await maybeInstallElixir(elixirSpec, otpVersion) const gleamSpec = core.getInput('gleam-version', { required: false })
if (elixirInstalled === true) { const rebar3Spec = core.getInput('rebar3-version', { required: false })
const shouldMixRebar = core.getInput('install-rebar', {
required: false, if (otpSpec !== 'false') {
}) const otpVersion = await installOTP(otpSpec, osVersion)
await mix(shouldMixRebar, 'rebar') const elixirInstalled = await maybeInstallElixir(elixirSpec, otpVersion)
const shouldMixHex = core.getInput('install-hex', {
required: false, if (elixirInstalled === true) {
}) const shouldMixRebar = core.getInput('install-rebar', {
await mix(shouldMixHex, 'hex') required: false,
})
await mix(shouldMixRebar, 'rebar')
const shouldMixHex = core.getInput('install-hex', {
required: false,
})
await mix(shouldMixHex, 'hex')
}
} else if (!gleamSpec) {
throw new Error('otp-version=false is only available when installing Gleam')
} }
const rebar3Spec = core.getInput('rebar3-version', { required: false }) await maybeInstallGleam(gleamSpec)
await maybeInstallRebar3(rebar3Spec) await maybeInstallRebar3(rebar3Spec)
} }
@@ -63,10 +70,15 @@ async function maybeInstallElixir(elixirSpec, otpVersion) {
console.log(`##[group]Installing Elixir ${elixirVersion}`) console.log(`##[group]Installing Elixir ${elixirVersion}`)
await installer.installElixir(elixirVersion) await installer.installElixir(elixirVersion)
core.setOutput('elixir-version', elixirVersion) core.setOutput('elixir-version', elixirVersion)
const matchersPath = path.join(__dirname, '..', '.github') const disableProblemMatchers = core.getInput('disable_problem_matchers', {
console.log( required: false,
`##[add-matcher]${path.join(matchersPath, 'elixir-matchers.json')}`, })
) if (!disableProblemMatchers) {
const matchersPath = path.join(__dirname, '..', '.github')
console.log(
`##[add-matcher]${path.join(matchersPath, 'elixir-matchers.json')}`,
)
}
core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/elixir/bin`) core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/elixir/bin`)
console.log('##[endgroup]') console.log('##[endgroup]')
@@ -86,11 +98,33 @@ async function mix(shouldMix, what) {
} }
} }
async function maybeInstallRebar3(rebar3Spec) { async function maybeInstallGleam(gleamSpec) {
let installed = false let installed = false
if (gleamSpec) {
const gleamVersion = await getGleamVersion(gleamSpec)
console.log(`##[group]Installing Gleam ${gleamVersion}`)
await installer.installGleam(gleamVersion)
core.setOutput('gleam-version', gleamVersion)
core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/gleam/bin`)
console.log('##[endgroup]')
installed = true
}
return installed
}
async function maybeInstallRebar3(rebar3Spec) {
let installed = false
let rebar3Version
if (rebar3Spec) { if (rebar3Spec) {
const rebar3Version = await getRebar3Version(rebar3Spec) if (rebar3Spec === 'nightly') {
rebar3Version = 'nightly'
} else {
rebar3Version = await getRebar3Version(rebar3Spec)
}
console.log(`##[group]Installing rebar3 ${rebar3Version}`) console.log(`##[group]Installing rebar3 ${rebar3Version}`)
await installer.installRebar3(rebar3Version) await installer.installRebar3(rebar3Version)
core.setOutput('rebar3-version', rebar3Version) core.setOutput('rebar3-version', rebar3Version)
@@ -174,7 +208,21 @@ async function getElixirVersion(exSpec0, otpVersion) {
) )
} }
return `v${elixirVersionWithOTP}` return maybePrependWithV(elixirVersionWithOTP, elixirVersion)
}
async function getGleamVersion(gleamSpec0) {
const gleamSpec = gleamSpec0.match(/^v?(.+)/)
const gleamVersions = await getGleamVersions()
const gleamVersion = getVersionFromSpec(gleamSpec[1], gleamVersions)
if (gleamVersion === null) {
throw new Error(
`Requested Gleam version (${gleamSpec0}) not found in version list ` +
"(should you be using option 'version-type': 'strict'?)",
)
}
return maybePrependWithV(gleamVersion, gleamVersion)
} }
async function getRebar3Version(r3Spec) { async function getRebar3Version(r3Spec) {
@@ -257,6 +305,21 @@ async function getElixirVersions() {
return otpVersionsForElixirMap return otpVersionsForElixirMap
} }
async function getGleamVersions() {
const resultJSONs = await get(
'https://api.github.com/repos/gleam-lang/gleam/releases?per_page=100',
[1, 2, 3],
)
const gleamVersionsListing = []
resultJSONs.forEach((resultJSON) => {
JSON.parse(resultJSON)
.map((x) => x.tag_name)
.sort()
.forEach((v) => gleamVersionsListing.push(v))
})
return gleamVersionsListing
}
async function getRebar3Versions() { async function getRebar3Versions() {
const resultJSONs = await get( const resultJSONs = await get(
'https://api.github.com/repos/erlang/rebar3/releases?per_page=100', 'https://api.github.com/repos/erlang/rebar3/releases?per_page=100',
@@ -300,7 +363,7 @@ function getVersionFromSpec(spec, versions) {
} }
} }
return version return version === null || version === undefined ? null : version
} }
function maybeCoerced(v) { function maybeCoerced(v) {
@@ -339,17 +402,17 @@ function sortVersions(left, right) {
function getRunnerOSVersion() { function getRunnerOSVersion() {
const ImageOSToContainer = { const ImageOSToContainer = {
ubuntu16: 'ubuntu-16.04',
ubuntu18: 'ubuntu-18.04', ubuntu18: 'ubuntu-18.04',
ubuntu20: 'ubuntu-20.04', ubuntu20: 'ubuntu-20.04',
win16: 'windows-2016',
win19: 'windows-2019', win19: 'windows-2019',
} }
const containerFromEnvImageOS = ImageOSToContainer[process.env.ImageOS] const containerFromEnvImageOS = ImageOSToContainer[process.env.ImageOS]
if (!containerFromEnvImageOS) { if (!containerFromEnvImageOS) {
throw new Error( throw new Error(
"Tried to map a target OS from env. variable 'ImageOS', but failed. If you're using a " + "Tried to map a target OS from env. variable 'ImageOS' (got " +
`${process.env.ImageOS}` +
"), but failed. If you're using a " +
"self-hosted runner, you should set 'env': 'ImageOS': ... to one of the following: " + "self-hosted runner, you should set 'env': 'ImageOS': ... to one of the following: " +
"['" + "['" +
`${Object.keys(ImageOSToContainer).join("', '")}` + `${Object.keys(ImageOSToContainer).join("', '")}` +
@@ -405,9 +468,17 @@ async function get(url0, pageIdxs) {
return ret return ret
} }
function maybePrependWithV(versionToPrepend, specVersion) {
const digitStart = new RegExp('^\\d+')
return digitStart.test(specVersion)
? `v${versionToPrepend}`
: versionToPrepend
}
module.exports = { module.exports = {
getOTPVersion, getOTPVersion,
getElixirVersion, getElixirVersion,
getGleamVersion,
getRebar3Version, getRebar3Version,
getVersionFromSpec, getVersionFromSpec,
} }
+21
View File
@@ -0,0 +1,21 @@
name: test
on:
push:
branches:
- master
- main
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2.0.0
- uses: erlef/setup-beam@v1.9.0
with:
otp-version: "23.2"
gleam-version: "0.19.0-rc3"
- run: gleam format --check src test
- run: gleam deps download
- run: gleam test
+4
View File
@@ -0,0 +1,4 @@
*.beam
*.ez
build
erl_crash.dump
+19
View File
@@ -0,0 +1,19 @@
# gleam_gleam
A Gleam project
## Quick start
```sh
gleam run # Run the project
gleam test # Run the tests
gleam shell # Run an Erlang shell
```
## Installation
If available on Hex this package can be added to your Gleam project.
```sh
gleam add gleam_gleam
```
+16
View File
@@ -0,0 +1,16 @@
name = "gleam_gleam"
version = "0.1.0"
# Fill out these fields if you intend to generate HTML documentation or publish
# your project to the Hex package manager.
#
# licences = ["Apache-2.0"]
# description = "A Gleam library..."
# repository = { type = "github", user = "username", repo = "project" }
# links = [{ title = "Website", href = "https://gleam.run" }]
[dependencies]
gleam_stdlib = "~> 0.18"
[dev-dependencies]
gleeunit = "~> 0.5"
+11
View File
@@ -0,0 +1,11 @@
# This file was generated by Gleam
# You typically do not need to edit this file
packages = [
{ name = "gleam_stdlib", version = "0.19.2", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "FFA79EA12369F122B68885E694E097D6810402A2F86BFF48AAE9E40ACE654F4C" },
{ name = "gleeunit", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "77701A5E5A565727E1EEAC9196FB878D544049B6331CD0305B5A69699135EA1C" },
]
[requirements]
gleam_stdlib = "~> 0.18"
gleeunit = "~> 0.5"
@@ -0,0 +1,5 @@
import gleam/io
pub fn main() {
io.println("Hello from gleam_gleam!")
}
@@ -0,0 +1,12 @@
import gleeunit
import gleeunit/should
pub fn main() {
gleeunit.main()
}
// gleeunit test functions end in `_test`
pub fn hello_world_test() {
1
|> should.equal(1)
}
+23
View File
@@ -0,0 +1,23 @@
name: test
on:
push:
branches:
- master
- main
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2.0.0
- uses: gleam-lang/setup-erlang@v1.1.2
with:
otp-version: 23.2
- uses: gleam-lang/setup-gleam@v1.0.2
with:
gleam-version: 0.16.1
- run: rebar3 install_deps
- run: rebar3 eunit
- run: gleam format --check src test
+21
View File
@@ -0,0 +1,21 @@
*.beam
*.iml
*.o
*.plt
*.swo
*.swp
*~
.erlang.cookie
.eunit
.idea
.rebar
.rebar3
_*
_build
docs
ebin
erl_crash.dump
gen
log
logs
rebar3.crashdump
+24
View File
@@ -0,0 +1,24 @@
# gleam_rebar3
A Gleam project
## Quick start
```sh
# Run the eunit tests
rebar3 eunit
# Run the Erlang REPL
rebar3 shell
```
## Installation
If [available in Hex](https://rebar3.org/docs/configuration/dependencies/#declaring-dependencies)
this package can be installed by adding `gleam_rebar3` to your `rebar.config` dependencies:
```erlang
{deps, [
gleam_rebar3
]}.
```
+3
View File
@@ -0,0 +1,3 @@
name = "gleam_rebar3"
# repository = { type = "github", user = "my-user", repo = "gleam_rebar3" }
+12
View File
@@ -0,0 +1,12 @@
{erl_opts, [debug_info]}.
{src_dirs, ["src", "gen/src"]}.
{profiles, [
{test, [{src_dirs, ["src", "test", "gen/src", "gen/test"]}]}
]}.
{project_plugins, [rebar_gleam]}.
{deps, [
{gleam_stdlib, "0.16.0"}
]}.
@@ -0,0 +1,15 @@
{application, gleam_rebar3,
[{description, "A Gleam project"},
{vsn, "0.1.0"},
{registered, []},
{applications,
[kernel,
stdlib,
gleam_stdlib
]},
{env,[]},
{modules, []},
{include_files, ["gleam.toml", "gen"]},
{links, []}
]}.
@@ -0,0 +1,3 @@
pub fn hello_world() -> String {
"Hello, from gleam_rebar3!"
}
@@ -0,0 +1,7 @@
import gleam_rebar3
import gleam/should
pub fn hello_world_test() {
gleam_rebar3.hello_world()
|> should.equal("Hello, from gleam_rebar3!")
}