37 Commits

Author SHA1 Message Date
svartalf
402d025565 Release v1.0.4 2020-01-26 18:38:00 +03:00
svartalf
5d50a12f35 Output rustc, cargo and rustup versions as Action outputs (#47) 2020-01-26 18:18:21 +03:00
svartalf
ad7f1a0189 Bumping dependencies versions in a bulk 2020-01-24 13:53:13 +03:00
Thomas Eizinger
d8323be6bd Dont prioritze rust-toolchain file over input variable (#45) 2020-01-17 15:21:07 +03:00
Thomas Eizinger
6a1db6369e Allow to override toolchain from rust-toolchain file (#35) 2020-01-13 16:31:26 +03:00
dependabot-preview[bot]
e2aeba25b2 Bump @types/node from 12.12.12 to 12.12.14
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 12.12.12 to 12.12.14.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-12-02 07:27:40 +00:00
dependabot-preview[bot]
e3ee71a17e Bump @types/node from 12.12.8 to 12.12.12
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 12.12.8 to 12.12.12.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-25 07:40:22 +00:00
dependabot-preview[bot]
1ce6b1d112 Bump @actions-rs/core from 0.0.7 to 0.0.8
Bumps [@actions-rs/core](https://github.com/actions-rs/core) from 0.0.7 to 0.0.8.
- [Release notes](https://github.com/actions-rs/core/releases)
- [Commits](https://github.com/actions-rs/core/compare/v0.0.7...v0.0.8)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-25 07:36:19 +00:00
dependabot-preview[bot]
f2024a92ea Bump ts-jest from 24.1.0 to 24.2.0
Bumps [ts-jest](https://github.com/kulshekhar/ts-jest) from 24.1.0 to 24.2.0.
- [Release notes](https://github.com/kulshekhar/ts-jest/releases)
- [Changelog](https://github.com/kulshekhar/ts-jest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/kulshekhar/ts-jest/compare/v24.1.0...v24.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-25 07:35:10 +00:00
Philipp Oppermann
6f9b172a64 Fix component example in Readme
The comment talks about a stable Rust version, but the configuration was set to nightly.
2019-11-18 14:53:28 +03:00
dependabot-preview[bot]
d03d2d0fa3 Bump @types/jest from 24.0.22 to 24.0.23
Bumps [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 24.0.22 to 24.0.23.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jest)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-18 07:40:08 +00:00
dependabot-preview[bot]
9db57f6e68 Bump @types/node from 12.12.7 to 12.12.8
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 12.12.7 to 12.12.8.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-18 07:36:17 +00:00
dependabot-preview[bot]
5d172335f8 Bump @types/node from 12.11.7 to 12.12.7
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 12.11.7 to 12.12.7.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-11 10:18:54 +00:00
dependabot-preview[bot]
a7a240846b Bump @types/jest from 24.0.20 to 24.0.22
Bumps [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 24.0.20 to 24.0.22.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jest)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-11 10:13:37 +00:00
dependabot-preview[bot]
3254cb49ae Bump typescript from 3.6.4 to 3.7.2
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 3.6.4 to 3.7.2.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v3.6.4...v3.7.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-11 10:11:56 +00:00
dependabot-preview[bot]
5ed95ab73b Bump @types/node from 12.11.1 to 12.11.7
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 12.11.1 to 12.11.7.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-28 07:58:17 +00:00
dependabot-preview[bot]
6696391ce4 Bump @types/jest from 24.0.19 to 24.0.20
Bumps [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 24.0.19 to 24.0.20.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jest)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-28 07:52:48 +00:00
svartalf
f0a61e6769 Profiles and components support 2019-10-19 13:28:57 +03:00
dependabot-preview[bot]
74865b8fc9 Bump @types/jest from 24.0.18 to 24.0.19
Bumps [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 24.0.18 to 24.0.19.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jest)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-17 06:12:18 +00:00
dependabot-preview[bot]
269db1d873 Bump @types/node from 12.7.12 to 12.11.1
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 12.7.12 to 12.11.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-17 06:09:07 +00:00
svartalf
941154aed5 Release 1.0.2 2019-10-14 18:31:15 +03:00
dependabot-preview[bot]
a919188b61 Merge pull request #11 from actions-rs/dependabot/npm_and_yarn/types/node-12.7.12 2019-10-14 15:16:26 +00:00
dependabot-preview[bot]
beaa269702 Bump typescript from 3.6.3 to 3.6.4
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 3.6.3 to 3.6.4.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v3.6.3...v3.6.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-14 18:15:08 +03:00
Lionel Faber
ad3964bd05 Use info log level when installing rustup 2019-10-14 15:19:08 +03:00
dependabot-preview[bot]
46a11bddfe Bump @types/node from 12.7.11 to 12.7.12
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 12.7.11 to 12.7.12.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-09 10:18:58 +00:00
svartalf
6715f9d030 Do not use target input as a --default-target argument for rustup 2019-10-05 23:46:29 +03:00
dependabot-preview[bot]
15b1f315b5 Bump @types/node from 12.7.8 to 12.7.11
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 12.7.8 to 12.7.11.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-05 23:41:07 +03:00
svartalf
c8dbab4109 Fancy look for the inputs list 2019-09-29 09:39:36 +03:00
dependabot-preview[bot]
003538387b Bump @types/node from 12.7.7 to 12.7.8
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 12.7.7 to 12.7.8.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-27 11:55:48 +03:00
dependabot-preview[bot]
d021bc1259 Bump @types/node from 12.7.5 to 12.7.7
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 12.7.5 to 12.7.7.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-25 10:26:07 +03:00
svartalf
8e306a9c7f Proper path for workflows configuration 2019-09-19 13:20:25 +03:00
svartalf
7ad8591ba0 CI build 2019-09-19 13:17:53 +03:00
svartalf
fa175680a2 Merge pull request #4 from actions-rs/dependabot/npm_and_yarn/actions/core-1.1.1
Bump @actions/core from 1.0.0 to 1.1.1
2019-09-19 11:11:53 +03:00
dependabot-preview[bot]
bd476ecc6b Bump @actions/core from 1.0.0 to 1.1.1
Bumps [@actions/core](https://github.com/actions/toolkit) from 1.0.0 to 1.1.1.
- [Release notes](https://github.com/actions/toolkit/releases)
- [Commits](https://github.com/actions/toolkit/compare/@actions/core@1.0.0...@actions/tool-cache@1.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-19 07:01:20 +00:00
svartalf
10382284bb Merge pull request #2 from actions-rs/dependabot/npm_and_yarn/ts-jest-24.1.0
Bump ts-jest from 24.0.2 to 24.1.0
2019-09-16 20:15:45 +03:00
svartalf
cfc1332c14 Link to recipes 2019-09-16 10:40:48 +03:00
dependabot-preview[bot]
6e4f2cb688 Bump ts-jest from 24.0.2 to 24.1.0
Bumps [ts-jest](https://github.com/kulshekhar/ts-jest) from 24.0.2 to 24.1.0.
- [Release notes](https://github.com/kulshekhar/ts-jest/releases)
- [Changelog](https://github.com/kulshekhar/ts-jest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/kulshekhar/ts-jest/compare/v24.0.2...v24.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-15 21:40:39 +00:00
16 changed files with 9483 additions and 5770 deletions

15
.githooks/pre-commit Executable file
View File

@@ -0,0 +1,15 @@
#!/bin/bash
# This commit hook checks whether we ran `npm run build` when committed TypeScript files.
# For GitHub actions to work, we need to check the compiled JavaScript into VCS.
#
# This script can yield false positives in cases where you only make stylistic changes to the TypeScript code that don't result in changes to the compiled JavaScript code.
# It is your responsibility as a developer to then commit the changes with `git commit --no-verify` and simply skip this commit hook.
TS_FILES=$(git diff --staged --name-only | grep -c '.ts')
DIST_MODIFIED=$(git diff --staged --name-only | grep -c dist/index.js)
if [ $TS_FILES -gt 0 ] && [ $DIST_MODIFIED -eq 0 ] ; then
echo "You modified TypeScript files but apparently did not run 'npm run build'".
exit 1;
fi

1
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1 @@
custom: https://svartalf.info/donate/

53
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,53 @@
name: Continuous integration
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Create npm configuration
run: echo "//npm.pkg.github.com/:_authToken=${token}" >> ~/.npmrc
env:
token: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/checkout@v1
- run: npm ci
- run: npm run build
- run: npm run test
install_stable:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: ./
with:
toolchain: stable
install_nightly:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: ./
with:
profile: minimal
toolchain: nightly
components: rustfmt, clippy
install_stable_in_docker:
runs-on: ubuntu-latest
container: ubuntu:latest # Docker image, not the GitHub Actions VM
steps:
# `rustup` will need `curl` or `wget` later
- run: apt-get update && apt-get install -y curl
- uses: actions/checkout@v1
- uses: ./
with:
toolchain: stable
install_stable_through_rust_toolchain_file:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- run: echo "stable" > ./rust-toolchain
- uses: ./

3
.gitignore vendored
View File

@@ -89,3 +89,6 @@ typings/
# DynamoDB Local files
.dynamodb/
# IntelliJ IDEs
.idea

1
.npmrc Normal file
View File

@@ -0,0 +1 @@
@actions-rs:registry=https://npm.pkg.github.com

37
CHANGELOG.md Normal file
View File

@@ -0,0 +1,37 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.0.4] - 2020-01-26
### Added
- Support for the `rust-toolchain` file: If the toolchain input is not given, we will try and install the version specified in the `rust-toolchain` file.
- Action outputs with `rustc`, `cargo` and `rustup` versions installed
## [1.0.3] - 2019-10-19
### Added
- Support for `rustup set profile` command
- Support for `--component` flag for the `rustup toolchain install` command
## [1.0.2] - 2019-10-14
### Changed
- Missing `rustup` executable will not raise an annotating warning before the installation anymore (#13)
## [1.0.1] - 2019-10-05
### Changed
- `target` input is not used as a `--default-target` argument for `rustup` anymore (#8)
## [1.0.0] - 2019-09-15
### Added
- First public version

109
README.md
View File

@@ -1,4 +1,4 @@
# `rustup toolchain` Action
# `rust-toolchain` Action
![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)
[![Gitter](https://badges.gitter.im/actions-rs/community.svg)](https://gitter.im/actions-rs/community)
@@ -19,28 +19,113 @@ jobs:
name: Rust project
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Install nightly
- uses: actions/checkout@v2
- name: Install latest nightly
uses: actions-rs/toolchain@v1
with:
toolchain: nightly
override: true
# `cargo check` command here will use installed `nightly`
# as it set as an "override" for current directory
- name: Run cargo check
uses: actions-rs/cargo@v1
with:
command: check
```
See [additional recipes here](https://github.com/actions-rs/meta).
## Inputs
* `toolchain` (*required*): Toolchain name, see [rustup page](https://github.com/rust-lang/rustup.rs#toolchain-specification) for details.\
Examples: `stable`, `nightly`, `nightly-2019-04-20`
* `target`: Additionally install specific target for this toolchain (ex. `x86_64-apple-darwin`)
* `default`: Set installed toolchain as default (executes `rustup toolchain default {TOOLCHAIN}`)
* `override`: Set installed toolchain as an override for current directory
| Name | Required | Description | Type | Default |
| ------------ | :------: | ----------------------------------------------------------------------------------------------------------------------------------------------------| ------ | --------|
| `toolchain` | | [Toolchain](https://github.com/rust-lang/rustup.rs#toolchain-specification) name to use, ex. `stable`, `nightly`, `nightly-2019-04-20`, or `1.32.0` | string | |
| `target` | | Additionally install specified target for this toolchain, ex. `x86_64-apple-darwin` | string | |
| `default` | | Set installed toolchain as a default toolchain | bool | false |
| `override` | | Set installed toolchain as an override for the current directory | bool | false |
| `profile` | | Execute `rustup set profile {value}` before installing the toolchain, ex. `minimal` | string | |
| `components` | | Comma-separated list of the additional components to install, ex. `clippy, rustfmt` | string | |
Note: since `v1.0.4` version, `toolchain` input is not marked as required
in order to support toolchain files. See the details [below](#the-toolchain-file).
## Outputs
Installed `rustc`, `cargo` and `rustup` versions can be fetched from the Action outputs:
| Name | Description | Example |
| ------------ | --------------------- | ------------------------------- |
| `rustc` | Rustc version | `1.40.0 (73528e339 2019-12-16)` |
| `rustc-hash` | Rustc version hash | `73528e339` |
| `cargo` | Cargo version | `1.40.0 (bc8e4c8be 2019-11-22)` |
| `rustup` | rustup version | `1.21.1 (7832b2ebe 2019-12-20)` |
Note: `rustc-hash` output value can be used with [actions/cache](https://github.com/actions/cache) Action
to store cache for different Rust versions, as it is unique across different Rust versions and builds (including `nightly`).
## Profiles
This Action supports rustup [profiles](https://blog.rust-lang.org/2019/10/15/Rustup-1.20.0.html#profiles),
which are can be used to speed up the workflow execution by installing the
minimally required set of components, for example:
```yaml
- name: Install minimal nightly
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: nightly
```
This Action will automatically run `rustup self update` if `profile` input is set
and the installed `rustup` version does not supports them.
In order to provide backwards compatibility for `v1` version,
there is no value for `profile` input set by default,
which means that the `default` profile is used by `rustup`
(and that includes `rust-docs`, `clippy` and `rustfmt`).\
You may want to consider using `profile: minimal` to speed up toolchain installation.
## Components
If you are going to install `clippy`, `rustfmt` or any other [rustup component](https://rust-lang.github.io/rustup-components-history/),
it might not be available in latest `nightly` build;
check out the [`actions-rs/components-nightly`](https://github.com/actions-rs/components-nightly) Action,
which makes this process much easier.
This Action supports rustup [components](https://blog.rust-lang.org/2019/10/15/Rustup-1.20.0.html#installing-the-latest-compatible-nightly) too,
and in combination with the [profiles](#profiles) input it allows to install only the needed components:
```yaml
- name: Install minimal stable with clippy and rustfmt
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
components: rustfmt, clippy
```
As an extra perk, `rustup >= 1.20.0` is able to find the most recent `nightly` toolchain
with the requested components available; next example is utilizing this feature
to install the minimal set of `nightly` toolchain components with the `rustfmt` and `clippy` extras:
```yaml
- name: Install minimal nightly with clippy and rustfmt
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: nightly
components: rustfmt, clippy
```
Same to the `profile` input, if the installed `rustup` does not supports "components",
it will be automatically upgraded by this Action.
## The toolchain file
This Action supports [toolchain files](https://github.com/rust-lang/rustup#the-toolchain-file),
so it is not necessary to use `toolchain` input anymore.
Input has higher priority, so if you are want to use toolchain file, you need to remove the input from the workflow file.
If neither `toolchain` input or `rust-toolchain` file are provided, Action execution will fail.
## Notes

View File

@@ -1,22 +1,65 @@
import * as args from '../src/args'
const testEnvVars = {
INPUT_TOOLCHAIN: 'nightly-2019-04-20',
INPUT_DEFAULT: 'false',
INPUT_OVERRIDE: 'true'
}
import {toolchain_args} from "../src/args";
import {morph} from "mock-env"
import {sync as tempWriteSync} from "temp-write"
describe('actions-rs/toolchain', () => {
beforeEach(() => {
for (const key in testEnvVars)
process.env[key] = testEnvVars[key as keyof typeof testEnvVars]
})
it('Parses action input into toolchain options', async () => {
const result = args.toolchain_args();
let args = morph(() => {
return toolchain_args("./rust-toolchain");
}, {
'INPUT_TOOLCHAIN': 'nightly-2019-04-20',
'INPUT_DEFAULT': 'false',
'INPUT_OVERRIDE': 'true'
});
expect(result.name).toBe('nightly-2019-04-20');
expect(result.default).toBe(false);
expect(result.override).toBe(true);
expect(args.name).toBe('nightly-2019-04-20');
expect(args.default).toBe(false);
expect(args.override).toBe(true);
});
it('uses input variable if rust-toolchain file does not exist', function () {
let args = morph(() => {
return toolchain_args("./rust-toolchain");
}, {
'INPUT_TOOLCHAIN': 'nightly',
});
expect(args.name).toBe("nightly")
});
it('toolchain input is required if rust-toolchain does not exist', function () {
expect(() => toolchain_args("./rust-toolchain")).toThrowError()
});
it('prioritizes rust-toolchain file over input variable', function () {
let rustToolchainFile = tempWriteSync("1.39.0");
let args = morph(() => {
return toolchain_args(rustToolchainFile);
}, {
'INPUT_TOOLCHAIN': 'nightly',
});
expect(args.name).toBe("nightly")
});
it('uses rust-toolchain file if input does not exist', function () {
let rustToolchainFile = tempWriteSync("1.39.0");
let args = morph(() => {
return toolchain_args(rustToolchainFile);
}, {});
expect(args.name).toBe("1.39.0")
});
it('trims content of the override file', function () {
let rustToolchainFile = tempWriteSync("\n 1.39.0\n\n\n\n");
let args = morph(() => {
return toolchain_args(rustToolchainFile);
}, {});
expect(args.name).toBe("1.39.0")
});
});

View File

@@ -10,6 +10,9 @@ inputs:
Rust toolchain name.
See https://github.com/rust-lang/rustup.rs#toolchain-specification
If this is not given, the action will try and install the version specified in the `rust-toolchain` file.
required: false
target:
description: Target triple to install for this toolchain
required: false
@@ -19,6 +22,12 @@ inputs:
override:
description: Set installed toolchain as an override for a directory
default: false
profile:
description: Name of the group of components to be installed for a new toolchain
required: false
components:
description: Comma-separated list of components to be additionally installed for a new toolchain
required: false
runs:
using: 'node12'

2
dist/index.js vendored

File diff suppressed because one or more lines are too long

14642
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "rust-toolchain",
"version": "1.0.0",
"version": "1.0.4",
"private": false,
"description": "Install the Rust toolchain",
"main": "lib/main.js",
@@ -11,6 +11,7 @@
"scripts": {
"build": "ncc build src/main.ts --minify",
"watch": "ncc build src/main.ts --watch",
"pretest": "git config core.hooksPath .githooks",
"test": "jest"
},
"repository": {
@@ -29,18 +30,21 @@
"url": "https://github.com/actions-rs/toolchain/issues"
},
"dependencies": {
"@actions/core": "^1.0.0",
"@actions/exec": "^1.0.0",
"@actions/io": "^1.0.0",
"download": "^7.1.0"
"@actions-rs/core": "^0.0.8",
"@actions/core": "^1.2.2",
"@actions/exec": "^1.0.3",
"@actions/io": "^1.0.2",
"npm-check-updates": "^4.0.1"
},
"devDependencies": {
"@types/jest": "^24.0.13",
"@types/node": "^12.7.5",
"@zeit/ncc": "^0.20.5",
"jest": "^24.9.0",
"jest-circus": "^24.9.0",
"ts-jest": "^24.0.2",
"typescript": "^3.5.1"
"temp-write": "^4.0.0",
"@types/jest": "^24.9.1",
"@types/node": "^13.5.0",
"@zeit/ncc": "^0.21.0",
"jest": "^25.1.0",
"jest-circus": "^25.1.0",
"mock-env": "^0.2.0",
"ts-jest": "^25.0.0",
"typescript": "^3.7.5"
}
}

View File

@@ -1,43 +1,51 @@
import * as core from '@actions/core';
// Workaround for a GH bug: https://github.com/actions/toolkit/issues/127
//
// For input `all-features: true` it will generate the `INPUT_ALL-FEATURES: true`
// env variable, which looks too weird.
// Here we are trying to get proper name `INPUT_NO_DEFAULT_FEATURES` first,
// and if it does not exist, trying the `INPUT_NO-DEFAULT-FEATURES`
function getInput(name: string, options?: core.InputOptions): string {
const inputFullName = name.replace(/-/g, '_');
let value = core.getInput(inputFullName, options);
if (value.length > 0) {
return value
}
return core.getInput(name)
}
function inputBoolean(name: string): boolean {
const value = getInput(name);
if (value == 'true' || value == '1') {
return true;
} else {
return false;
}
}
import {input} from '@actions-rs/core';
import {info, debug} from "@actions/core";
import {existsSync, readFileSync} from 'fs';
export interface ToolchainOptions {
name: string,
target?: string,
target: string | undefined,
default: boolean,
override: boolean
override: boolean,
profile: string | undefined,
components: string[] | undefined,
}
export function toolchain_args(): ToolchainOptions {
export function toolchain_args(overrideFile: string): ToolchainOptions {
let components: string[] | undefined = input.getInputList('components');
if (components && components.length === 0) {
components = undefined;
}
return {
name: getInput('toolchain', {required: true}),
target: getInput('target') || undefined,
default: inputBoolean('default'),
override: inputBoolean('override')
name: determineToolchain(overrideFile),
target: input.getInput('target') || undefined,
default: input.getInputBool('default'),
override: input.getInputBool('override'),
profile: input.getInput('profile') || undefined,
components: components,
};
}
function determineToolchain(overrideFile: string): string {
const toolchainInput = input.getInput('toolchain', {required: false});
if (toolchainInput) {
debug(`using toolchain from input: ${toolchainInput}`);
return toolchainInput
}
if (!existsSync(overrideFile)) {
throw new Error("toolchain input was not given and repository does not have a rust-toolchain file")
}
const rustToolchainFile = readFileSync(overrideFile, {
encoding: "utf-8",
flag: "r"
}).trim();
debug(`using toolchain from rust-toolchain file: ${rustToolchainFile}`);
return rustToolchainFile;
}

View File

@@ -1,94 +1,60 @@
const os = require('os');
const fs = require('fs');
const path = require('path');
const https = require('https');
const download = require('download');
import * as core from '@actions/core';
import * as exec from '@actions/exec';
import * as io from '@actions/io';
import path from "path";
import * as args from './args';
function downloadRustInit(url: string, name: string): Promise<string> {
const absPath = path.join(os.tmpdir(), name);
return new Promise((resolve, reject) => {
let req = download(url);
let output = fs.createWriteStream(absPath, {
mode: 0o755
});
req.pipe(output);
req.on('end', () => {
output.close(resolve);
});
req.on('error', reject);
output.on('error', reject);
})
.then(() => {
return absPath;
});
}
async function get_rustup(toolchain: string, target?: string): Promise<string> {
try {
const foundPath = await io.which('rustup', true);
core.debug(`Found rustup at ${foundPath}`);
return foundPath;
} catch (error) {
core.warning('Unable to find rustup, installing it now');
}
let args = [
'-y',
'--default-toolchain',
toolchain,
];
if (target) {
args.push('--default-host');
args.push(target);
}
switch (process.platform) {
case 'darwin':
case 'linux': // Should be installed already, but just in case
const rustupSh = await downloadRustInit('https://sh.rustup.rs', 'rustup-init.sh');
await exec.exec(rustupSh, args);
break;
case 'win32':
const rustupExe = await downloadRustInit('http://win.rustup.rs', 'rustup-init.exe');
await exec.exec(rustupExe, args);
break;
default:
throw new Error(`Unknown platform ${process.platform}, can't install rustup`);
}
core.addPath(path.join(process.env['HOME'], '.cargo', 'bin'));
return 'rustup';
}
import * as versions from './versions';
import {RustUp, ToolchainOptions} from '@actions-rs/core';
async function run() {
const opts = args.toolchain_args();
const rustup = await get_rustup(opts.name, opts.target);
// we use path.join to make sure this works on Windows, Linux and MacOS
let toolchainOverrideFile = path.join(process.cwd(), "rust-toolchain");
await exec.exec(rustup, ['toolchain', 'install', opts.name]);
const opts = args.toolchain_args(toolchainOverrideFile);
const rustup = await RustUp.getOrInstall();
await rustup.call(['show']);
if (opts.default) {
await exec.exec(rustup, ['default', opts.name]);
let shouldSelfUpdate = false;
if (opts.profile && !await rustup.supportProfiles()) {
shouldSelfUpdate = true;
}
if (opts.components && !await rustup.supportComponents()) {
shouldSelfUpdate = true;
}
if (shouldSelfUpdate) {
core.startGroup('Updating rustup');
try {
await rustup.selfUpdate();
} finally {
core.endGroup();
}
}
if (opts.override) {
await exec.exec(rustup, ['override', 'set', opts.name]);
if (opts.profile) {
//@ts-ignore
await rustup.setProfile(opts.profile);
}
let installOptions: ToolchainOptions = {
default: opts.default,
override: opts.override,
};
if (opts.components) {
installOptions.components = opts.components;
}
// We already did it just now, there is no reason to do that again,
// so it would skip few network calls.
if (shouldSelfUpdate) {
installOptions.noSelfUpdate = true;
}
await rustup.installToolchain(opts.name, installOptions);
if (opts.target) {
await exec.exec(rustup, ['target', 'add', '--toolchain', opts.name, opts.target]);
await rustup.addTarget(opts.target, opts.name);
}
await versions.gatherInstalledVersions();
}
async function main() {

77
src/versions.ts Normal file
View File

@@ -0,0 +1,77 @@
import * as exec from '@actions/exec';
import * as core from '@actions/core';
export async function gatherInstalledVersions(): Promise<void> {
try {
core.startGroup('Gathering installed versions');
await rustc();
await cargo();
await rustup();
} finally {
core.endGroup();
}
}
/**
* Fetch currently used `rustc` version
*/
async function rustc(): Promise<void> {
const stdout = await getStdout('rustc', ['-V']);
const version = parse(stdout);
core.setOutput('rustc', version.long);
core.setOutput('rustc-hash', version.hash);
}
/**
* Fetch currently used `cargo` version
*/
async function cargo(): Promise<void> {
const stdout = await getStdout('cargo', ['-V']);
const version = parse(stdout);
core.setOutput('cargo', version.long);
// core.setOutput('cargo_short', version.short);
}
async function rustup(): Promise<void> {
const stdout = await getStdout('rustup', ['-V']);
const version = parse(stdout);
core.setOutput('rustup', version.long);
// core.setOutput('rustup_short', version.short);
}
interface Version {
long: string,
hash: string,
}
function parse(stdout: string): Version {
stdout = stdout.trim();
const matches = stdout.match(/\S+\s((\S+)\s\((\S+)\s(\S+)\))/m);
if (matches == null) {
throw new Error(`Unable to parse version from the "${stdout}" string`);
}
return {
long: matches[1],
hash: matches[3],
}
}
async function getStdout(exe: string, args: string[], options?: {}): Promise<string> {
let stdout = '';
const resOptions = Object.assign({}, options, {
listeners: {
stdout: (buffer: Buffer) => {
stdout += buffer.toString();
},
},
});
await exec.exec(exe, args, resOptions);
return stdout;
}

7
types/mock-env/index.d.ts vendored Normal file
View File

@@ -0,0 +1,7 @@
declare module "mock-env" {
function morph<T>(
callback: () => T,
vars: object,
toRemove?: string[]
)
}