mirror of
https://github.com/erlef/setup-beam.git
synced 2026-07-29 10:06:07 +00:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 988e02bfe6 | |||
| 8a644c6f28 | |||
| c988d89031 | |||
| 4fbbcf2e6c | |||
| bae9638cba | |||
| 14d4bc3919 | |||
| ade4f1d567 | |||
| 9283f857f1 | |||
| 830642517c |
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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: 12
|
||||||
- run: npm install -g npm
|
- run: npm install -g npm
|
||||||
- run: npm install
|
- run: npm install
|
||||||
- run: npm run build
|
- run: npm run build
|
||||||
@@ -31,12 +31,24 @@ jobs:
|
|||||||
- name: Check if build left artifacts
|
- name: Check if build left artifacts
|
||||||
run: git diff --exit-code
|
run: git diff --exit-code
|
||||||
|
|
||||||
unit_test:
|
unit_tests_ubuntu:
|
||||||
name: Unit tests
|
name: Unit tests (Ubuntu)
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: actions/setup-node@v1
|
- uses: actions/setup-node@v1
|
||||||
with: {node-version: '12'}
|
with:
|
||||||
|
node-version: 12
|
||||||
- run: npm ci
|
- run: npm ci
|
||||||
- run: npm test
|
- run: npm test
|
||||||
|
|
||||||
|
unit_tests_windows:
|
||||||
|
name: Unit tests (Windows)
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 12
|
||||||
|
- run: npm install --production
|
||||||
|
- run: npm test
|
||||||
|
|||||||
@@ -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:
|
||||||
@@ -92,6 +93,24 @@ jobs:
|
|||||||
otp-version: '24'
|
otp-version: '24'
|
||||||
rebar3-version: '3.15'
|
rebar3-version: '3.15'
|
||||||
os: 'ubuntu-20.04'
|
os: 'ubuntu-20.04'
|
||||||
|
- elixir-version: 'v1.11.0'
|
||||||
|
otp-version: '22.3.4.2'
|
||||||
|
os: 'ubuntu-20.04'
|
||||||
|
version-type: 'strict'
|
||||||
|
- elixir-version: '1.10.3'
|
||||||
|
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'
|
||||||
|
otp-version: '23.1'
|
||||||
|
os: 'ubuntu-20.04'
|
||||||
|
- gleam-version: '0.16'
|
||||||
|
otp-version: '24'
|
||||||
|
rebar3-version: '3.16'
|
||||||
|
os: 'ubuntu-latest'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Use erlef/setup-beam
|
- name: Use erlef/setup-beam
|
||||||
@@ -100,12 +119,17 @@ 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}}
|
||||||
- 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}}"
|
||||||
if: ${{matrix.combo.rebar3-version}}
|
if: ${{matrix.combo.rebar3-version}}
|
||||||
@@ -115,14 +139,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}}
|
||||||
|
|||||||
@@ -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:
|
||||||
@@ -52,6 +53,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 +65,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 +83,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}}
|
||||||
|
|||||||
+1
-1
@@ -1810,7 +1810,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
|
|
||||||
-----
|
-----
|
||||||
|
|
||||||
The following software may be included in this product: has-bigints, unbox-primitive, which-boxed-primitive. A copy of the source code may be downloaded from git+https://github.com/ljharb/has-bigints.git (has-bigints), git+https://github.com/ljharb/unbox-primitive.git (unbox-primitive), git+https://github.com/inspect-js/which-boxed-primitive.git (which-boxed-primitive). This software contains the following license and notice below:
|
The following software may be included in this product: has-bigints, internal-slot, side-channel, unbox-primitive, which-boxed-primitive. A copy of the source code may be downloaded from git+https://github.com/ljharb/has-bigints.git (has-bigints), git+https://github.com/ljharb/internal-slot.git (internal-slot), git+https://github.com/ljharb/side-channel.git (side-channel), git+https://github.com/ljharb/unbox-primitive.git (unbox-primitive), git+https://github.com/inspect-js/which-boxed-primitive.git (which-boxed-primitive). This software contains the following license and notice below:
|
||||||
|
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ workflow by:
|
|||||||
|
|
||||||
- installing Erlang/OTP
|
- installing Erlang/OTP
|
||||||
- optionally, installing Elixir
|
- optionally, installing Elixir
|
||||||
|
- optionally, installing Gleam
|
||||||
- optionally, installing `rebar3`
|
- optionally, installing `rebar3`
|
||||||
- optionally, installing `hex`
|
- optionally, installing `hex`
|
||||||
|
|
||||||
@@ -24,19 +25,19 @@ 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.
|
||||||
|
|
||||||
For pre-release Elixir versions, such as `1.11.0-rc.0`, use the full version
|
For pre-release versions, such as `v1.11.0-rc.0`, use the full version
|
||||||
specifier (`1.11.0-rc.0`). Pre-release versions are opt-in, so `1.11.x` will
|
specifier (`v1.11.0-rc.0`) and set option `version-type` to `strict`. Pre-release versions are
|
||||||
not match a pre-release.
|
opt-in, so `1.11.x` will not match a pre-release.
|
||||||
|
|
||||||
### Compatibility between Operating System and Erlang/OTP
|
### Compatibility between Operating System and Erlang/OTP
|
||||||
|
|
||||||
@@ -53,44 +54,36 @@ and Erlang/OTP.
|
|||||||
|
|
||||||
**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.
|
||||||
|
|
||||||
### Basic example (Erlang/OTP + Elixir, on Ubuntu)
|
### Self-hosted runners
|
||||||
|
|
||||||
|
Self-hosted runners need to set env. variable `ImageOS` to one of the following, since the action
|
||||||
|
uses that to download assets:
|
||||||
|
|
||||||
|
| ImageOS | Operating system
|
||||||
|
|- |-
|
||||||
|
| ubuntu16 | ubuntu-16.04
|
||||||
|
| ubuntu18 | ubuntu-18.04
|
||||||
|
| ubuntu20 | ubuntu-20.04
|
||||||
|
| win16 | windows-2016
|
||||||
|
| win19 | windows-2019
|
||||||
|
|
||||||
|
as per the following example:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# create this in .github/workflows/ci.yml
|
...
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: self-hosted
|
||||||
|
env:
|
||||||
|
ImageOS: ubuntu20 # equivalent to runs-on ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: erlef/setup-beam@v1
|
- 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)
|
### 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'
|
|
||||||
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
|
||||||
@@ -114,7 +107,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
|
||||||
@@ -137,7 +130,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
|
||||||
@@ -155,10 +148,41 @@ jobs:
|
|||||||
- run: rebar3 ct
|
- run: rebar3 ct
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Example (Gleam + `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: '24'
|
||||||
|
gleam-version: '0.16'
|
||||||
|
rebar3-version: '3.16'
|
||||||
|
- run: rebar3 ct
|
||||||
|
```
|
||||||
|
|
||||||
## 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
|
||||||
|
|
||||||
|
`setup-beam` has three version paths, described below, for example version `1.8.0`:
|
||||||
|
|
||||||
|
- `@v1`: the latest in the `1.y.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).
|
||||||
|
|
||||||
|
To prevent issues in CI (unless you're OK with potential incompatibility between versions - we
|
||||||
|
make real a effort to not introduce those without bumping major) we suggest you to use `@vx.y.z`,
|
||||||
|
whenever possible.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
The scripts and documentation in this project are released under the [MIT license](LICENSE.md).
|
The scripts and documentation in this project are released under the [MIT license](LICENSE.md).
|
||||||
|
|||||||
@@ -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)
|
||||||
|
})
|
||||||
@@ -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(
|
||||||
@@ -136,7 +152,7 @@ async function testOTPVersions() {
|
|||||||
|
|
||||||
spec = '23.2.x'
|
spec = '23.2.x'
|
||||||
osVersion = 'windows-2016'
|
osVersion = 'windows-2016'
|
||||||
expected = '23.2.7.4'
|
expected = '23.2.7'
|
||||||
got = await setupBeam.getOTPVersion(spec, osVersion)
|
got = await setupBeam.getOTPVersion(spec, osVersion)
|
||||||
assert.deepStrictEqual(got, expected)
|
assert.deepStrictEqual(got, expected)
|
||||||
|
|
||||||
@@ -166,6 +182,12 @@ async function testElixirVersions() {
|
|||||||
got = await setupBeam.getElixirVersion(spec, otpVersion)
|
got = await setupBeam.getElixirVersion(spec, otpVersion)
|
||||||
assert.deepStrictEqual(got, expected)
|
assert.deepStrictEqual(got, expected)
|
||||||
|
|
||||||
|
spec = '1.12.1'
|
||||||
|
otpVersion = 'OTP-24.0.2'
|
||||||
|
expected = 'v1.12.1-otp-24'
|
||||||
|
got = await setupBeam.getElixirVersion(spec, otpVersion)
|
||||||
|
assert.deepStrictEqual(got, expected)
|
||||||
|
|
||||||
simulateInput('version-type', 'strict')
|
simulateInput('version-type', 'strict')
|
||||||
spec = 'v1.11.0-rc.0'
|
spec = 'v1.11.0-rc.0'
|
||||||
otpVersion = 'OTP-23'
|
otpVersion = 'OTP-23'
|
||||||
@@ -173,6 +195,49 @@ 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 = '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', '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() {
|
||||||
@@ -228,6 +293,7 @@ async function testGetVersionFromSpec() {
|
|||||||
'22.3.4.10.1',
|
'22.3.4.10.1',
|
||||||
'master',
|
'master',
|
||||||
'v11.11.0-rc.0-otp-23',
|
'v11.11.0-rc.0-otp-23',
|
||||||
|
'22.3.4.2',
|
||||||
]
|
]
|
||||||
|
|
||||||
spec = '1'
|
spec = '1'
|
||||||
@@ -286,6 +352,11 @@ async function testGetVersionFromSpec() {
|
|||||||
assert.deepStrictEqual(got, expected)
|
assert.deepStrictEqual(got, expected)
|
||||||
simulateInput('version-type', 'loose')
|
simulateInput('version-type', 'loose')
|
||||||
|
|
||||||
|
spec = '24.0-rc2'
|
||||||
|
expected = '24.0-rc2'
|
||||||
|
got = setupBeam.getVersionFromSpec(spec, versions)
|
||||||
|
assert.deepStrictEqual(got, expected)
|
||||||
|
|
||||||
spec = '22.3'
|
spec = '22.3'
|
||||||
expected = '22.3.4.12.1'
|
expected = '22.3.4.12.1'
|
||||||
got = setupBeam.getVersionFromSpec(spec, versions)
|
got = setupBeam.getVersionFromSpec(spec, versions)
|
||||||
@@ -318,25 +389,12 @@ async function testGetVersionFromSpec() {
|
|||||||
got = setupBeam.getVersionFromSpec(spec, versions)
|
got = setupBeam.getVersionFromSpec(spec, versions)
|
||||||
assert.deepStrictEqual(got, expected)
|
assert.deepStrictEqual(got, expected)
|
||||||
|
|
||||||
spec = '11.11'
|
simulateInput('version-type', 'strict')
|
||||||
expected = 'v11.11.0-rc.0-otp-23'
|
spec = '22.3.4.2'
|
||||||
got = setupBeam.getVersionFromSpec(spec, versions)
|
expected = '22.3.4.2'
|
||||||
assert.deepStrictEqual(got, expected)
|
|
||||||
|
|
||||||
spec = '11.11.0'
|
|
||||||
expected = 'v11.11.0-rc.0-otp-23'
|
|
||||||
got = setupBeam.getVersionFromSpec(spec, versions)
|
|
||||||
assert.deepStrictEqual(got, expected)
|
|
||||||
|
|
||||||
spec = 'v11.11'
|
|
||||||
expected = 'v11.11.0-rc.0-otp-23'
|
|
||||||
got = setupBeam.getVersionFromSpec(spec, versions)
|
|
||||||
assert.deepStrictEqual(got, expected)
|
|
||||||
|
|
||||||
spec = 'v11.11.0'
|
|
||||||
expected = 'v11.11.0-rc.0-otp-23'
|
|
||||||
got = setupBeam.getVersionFromSpec(spec, versions)
|
got = setupBeam.getVersionFromSpec(spec, versions)
|
||||||
assert.deepStrictEqual(got, expected)
|
assert.deepStrictEqual(got, expected)
|
||||||
|
simulateInput('version-type', 'loose')
|
||||||
}
|
}
|
||||||
|
|
||||||
function simulateInput(key, value) {
|
function simulateInput(key, value) {
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ inputs:
|
|||||||
description: Version range or exact version of Elixir to use
|
description: Version range or exact version of Elixir to use
|
||||||
otp-version:
|
otp-version:
|
||||||
description: Version range or exact version of Erlang/OTP to use
|
description: Version range or exact version of Erlang/OTP to use
|
||||||
|
gleam-version:
|
||||||
|
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)
|
||||||
default: true
|
default: true
|
||||||
@@ -29,6 +31,8 @@ outputs:
|
|||||||
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:
|
||||||
|
|||||||
Vendored
+32
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+119
-16
@@ -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,
|
||||||
}
|
}
|
||||||
@@ -4686,6 +4702,9 @@ async function main() {
|
|||||||
await mix(shouldMixHex, 'hex')
|
await mix(shouldMixHex, 'hex')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const gleamSpec = core.getInput('gleam-version', { required: false })
|
||||||
|
await maybeInstallGleam(gleamSpec)
|
||||||
|
|
||||||
const rebar3Spec = core.getInput('rebar3-version', { required: false })
|
const rebar3Spec = core.getInput('rebar3-version', { required: false })
|
||||||
await maybeInstallRebar3(rebar3Spec)
|
await maybeInstallRebar3(rebar3Spec)
|
||||||
}
|
}
|
||||||
@@ -4742,6 +4761,23 @@ async function mix(shouldMix, what) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function maybeInstallGleam(gleamSpec) {
|
||||||
|
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) {
|
async function maybeInstallRebar3(rebar3Spec) {
|
||||||
let installed = false
|
let installed = false
|
||||||
|
|
||||||
@@ -4777,7 +4813,8 @@ async function getOTPVersion(otpSpec0, osVersion) {
|
|||||||
}
|
}
|
||||||
if (otpVersion === null) {
|
if (otpVersion === null) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Requested Erlang/OTP version (${otpSpec0}) not found in version list`,
|
`Requested Erlang/OTP version (${otpSpec0}) not found in version list ` +
|
||||||
|
"(should you be using option 'version-type': 'strict'?)",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4788,7 +4825,7 @@ async function getElixirVersion(exSpec0, otpVersion) {
|
|||||||
const elixirVersions = await getElixirVersions()
|
const elixirVersions = await getElixirVersions()
|
||||||
const semverVersions = Array.from(elixirVersions.keys()).sort()
|
const semverVersions = Array.from(elixirVersions.keys()).sort()
|
||||||
|
|
||||||
const exSpec = exSpec0.match(/^(.+)(-otp-.+)/) || exSpec0.match(/^(.+)/)
|
const exSpec = exSpec0.match(/^v?(.+)(-otp-.+)/) || exSpec0.match(/^v?(.+)/)
|
||||||
let elixirVersion
|
let elixirVersion
|
||||||
if (exSpec[2]) {
|
if (exSpec[2]) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
@@ -4801,7 +4838,8 @@ async function getElixirVersion(exSpec0, otpVersion) {
|
|||||||
}
|
}
|
||||||
if (!exSpec || elixirVersion === null) {
|
if (!exSpec || elixirVersion === null) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Requested Elixir version (${exSpec0}) not found in version list`,
|
`Requested Elixir version (${exSpec0}) not found in version list ` +
|
||||||
|
"(should you be using option 'version-type': 'strict'?)",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
const otpMatch = otpVersion.match(/^(?:OTP-)?([^.]+)/)
|
const otpMatch = otpVersion.match(/^(?:OTP-)?([^.]+)/)
|
||||||
@@ -4824,11 +4862,25 @@ async function getElixirVersion(exSpec0, otpVersion) {
|
|||||||
} else {
|
} else {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Requested Elixir / Erlang/OTP version (${exSpec0} / ${otpVersion}) not ` +
|
`Requested Elixir / Erlang/OTP version (${exSpec0} / ${otpVersion}) not ` +
|
||||||
'found in version list',
|
"found in version list (should you be using option 'version-type': 'strict'?)",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return 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) {
|
||||||
@@ -4836,7 +4888,8 @@ async function getRebar3Version(r3Spec) {
|
|||||||
const rebar3Version = getVersionFromSpec(r3Spec, rebar3Versions)
|
const rebar3Version = getVersionFromSpec(r3Spec, rebar3Versions)
|
||||||
if (rebar3Version === null) {
|
if (rebar3Version === null) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Requested rebar3 version (${r3Spec}) not found in version list`,
|
`Requested rebar3 version (${r3Spec}) not found in version list ` +
|
||||||
|
"(should you be using option 'version-type': 'strict'?)",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4896,7 +4949,7 @@ async function getElixirVersions() {
|
|||||||
.split('\n')
|
.split('\n')
|
||||||
.forEach((line) => {
|
.forEach((line) => {
|
||||||
const elixirMatch =
|
const elixirMatch =
|
||||||
line.match(/^(.+)-otp-([^ ]+)/) || line.match(/^([^ ]+)/)
|
line.match(/^v?(.+)-otp-([^ ]+)/) || line.match(/^v?([^ ]+)/)
|
||||||
const elixirVersion = elixirMatch[1]
|
const elixirVersion = elixirMatch[1]
|
||||||
const otpVersion = elixirMatch[2]
|
const otpVersion = elixirMatch[2]
|
||||||
const otpVersions = otpVersionsForElixirMap.get(elixirVersion) || []
|
const otpVersions = otpVersionsForElixirMap.get(elixirVersion) || []
|
||||||
@@ -4910,6 +4963,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',
|
||||||
@@ -4928,18 +4996,19 @@ async function getRebar3Versions() {
|
|||||||
function getVersionFromSpec(spec, versions) {
|
function getVersionFromSpec(spec, versions) {
|
||||||
let version = null
|
let version = null
|
||||||
|
|
||||||
if (core.getInput('version-type', { required: false }) === 'strict') {
|
if (
|
||||||
|
spec.match(/rc/) ||
|
||||||
|
core.getInput('version-type', { required: false }) === 'strict'
|
||||||
|
) {
|
||||||
version = spec
|
version = spec
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version === null) {
|
if (version === null) {
|
||||||
// We keep a map of semver => "spec" in order to use semver ranges to find appropriate versions
|
// We keep a map of semver => "spec" in order to use semver ranges to find appropriate versions
|
||||||
const versionsMap = versions.sort(sortVersions).reduce((acc, v) => {
|
const versionsMap = versions.sort(sortVersions).reduce((acc, v) => {
|
||||||
try {
|
if (!v.match(/rc/)) {
|
||||||
acc[semver.coerce(v).version] = v
|
// release candidates are opt-in
|
||||||
} catch {
|
acc[maybeCoerced(v)] = v
|
||||||
// some stuff can't be coerced, like 'master'
|
|
||||||
acc[v] = v
|
|
||||||
}
|
}
|
||||||
return acc
|
return acc
|
||||||
}, {})
|
}, {})
|
||||||
@@ -4948,11 +5017,24 @@ function getVersionFromSpec(spec, versions) {
|
|||||||
version =
|
version =
|
||||||
versionsMap[semver.maxSatisfying(Object.keys(versionsMap), rangeForMax)]
|
versionsMap[semver.maxSatisfying(Object.keys(versionsMap), rangeForMax)]
|
||||||
} else {
|
} else {
|
||||||
version = versionsMap[spec]
|
version = versionsMap[maybeCoerced(spec)]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return version
|
return version === null || version === undefined ? null : version
|
||||||
|
}
|
||||||
|
|
||||||
|
function maybeCoerced(v) {
|
||||||
|
let ret
|
||||||
|
|
||||||
|
try {
|
||||||
|
ret = semver.coerce(v).version
|
||||||
|
} catch {
|
||||||
|
// some stuff can't be coerced, like 'master'
|
||||||
|
ret = v
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
function sortVersions(left, right) {
|
function sortVersions(left, right) {
|
||||||
@@ -4984,8 +5066,21 @@ function getRunnerOSVersion() {
|
|||||||
win16: 'windows-2016',
|
win16: 'windows-2016',
|
||||||
win19: 'windows-2019',
|
win19: 'windows-2019',
|
||||||
}
|
}
|
||||||
|
const containerFromEnvImageOS = ImageOSToContainer[process.env.ImageOS]
|
||||||
|
|
||||||
return ImageOSToContainer[process.env.ImageOS]
|
if (!containerFromEnvImageOS) {
|
||||||
|
throw new Error(
|
||||||
|
"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: " +
|
||||||
|
"['" +
|
||||||
|
`${Object.keys(ImageOSToContainer).join("', '")}` +
|
||||||
|
"']",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return containerFromEnvImageOS
|
||||||
}
|
}
|
||||||
|
|
||||||
async function get(url0, pageIdxs) {
|
async function get(url0, pageIdxs) {
|
||||||
@@ -5033,9 +5128,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,
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+2
-2
@@ -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
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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
|
||||||
|
|||||||
Vendored
+19
@@ -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
@@ -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
|
||||||
+1
-1
@@ -9,7 +9,7 @@
|
|||||||
"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",
|
||||||
"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": {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
Executable
+17
@@ -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
|
||||||
@@ -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,
|
||||||
}
|
}
|
||||||
|
|||||||
+103
-16
@@ -30,6 +30,9 @@ async function main() {
|
|||||||
await mix(shouldMixHex, 'hex')
|
await mix(shouldMixHex, 'hex')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const gleamSpec = core.getInput('gleam-version', { required: false })
|
||||||
|
await maybeInstallGleam(gleamSpec)
|
||||||
|
|
||||||
const rebar3Spec = core.getInput('rebar3-version', { required: false })
|
const rebar3Spec = core.getInput('rebar3-version', { required: false })
|
||||||
await maybeInstallRebar3(rebar3Spec)
|
await maybeInstallRebar3(rebar3Spec)
|
||||||
}
|
}
|
||||||
@@ -86,6 +89,23 @@ async function mix(shouldMix, what) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function maybeInstallGleam(gleamSpec) {
|
||||||
|
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) {
|
async function maybeInstallRebar3(rebar3Spec) {
|
||||||
let installed = false
|
let installed = false
|
||||||
|
|
||||||
@@ -121,7 +141,8 @@ async function getOTPVersion(otpSpec0, osVersion) {
|
|||||||
}
|
}
|
||||||
if (otpVersion === null) {
|
if (otpVersion === null) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Requested Erlang/OTP version (${otpSpec0}) not found in version list`,
|
`Requested Erlang/OTP version (${otpSpec0}) not found in version list ` +
|
||||||
|
"(should you be using option 'version-type': 'strict'?)",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,7 +153,7 @@ async function getElixirVersion(exSpec0, otpVersion) {
|
|||||||
const elixirVersions = await getElixirVersions()
|
const elixirVersions = await getElixirVersions()
|
||||||
const semverVersions = Array.from(elixirVersions.keys()).sort()
|
const semverVersions = Array.from(elixirVersions.keys()).sort()
|
||||||
|
|
||||||
const exSpec = exSpec0.match(/^(.+)(-otp-.+)/) || exSpec0.match(/^(.+)/)
|
const exSpec = exSpec0.match(/^v?(.+)(-otp-.+)/) || exSpec0.match(/^v?(.+)/)
|
||||||
let elixirVersion
|
let elixirVersion
|
||||||
if (exSpec[2]) {
|
if (exSpec[2]) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
@@ -145,7 +166,8 @@ async function getElixirVersion(exSpec0, otpVersion) {
|
|||||||
}
|
}
|
||||||
if (!exSpec || elixirVersion === null) {
|
if (!exSpec || elixirVersion === null) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Requested Elixir version (${exSpec0}) not found in version list`,
|
`Requested Elixir version (${exSpec0}) not found in version list ` +
|
||||||
|
"(should you be using option 'version-type': 'strict'?)",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
const otpMatch = otpVersion.match(/^(?:OTP-)?([^.]+)/)
|
const otpMatch = otpVersion.match(/^(?:OTP-)?([^.]+)/)
|
||||||
@@ -168,11 +190,25 @@ async function getElixirVersion(exSpec0, otpVersion) {
|
|||||||
} else {
|
} else {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Requested Elixir / Erlang/OTP version (${exSpec0} / ${otpVersion}) not ` +
|
`Requested Elixir / Erlang/OTP version (${exSpec0} / ${otpVersion}) not ` +
|
||||||
'found in version list',
|
"found in version list (should you be using option 'version-type': 'strict'?)",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return 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) {
|
||||||
@@ -180,7 +216,8 @@ async function getRebar3Version(r3Spec) {
|
|||||||
const rebar3Version = getVersionFromSpec(r3Spec, rebar3Versions)
|
const rebar3Version = getVersionFromSpec(r3Spec, rebar3Versions)
|
||||||
if (rebar3Version === null) {
|
if (rebar3Version === null) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Requested rebar3 version (${r3Spec}) not found in version list`,
|
`Requested rebar3 version (${r3Spec}) not found in version list ` +
|
||||||
|
"(should you be using option 'version-type': 'strict'?)",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,7 +277,7 @@ async function getElixirVersions() {
|
|||||||
.split('\n')
|
.split('\n')
|
||||||
.forEach((line) => {
|
.forEach((line) => {
|
||||||
const elixirMatch =
|
const elixirMatch =
|
||||||
line.match(/^(.+)-otp-([^ ]+)/) || line.match(/^([^ ]+)/)
|
line.match(/^v?(.+)-otp-([^ ]+)/) || line.match(/^v?([^ ]+)/)
|
||||||
const elixirVersion = elixirMatch[1]
|
const elixirVersion = elixirMatch[1]
|
||||||
const otpVersion = elixirMatch[2]
|
const otpVersion = elixirMatch[2]
|
||||||
const otpVersions = otpVersionsForElixirMap.get(elixirVersion) || []
|
const otpVersions = otpVersionsForElixirMap.get(elixirVersion) || []
|
||||||
@@ -254,6 +291,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',
|
||||||
@@ -272,18 +324,19 @@ async function getRebar3Versions() {
|
|||||||
function getVersionFromSpec(spec, versions) {
|
function getVersionFromSpec(spec, versions) {
|
||||||
let version = null
|
let version = null
|
||||||
|
|
||||||
if (core.getInput('version-type', { required: false }) === 'strict') {
|
if (
|
||||||
|
spec.match(/rc/) ||
|
||||||
|
core.getInput('version-type', { required: false }) === 'strict'
|
||||||
|
) {
|
||||||
version = spec
|
version = spec
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version === null) {
|
if (version === null) {
|
||||||
// We keep a map of semver => "spec" in order to use semver ranges to find appropriate versions
|
// We keep a map of semver => "spec" in order to use semver ranges to find appropriate versions
|
||||||
const versionsMap = versions.sort(sortVersions).reduce((acc, v) => {
|
const versionsMap = versions.sort(sortVersions).reduce((acc, v) => {
|
||||||
try {
|
if (!v.match(/rc/)) {
|
||||||
acc[semver.coerce(v).version] = v
|
// release candidates are opt-in
|
||||||
} catch {
|
acc[maybeCoerced(v)] = v
|
||||||
// some stuff can't be coerced, like 'master'
|
|
||||||
acc[v] = v
|
|
||||||
}
|
}
|
||||||
return acc
|
return acc
|
||||||
}, {})
|
}, {})
|
||||||
@@ -292,11 +345,24 @@ function getVersionFromSpec(spec, versions) {
|
|||||||
version =
|
version =
|
||||||
versionsMap[semver.maxSatisfying(Object.keys(versionsMap), rangeForMax)]
|
versionsMap[semver.maxSatisfying(Object.keys(versionsMap), rangeForMax)]
|
||||||
} else {
|
} else {
|
||||||
version = versionsMap[spec]
|
version = versionsMap[maybeCoerced(spec)]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return version
|
return version === null || version === undefined ? null : version
|
||||||
|
}
|
||||||
|
|
||||||
|
function maybeCoerced(v) {
|
||||||
|
let ret
|
||||||
|
|
||||||
|
try {
|
||||||
|
ret = semver.coerce(v).version
|
||||||
|
} catch {
|
||||||
|
// some stuff can't be coerced, like 'master'
|
||||||
|
ret = v
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
function sortVersions(left, right) {
|
function sortVersions(left, right) {
|
||||||
@@ -328,8 +394,21 @@ function getRunnerOSVersion() {
|
|||||||
win16: 'windows-2016',
|
win16: 'windows-2016',
|
||||||
win19: 'windows-2019',
|
win19: 'windows-2019',
|
||||||
}
|
}
|
||||||
|
const containerFromEnvImageOS = ImageOSToContainer[process.env.ImageOS]
|
||||||
|
|
||||||
return ImageOSToContainer[process.env.ImageOS]
|
if (!containerFromEnvImageOS) {
|
||||||
|
throw new Error(
|
||||||
|
"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: " +
|
||||||
|
"['" +
|
||||||
|
`${Object.keys(ImageOSToContainer).join("', '")}` +
|
||||||
|
"']",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return containerFromEnvImageOS
|
||||||
}
|
}
|
||||||
|
|
||||||
async function get(url0, pageIdxs) {
|
async function get(url0, pageIdxs) {
|
||||||
@@ -377,9 +456,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,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
]}.
|
||||||
|
```
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
name = "gleam_rebar3"
|
||||||
|
|
||||||
|
# repository = { type = "github", user = "my-user", repo = "gleam_rebar3" }
|
||||||
@@ -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!")
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user