Compare commits

..

No commits in common. "master" and "v1.0.4" have entirely different histories.

19 changed files with 4975 additions and 4139 deletions

View File

@ -1,19 +0,0 @@
{
"parser": "@typescript-eslint/parser",
"parserOptions": {
"project": "./tsconfig.eslint.json"
},
"plugins": ["@typescript-eslint"],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended-requiring-type-checking",
"plugin:@typescript-eslint/recommended",
"plugin:prettier/recommended",
"prettier",
"prettier/@typescript-eslint"
],
"rules": {
"@typescript-eslint/ban-ts-ignore": "off"
}
}

View File

@ -6,7 +6,7 @@
# 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$')
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

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

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

View File

@ -13,36 +13,16 @@ jobs:
- uses: actions/checkout@v1
- run: npm ci
# Temporary disabling in order to release urgent fix
# - run: npm run lint
- run: npm run build
- run: npm run test
install_stable:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os:
- ubuntu-latest
- macOS-latest
- windows-latest
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- id: toolchain
uses: ./
- uses: ./
with:
toolchain: stable
- name: Test toolchain outputs
env:
RUSTC: ${{ steps.toolchain.outputs.rustc }}
RUSTC_HASH: ${{ steps.toolchain.outputs.rustc_hash }}
CARGO: ${{ steps.toolchain.outputs.cargo }}
RUSTUP: ${{ steps.toolchain.outputs.rustup }}
run: |
echo $RUSTC
echo $RUSTC_HASH
echo $CARGO
echo $RUSTUP
install_nightly:
runs-on: ubuntu-latest

View File

@ -4,18 +4,6 @@ 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.6] - 2020-03-24
### Added
- Pass `allow-downgrade` flag to `rustup` if `nightly` toolchain with components requested
## [1.0.5] - 2020-01-26
### Fixed
- `rustup` version parser does not fail Action execution on `macOS-latest` VM images anymore
## [1.0.4] - 2020-01-26
### Added

View File

@ -1,27 +1,11 @@
# `rust-toolchain` Action
[![Sponsoring](https://img.shields.io/badge/Support%20it-Say%20%22Thank%20you!%22-blue)](https://actions-rs.github.io/#sponsoring)
![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)
![Continuous integration](https://github.com/actions-rs/toolchain/workflows/Continuous%20integration/badge.svg)
![Dependabot enabled](https://api.dependabot.com/badges/status?host=github&repo=actions-rs/toolchain)
This GitHub Action installs [Rust toolchain](https://rust-lang.github.io/rustup/concepts/toolchains.html#toolchain-specification)
with [rustup](https://github.com/rust-lang/rustup) help.
This GitHub Action installs [Rust toolchain](https://github.com/rust-lang/rustup.rs#toolchain-specification).
It supports additional targets, components and profiles and handles all
these small papercuts for you.
**Table of Contents**
* [Example workflow](#example-workflow)
* [Inputs](#inputs)
* [Outputs](#outputs)
* [Profiles](#profiles)
* [Components](#components)
* [The toolchain file](#the-toolchain-file)
* [License](#license)
* [Contribute and support](#contribute-and-support)
Optionally it can set installed toolchain as a default and as an override for current directory.
## Example workflow
@ -41,10 +25,9 @@ jobs:
with:
toolchain: nightly
override: true
components: rustfmt, clippy
# `cargo check` command here will use installed `nightly`
# as it is set as an "override" for current directory
# as it set as an "override" for current directory
- name: Run cargo check
uses: actions-rs/cargo@v1
@ -58,11 +41,11 @@ See [additional recipes here](https://github.com/actions-rs/meta).
| 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 | stable |
| `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 | default |
| `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
@ -75,11 +58,11 @@ Installed `rustc`, `cargo` and `rustup` versions can be fetched from the Action
| Name | Description | Example |
| ------------ | --------------------- | ------------------------------- |
| `rustc` | Rustc version | `1.40.0 (73528e339 2019-12-16)` |
| `rustc_hash` | Rustc version hash | `73528e339` |
| `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
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
@ -132,38 +115,19 @@ to install the minimal set of `nightly` toolchain components with the `rustfmt`
components: rustfmt, clippy
```
In case if `nightly` toolchain is requested and one of the components is missing in
latest `nightly` release, this Action will attempt the downgrade till it find
the most recent `nightly` with all components needed.\
Note that this behavior will work only if the following two conditions apply:
1. `toolchain` input is `nightly` exactly.
2. At least one component is provided in `components` input.
Same to the `profile` input, if installed `rustup` does not supports "components",
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://rust-lang.github.io/rustup/overrides.html#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.
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.
If neither `toolchain` input or `rust-toolchain` file are provided, Action execution will fail.
## License
## Notes
This Action is distributed under the terms of the MIT license, see [LICENSE](https://github.com/actions-rs/toolchain/blob/master/LICENSE) for details.
## Contribute and support
Any contributions are welcomed!
If you want to report a bug or have a feature request,
check the [Contributing guide](https://github.com/actions-rs/.github/blob/master/CONTRIBUTING.md).
You can also support author by funding the ongoing project work,
see [Sponsoring](https://actions-rs.github.io/#sponsoring).
As `rustup` is not installed by default for [macOS environments](https://help.github.com/en/articles/virtual-environments-for-github-actions)
at the moment (2019-09-13), this Action will try its best to install it before any other operations.

View File

@ -1,74 +1,65 @@
import { getToolchainArgs } from "../src/args";
import { morph } from "mock-env";
import { sync as tempWriteSync } from "temp-write";
import {toolchain_args} from "../src/args";
import {morph} from "mock-env"
import {sync as tempWriteSync} from "temp-write"
describe("actions-rs/toolchain", () => {
it("Parses action input into toolchain options", () => {
const args = morph(
() => {
return getToolchainArgs("./rust-toolchain");
},
{
INPUT_TOOLCHAIN: "nightly-2019-04-20",
INPUT_DEFAULT: "false",
INPUT_OVERRIDE: "true",
}
);
describe('actions-rs/toolchain', () => {
it('Parses action input into toolchain options', async () => {
let args = morph(() => {
return toolchain_args("./rust-toolchain");
}, {
'INPUT_TOOLCHAIN': 'nightly-2019-04-20',
'INPUT_DEFAULT': 'false',
'INPUT_OVERRIDE': 'true'
});
expect(args.name).toBe("nightly-2019-04-20");
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 () {
const args = morph(
() => {
return getToolchainArgs("./rust-toolchain");
},
{
INPUT_TOOLCHAIN: "nightly",
}
);
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");
expect(args.name).toBe("nightly")
});
it("toolchain input is required if rust-toolchain does not exist", function () {
expect(() => getToolchainArgs("./rust-toolchain")).toThrowError();
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 () {
const rustToolchainFile = tempWriteSync("1.39.0");
it('prioritizes rust-toolchain file over input variable', function () {
let rustToolchainFile = tempWriteSync("1.39.0");
const args = morph(
() => {
return getToolchainArgs(rustToolchainFile);
},
{
INPUT_TOOLCHAIN: "nightly",
}
);
let args = morph(() => {
return toolchain_args(rustToolchainFile);
}, {
'INPUT_TOOLCHAIN': 'nightly',
});
expect(args.name).toBe("nightly");
expect(args.name).toBe("nightly")
});
it("uses rust-toolchain file if input does not exist", function () {
const rustToolchainFile = tempWriteSync("1.39.0");
it('uses rust-toolchain file if input does not exist', function () {
let rustToolchainFile = tempWriteSync("1.39.0");
const args = morph(() => {
return getToolchainArgs(rustToolchainFile);
let args = morph(() => {
return toolchain_args(rustToolchainFile);
}, {});
expect(args.name).toBe("1.39.0");
expect(args.name).toBe("1.39.0")
});
it("trims content of the override file", function () {
const rustToolchainFile = tempWriteSync("\n 1.39.0\n\n\n\n");
it('trims content of the override file', function () {
let rustToolchainFile = tempWriteSync("\n 1.39.0\n\n\n\n");
const args = morph(() => {
return getToolchainArgs(rustToolchainFile);
let args = morph(() => {
return toolchain_args(rustToolchainFile);
}, {});
expect(args.name).toBe("1.39.0");
expect(args.name).toBe("1.39.0")
});
});

View File

@ -9,7 +9,7 @@ inputs:
description: |
Rust toolchain name.
See https://rust-lang.github.io/rustup/concepts/toolchains.html#toolchain-specification
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
@ -29,16 +29,6 @@ inputs:
description: Comma-separated list of components to be additionally installed for a new toolchain
required: false
outputs:
rustc:
description: Installed Rustc version
rustc_hash:
description: Installed Rustc version hash, can be used for caching purposes
cargo:
description: Installed Cargo version
rustup:
description: Installed rustup version
runs:
using: 'node12'
main: 'dist/index.js'

2
dist/index.js vendored

File diff suppressed because one or more lines are too long

11
jest.config.js Normal file
View File

@ -0,0 +1,11 @@
module.exports = {
clearMocks: true,
moduleFileExtensions: ['js', 'ts'],
testEnvironment: 'node',
testMatch: ['**/*.test.ts'],
testRunner: 'jest-circus/runner',
transform: {
'^.+\\.ts$': 'ts-jest'
},
verbose: true
}

View File

@ -1,11 +0,0 @@
{
"clearMocks": true,
"moduleFileExtensions": ["js", "ts"],
"testEnvironment": "node",
"testMatch": ["**/*.test.ts"],
"testRunner": "jest-circus/runner",
"transform": {
"^.+\\.ts$": "ts-jest"
},
"verbose": true
}

8448
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.7",
"version": "1.0.4",
"private": false,
"description": "Install the Rust toolchain",
"main": "lib/main.js",
@ -9,12 +9,10 @@
"test": "__tests__"
},
"scripts": {
"build": "rm -rf ./dist/* && ncc build src/main.ts --minify",
"format": "prettier --write 'src/**/*.ts' '__tests__/**/*.ts'",
"lint": "tsc --noEmit && eslint 'src/**/*.ts' '__tests__/**/*.ts'",
"watch": "rm -rf ./dist/* && ncc build src/main.ts --watch",
"test": "jest -c jest.config.json",
"pretest": "git config core.hooksPath .githooks"
"build": "ncc build src/main.ts --minify",
"watch": "ncc build src/main.ts --watch",
"pretest": "git config core.hooksPath .githooks",
"test": "jest"
},
"repository": {
"type": "git",
@ -32,27 +30,21 @@
"url": "https://github.com/actions-rs/toolchain/issues"
},
"dependencies": {
"@actions-rs/core": "^0.1.6",
"@actions/core": "^1.2.6",
"@actions/exec": "^1.0.4",
"@actions/io": "^1.0.2"
"@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": "^26.0.15",
"@types/node": "^14.14.7",
"@typescript-eslint/eslint-plugin": "^4.8.1",
"@typescript-eslint/parser": "^4.8.1",
"@zeit/ncc": "^0.22.3",
"eslint": "^7.13.0",
"eslint-config-prettier": "^6.15.0",
"eslint-plugin-prettier": "^3.1.4",
"jest": "^26.6.3",
"jest-circus": "^26.6.3",
"mock-env": "^0.2.0",
"npm-check-updates": "^10.2.1",
"prettier": "^2.1.2",
"temp-write": "^4.0.0",
"ts-jest": "^26.4.4",
"typescript": "^4.0.5"
"@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,52 +1,51 @@
import { input } from "@actions-rs/core";
import { debug } from "@actions/core";
import { existsSync, readFileSync } from "fs";
import {input} from '@actions-rs/core';
import {info, debug} from "@actions/core";
import {existsSync, readFileSync} from 'fs';
export interface ToolchainOptions {
name: string;
target: string | undefined;
default: boolean;
override: boolean;
profile: string | undefined;
components: string[] | undefined;
name: string,
target: string | undefined,
default: boolean,
override: boolean,
profile: string | undefined,
components: string[] | undefined,
}
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;
}
export function getToolchainArgs(overrideFile: string): ToolchainOptions {
let components: string[] | undefined = input.getInputList("components");
export function toolchain_args(overrideFile: string): ToolchainOptions {
let components: string[] | undefined = input.getInputList('components');
if (components && components.length === 0) {
components = undefined;
}
return {
name: determineToolchain(overrideFile),
target: input.getInput("target") || undefined,
default: input.getInputBool("default"),
override: input.getInputBool("override"),
profile: input.getInput("profile") || undefined,
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,27 +1,29 @@
import * as core from "@actions/core";
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";
import * as versions from "./versions";
import { RustUp, ToolchainOptions } from "@actions-rs/core";
import * as args from './args';
import * as versions from './versions';
import {RustUp, ToolchainOptions} from '@actions-rs/core';
async function run(): Promise<void> {
async function run() {
// we use path.join to make sure this works on Windows, Linux and MacOS
const toolchainOverridePath = path.join(process.cwd(), "rust-toolchain");
let toolchainOverrideFile = path.join(process.cwd(), "rust-toolchain");
const opts = args.getToolchainArgs(toolchainOverridePath);
const opts = args.toolchain_args(toolchainOverrideFile);
const rustup = await RustUp.getOrInstall();
await rustup.call(["show"]);
await rustup.call(['show']);
let shouldSelfUpdate = false;
if (opts.profile && !(await rustup.supportProfiles())) {
if (opts.profile && !await rustup.supportProfiles()) {
shouldSelfUpdate = true;
}
if (opts.components && !(await rustup.supportComponents())) {
if (opts.components && !await rustup.supportComponents()) {
shouldSelfUpdate = true;
}
if (shouldSelfUpdate) {
core.startGroup("Updating rustup");
core.startGroup('Updating rustup');
try {
await rustup.selfUpdate();
} finally {
@ -30,11 +32,11 @@ async function run(): Promise<void> {
}
if (opts.profile) {
// @ts-ignore: TS2345
//@ts-ignore
await rustup.setProfile(opts.profile);
}
const installOptions: ToolchainOptions = {
let installOptions: ToolchainOptions = {
default: opts.default,
override: opts.override,
};
@ -46,37 +48,6 @@ async function run(): Promise<void> {
if (shouldSelfUpdate) {
installOptions.noSelfUpdate = true;
}
// Extra funny case.
// Due to `rustup` issue (https://github.com/rust-lang/rustup/issues/2146)
// right now installing `nightly` toolchain with extra components might fail
// if that specific `nightly` version does not have this component
// available.
//
// See https://github.com/actions-rs/toolchain/issues/53 also.
//
// By default `rustup` does not downgrade, as it does when you are
// updating already installed `nightly`, so we need to pass the
// corresponding flag manually.
//
// We are doing it only if both following conditions apply:
//
// 1. Requested toolchain is `"nightly"` (exact string match).
// 2. At least one component is requested.
//
// All other cases are not triggering automatic downgrade,
// for example, installing specific nightly version
// as in `"nightly-2020-03-20"` or `"stable"`.
//
// Motivation is that users probably want the latest one nightly
// with rustfmt and clippy (miri, etc) and they don't really care
// about what exact nightly it is.
// In case if it's not the nightly at all or it is a some specific
// nightly version, they know what they are doing.
if (opts.name == "nightly" && opts.components) {
installOptions.allowDowngrade = true;
}
await rustup.installToolchain(opts.name, installOptions);
if (opts.target) {
@ -86,7 +57,7 @@ async function run(): Promise<void> {
await versions.gatherInstalledVersions();
}
async function main(): Promise<void> {
async function main() {
try {
await run();
} catch (error) {

View File

@ -1,25 +1,56 @@
import * as exec from "@actions/exec";
import * as core from "@actions/core";
import * as exec from '@actions/exec';
import * as core from '@actions/core';
interface Version {
long: string;
hash: string;
export async function gatherInstalledVersions(): Promise<void> {
try {
core.startGroup('Gathering installed versions');
await rustc();
await cargo();
await rustup();
} finally {
core.endGroup();
}
}
/**
* Try to parse the version parts and return them.
*
* It is important to note that some components are not providing
* all the expected information, ex. `rustup` on `macOS-latest` VM image
* does not has the hash in the version string,
* so this function might throw an error.
*
* As a fallback, `parseShort` function can be used.
* Fetch currently used `rustc` version
*/
function parseFull(stdout: string): Version {
const regex = /\S+\s((\S+)\s\((\S+)\s(\S+)\))/m;
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 = regex.exec(stdout);
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`);
}
@ -27,30 +58,14 @@ function parseFull(stdout: string): Version {
return {
long: matches[1],
hash: matches[3],
};
}
function parseShort(stdout: string): string {
const regex = /\S+\s(.+)/m;
stdout = stdout.trim();
const matches = regex.exec(stdout);
if (matches == null) {
core.warning(`Unable to determine version from the "${stdout}" string`);
return "";
} else {
return matches[1];
}
}
async function getStdout(
exe: string,
args: string[],
options?: {}
): Promise<string> {
let stdout = "";
async function getStdout(exe: string, args: string[], options?: {}): Promise<string> {
let stdout = '';
const resOptions = Object.assign({}, options, {
listeners: {
stdout: (buffer: Buffer): void => {
stdout: (buffer: Buffer) => {
stdout += buffer.toString();
},
},
@ -60,55 +75,3 @@ async function getStdout(
return stdout;
}
/**
* Fetch currently used `rustc` version
*/
async function rustc(): Promise<void> {
const stdout = await getStdout("rustc", ["-V"]);
try {
const version = parseFull(stdout);
core.setOutput("rustc", version.long);
core.setOutput("rustc_hash", version.hash);
} catch (e) {
core.warning(e);
core.setOutput("rustc", parseShort(stdout));
}
}
/**
* Fetch currently used `cargo` version
*/
async function cargo(): Promise<void> {
const stdout = await getStdout("cargo", ["-V"]);
try {
const version = parseFull(stdout);
core.setOutput("cargo", version.long);
} catch (e) {
core.setOutput("cargo", parseShort(stdout));
}
}
async function rustup(): Promise<void> {
const stdout = await getStdout("rustup", ["-V"]);
try {
const version = parseFull(stdout);
core.setOutput("rustup", version.long);
} catch (e) {
core.setOutput("rustup", parseShort(stdout));
}
}
export async function gatherInstalledVersions(): Promise<void> {
try {
core.startGroup("Gathering installed versions");
await rustc();
await cargo();
await rustup();
} finally {
core.endGroup();
}
}

View File

@ -1,7 +0,0 @@
{
"extends": "./tsconfig.json",
"include": [
"src/**/*.ts",
"__tests__/**/*.ts"
]
}

View File

@ -1,32 +1,63 @@
{
"compilerOptions": {
"allowJs": false,
"checkJs": false,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"module": "commonjs",
"moduleResolution": "node",
"newLine": "LF",
"noEmitOnError": true,
"noErrorTruncation": true,
"noFallthroughCasesInSwitch": true,
"noImplicitAny": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"outDir": "dist",
"pretty": true,
"removeComments": true,
"resolveJsonModule": true,
"strict": true,
"suppressImplicitAnyIndexErrors": false,
"target": "es2018",
"declaration": false,
"sourceMap": false,
"typeRoots": ["./types", "./node_modules/@types"]
},
"include": [
"src/**/*.ts"
]
"compilerOptions": {
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
"outDir": "./lib", /* Redirect output structure to the directory. */
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "composite": true, /* Enable project compilation */
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* Strict Type-Checking Options */
"strict": true, /* Enable all strict type-checking options. */
"noImplicitAny": false, /* Raise error on expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
},
"exclude": ["node_modules", "**/*.test.ts"]
}

View File

@ -3,5 +3,5 @@ declare module "mock-env" {
callback: () => T,
vars: object,
toRemove?: string[]
): any;
)
}