mirror of
https://github.com/erlef/setup-beam.git
synced 2026-07-23 07:06:07 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 988e02bfe6 | |||
| 8a644c6f28 | |||
| c988d89031 | |||
| 4fbbcf2e6c | |||
| bae9638cba | |||
| 14d4bc3919 |
@@ -41,6 +41,38 @@
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ jobs:
|
||||
name: >
|
||||
OTP ${{matrix.combo.otp-version}},
|
||||
Elixir ${{matrix.combo.elixir-version}},
|
||||
Gleam ${{matrix.combo.gleam-version}},
|
||||
rebar3 ${{matrix.combo.rebar3-version}}
|
||||
runs-on: ${{matrix.combo.os}}
|
||||
strategy:
|
||||
@@ -106,6 +107,10 @@ jobs:
|
||||
- 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:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Use erlef/setup-beam
|
||||
@@ -114,6 +119,7 @@ jobs:
|
||||
with:
|
||||
otp-version: ${{matrix.combo.otp-version}}
|
||||
elixir-version: ${{matrix.combo.elixir-version}}
|
||||
gleam-version: ${{matrix.combo.gleam-version}}
|
||||
rebar3-version: ${{matrix.combo.rebar3-version}}
|
||||
version-type: ${{matrix.combo.version-type}}
|
||||
- name: Erlang/OTP version (action)
|
||||
@@ -121,6 +127,9 @@ jobs:
|
||||
- name: Elixir version (action)
|
||||
run: echo "Elixir ${{steps.setup-beam.outputs.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)
|
||||
run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}"
|
||||
if: ${{matrix.combo.rebar3-version}}
|
||||
@@ -130,14 +139,19 @@ jobs:
|
||||
mix help local.rebar
|
||||
mix help local.hex
|
||||
if: ${{matrix.combo.elixir-version}}
|
||||
- name: Run Mix project tests
|
||||
- name: Run Elixir/Mix project tests
|
||||
run: |
|
||||
cd test-projects/mix
|
||||
cd test-projects/elixir_mix
|
||||
mix deps.get
|
||||
mix test
|
||||
if: ${{matrix.combo.elixir-version}}
|
||||
- name: Run rebar3 project tests
|
||||
- name: Run Erlang/rebar3 project tests
|
||||
run: |
|
||||
cd test-projects/rebar3
|
||||
cd test-projects/erlang_rebar3
|
||||
rebar3 ct
|
||||
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: >
|
||||
OTP ${{matrix.combo.otp-version}},
|
||||
Elixir ${{matrix.combo.elixir-version}},
|
||||
Gleam ${{matrix.combo.gleam-version}},
|
||||
rebar3 ${{matrix.combo.rebar3-version}}
|
||||
runs-on: ${{matrix.combo.os}}
|
||||
strategy:
|
||||
@@ -52,6 +53,10 @@ jobs:
|
||||
otp-version: '24'
|
||||
rebar3-version: '3.15'
|
||||
os: 'windows-latest'
|
||||
- gleam-version: '0.16'
|
||||
otp-version: '24'
|
||||
rebar3-version: '3.16'
|
||||
os: 'windows-latest'
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Use erlef/setup-beam
|
||||
@@ -60,12 +65,16 @@ jobs:
|
||||
with:
|
||||
otp-version: ${{matrix.combo.otp-version}}
|
||||
elixir-version: ${{matrix.combo.elixir-version}}
|
||||
gleam-version: ${{matrix.combo.gleam-version}}
|
||||
rebar3-version: ${{matrix.combo.rebar3-version}}
|
||||
- name: Erlang/OTP version (action)
|
||||
run: echo "Erlang/OTP ${{steps.setup-beam.outputs.otp-version}}"
|
||||
- name: Elixir version (action)
|
||||
run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}"
|
||||
if: ${{matrix.combo.elixir-version}}
|
||||
- name: Gleam version (action)
|
||||
run: echo "Gleam ${{steps.setup-beam.outputs.gleam-version}}"
|
||||
if: ${{matrix.combo.gleam-version}}
|
||||
- name: rebar3 version (action)
|
||||
run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}"
|
||||
- name: mix version and help (CLI)
|
||||
@@ -74,14 +83,19 @@ jobs:
|
||||
mix help local.rebar
|
||||
mix help local.hex
|
||||
if: ${{matrix.combo.elixir-version}}
|
||||
- name: Run Mix project tests
|
||||
- name: Run Elixir/Mix project tests
|
||||
run: |
|
||||
cd test-projects/mix
|
||||
cd test-projects/elixir_mix
|
||||
mix deps.get
|
||||
mix test
|
||||
if: ${{matrix.combo.elixir-version}}
|
||||
- name: Run rebar3 project tests
|
||||
- name: Run Erlang/rebar3 project tests
|
||||
run: |
|
||||
cd test-projects/rebar3
|
||||
cd test-projects/erlang_rebar3
|
||||
rebar3 ct
|
||||
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
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ workflow by:
|
||||
|
||||
- installing Erlang/OTP
|
||||
- optionally, installing Elixir
|
||||
- optionally, installing Gleam
|
||||
- optionally, installing `rebar3`
|
||||
- optionally, installing `hex`
|
||||
|
||||
@@ -24,13 +25,13 @@ See [action.yml](action.yml) for the action's specification.
|
||||
|
||||
**Note**: The Erlang/OTP release version specification is [relatively
|
||||
complex](http://erlang.org/doc/system_principles/versions.html#version-scheme).
|
||||
For best results, we recommend specifying exact Erlang/OTP, Elixir versions, and
|
||||
`rebar3` versions, and setting option `version-type` to `strict`.
|
||||
For best results, we recommend specifying exact
|
||||
versions, and setting option `version-type` to `strict`.
|
||||
However, values like `22.x`, or even `>22`, are also accepted, and we attempt to resolve them
|
||||
according to semantic versioning rules. This implicitly means `version-type` is `loose`,
|
||||
which is also the default value for this option.
|
||||
|
||||
Additionally, it is recommended that one specifies Erlang/OTP, Elixir and `rebar3` versions
|
||||
Additionally, it is recommended that one specifies versions
|
||||
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.
|
||||
|
||||
@@ -82,44 +83,7 @@ jobs:
|
||||
...
|
||||
```
|
||||
|
||||
### Basic 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)
|
||||
### Example (Erlang/OTP + Elixir, on Ubuntu)
|
||||
|
||||
```yaml
|
||||
# create this in .github/workflows/ci.yml
|
||||
@@ -143,7 +107,7 @@ jobs:
|
||||
- run: mix test
|
||||
```
|
||||
|
||||
### Matrix example (Erlang/OTP + `rebar3`, on Ubuntu)
|
||||
### Example (Erlang/OTP + `rebar3`, on Ubuntu)
|
||||
|
||||
```yaml
|
||||
# create this in .github/workflows/ci.yml
|
||||
@@ -166,7 +130,7 @@ jobs:
|
||||
- run: rebar3 ct
|
||||
```
|
||||
|
||||
### Basic example (Erlang/OTP + `rebar3`, on Windows)
|
||||
### Example (Erlang/OTP + `rebar3`, on Windows)
|
||||
|
||||
```yaml
|
||||
# create this in .github/workflows/ci.yml
|
||||
@@ -184,6 +148,25 @@ jobs:
|
||||
- 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
|
||||
|
||||
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.
|
||||
|
||||
@@ -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() {
|
||||
await testFailInstallOTP()
|
||||
await testFailInstallElixir()
|
||||
await testFailInstallGleam()
|
||||
await testFailInstallRebar3()
|
||||
|
||||
await testOTPVersions()
|
||||
await testElixirVersions()
|
||||
await testGleamVersions()
|
||||
await testRebar3Versions()
|
||||
|
||||
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() {
|
||||
const r3Version = '0.14.4'
|
||||
assert.rejects(
|
||||
@@ -197,6 +213,33 @@ async function testElixirVersions() {
|
||||
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() {
|
||||
let got
|
||||
let expected
|
||||
|
||||
@@ -12,6 +12,8 @@ inputs:
|
||||
description: Version range or exact version of Elixir to use
|
||||
otp-version:
|
||||
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:
|
||||
description: Whether to install Hex (with Mix)
|
||||
default: true
|
||||
@@ -29,6 +31,8 @@ outputs:
|
||||
description: Exact version of Elixir that was installed
|
||||
otp-version:
|
||||
description: Exact version of Erlang/OTP that was installed
|
||||
gleam-version:
|
||||
description: Exact version of Gleam that was installed
|
||||
rebar3-version:
|
||||
description: Exact version of rebar3 that was installed
|
||||
runs:
|
||||
|
||||
Vendored
+32
@@ -41,6 +41,38 @@
|
||||
"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
+78
-6
@@ -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.
|
||||
*
|
||||
@@ -4644,6 +4659,7 @@ function checkPlatform() {
|
||||
module.exports = {
|
||||
installOTP,
|
||||
installElixir,
|
||||
installGleam,
|
||||
installRebar3,
|
||||
checkPlatform,
|
||||
}
|
||||
@@ -4686,6 +4702,9 @@ async function main() {
|
||||
await mix(shouldMixHex, 'hex')
|
||||
}
|
||||
|
||||
const gleamSpec = core.getInput('gleam-version', { required: false })
|
||||
await maybeInstallGleam(gleamSpec)
|
||||
|
||||
const rebar3Spec = core.getInput('rebar3-version', { required: false })
|
||||
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) {
|
||||
let installed = false
|
||||
|
||||
@@ -4830,10 +4866,21 @@ async function getElixirVersion(exSpec0, otpVersion) {
|
||||
)
|
||||
}
|
||||
|
||||
const DigitStart = new RegExp('^\\d+')
|
||||
return DigitStart.test(elixirVersion)
|
||||
? `v${elixirVersionWithOTP}`
|
||||
: 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) {
|
||||
@@ -4916,6 +4963,21 @@ async function getElixirVersions() {
|
||||
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() {
|
||||
const resultJSONs = await get(
|
||||
'https://api.github.com/repos/erlang/rebar3/releases?per_page=100',
|
||||
@@ -4959,7 +5021,7 @@ function getVersionFromSpec(spec, versions) {
|
||||
}
|
||||
}
|
||||
|
||||
return version
|
||||
return version === null || version === undefined ? null : version
|
||||
}
|
||||
|
||||
function maybeCoerced(v) {
|
||||
@@ -5008,7 +5070,9 @@ function getRunnerOSVersion() {
|
||||
|
||||
if (!containerFromEnvImageOS) {
|
||||
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: " +
|
||||
"['" +
|
||||
`${Object.keys(ImageOSToContainer).join("', '")}` +
|
||||
@@ -5064,9 +5128,17 @@ async function get(url0, pageIdxs) {
|
||||
return ret
|
||||
}
|
||||
|
||||
function maybePrependWithV(versionToPrepend, specVersion) {
|
||||
const digitStart = new RegExp('^\\d+')
|
||||
return digitStart.test(specVersion)
|
||||
? `v${versionToPrepend}`
|
||||
: versionToPrepend
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getOTPVersion,
|
||||
getElixirVersion,
|
||||
getGleamVersion,
|
||||
getRebar3Version,
|
||||
getVersionFromSpec,
|
||||
}
|
||||
|
||||
Vendored
+2
-2
@@ -15,5 +15,5 @@ New-Item "$DIR_FOR_BIN" -ItemType Directory | Out-Null
|
||||
$ProgressPreference="SilentlyContinue"
|
||||
Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}"
|
||||
$ProgressPreference="Continue"
|
||||
Write-Output "Installed Erlang/OTP version follows"
|
||||
& "$DIR_FOR_BIN/bin/iex" "-v" | Write-Output
|
||||
Write-Output "Installed Elixir version follows"
|
||||
& "$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}"
|
||||
unzip -q -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}"
|
||||
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",
|
||||
"markdownlint": "markdownlint *.md",
|
||||
"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"
|
||||
},
|
||||
"husky": {
|
||||
|
||||
@@ -15,5 +15,5 @@ New-Item "$DIR_FOR_BIN" -ItemType Directory | Out-Null
|
||||
$ProgressPreference="SilentlyContinue"
|
||||
Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}"
|
||||
$ProgressPreference="Continue"
|
||||
Write-Output "Installed Erlang/OTP version follows"
|
||||
& "$DIR_FOR_BIN/bin/iex" "-v" | Write-Output
|
||||
Write-Output "Installed Elixir version follows"
|
||||
& "$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}"
|
||||
unzip -q -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}"
|
||||
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.
|
||||
*
|
||||
@@ -58,6 +73,7 @@ function checkPlatform() {
|
||||
module.exports = {
|
||||
installOTP,
|
||||
installElixir,
|
||||
installGleam,
|
||||
installRebar3,
|
||||
checkPlatform,
|
||||
}
|
||||
|
||||
+62
-6
@@ -30,6 +30,9 @@ async function main() {
|
||||
await mix(shouldMixHex, 'hex')
|
||||
}
|
||||
|
||||
const gleamSpec = core.getInput('gleam-version', { required: false })
|
||||
await maybeInstallGleam(gleamSpec)
|
||||
|
||||
const rebar3Spec = core.getInput('rebar3-version', { required: false })
|
||||
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) {
|
||||
let installed = false
|
||||
|
||||
@@ -174,10 +194,21 @@ async function getElixirVersion(exSpec0, otpVersion) {
|
||||
)
|
||||
}
|
||||
|
||||
const DigitStart = new RegExp('^\\d+')
|
||||
return DigitStart.test(elixirVersion)
|
||||
? `v${elixirVersionWithOTP}`
|
||||
: 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) {
|
||||
@@ -260,6 +291,21 @@ async function getElixirVersions() {
|
||||
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() {
|
||||
const resultJSONs = await get(
|
||||
'https://api.github.com/repos/erlang/rebar3/releases?per_page=100',
|
||||
@@ -303,7 +349,7 @@ function getVersionFromSpec(spec, versions) {
|
||||
}
|
||||
}
|
||||
|
||||
return version
|
||||
return version === null || version === undefined ? null : version
|
||||
}
|
||||
|
||||
function maybeCoerced(v) {
|
||||
@@ -352,7 +398,9 @@ function getRunnerOSVersion() {
|
||||
|
||||
if (!containerFromEnvImageOS) {
|
||||
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: " +
|
||||
"['" +
|
||||
`${Object.keys(ImageOSToContainer).join("', '")}` +
|
||||
@@ -408,9 +456,17 @@ async function get(url0, pageIdxs) {
|
||||
return ret
|
||||
}
|
||||
|
||||
function maybePrependWithV(versionToPrepend, specVersion) {
|
||||
const digitStart = new RegExp('^\\d+')
|
||||
return digitStart.test(specVersion)
|
||||
? `v${versionToPrepend}`
|
||||
: versionToPrepend
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getOTPVersion,
|
||||
getElixirVersion,
|
||||
getGleamVersion,
|
||||
getRebar3Version,
|
||||
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