mirror of
				https://github.com/actions-rs/toolchain.git
				synced 2025-10-31 12:53:52 +00:00 
			
		
		
		
	Release v1.0.6
This commit is contained in:
		
							parent
							
								
									8e14415dec
								
							
						
					
					
						commit
						b2417cde72
					
				
							
								
								
									
										19
									
								
								.eslintrc.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								.eslintrc.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| { | ||||
|   "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" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										3
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							| @ -1,3 +0,0 @@ | ||||
| liberapay: svartalf | ||||
| patreon: svartalf | ||||
| custom: ["https://svartalf.info/donate/", "https://www.buymeacoffee.com/svartalf"] | ||||
							
								
								
									
										1
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							| @ -13,6 +13,7 @@ jobs: | ||||
| 
 | ||||
|       - uses: actions/checkout@v1 | ||||
|       - run: npm ci | ||||
|       - run: npm run lint | ||||
|       - run: npm run build | ||||
|       - run: npm run test | ||||
| 
 | ||||
|  | ||||
| @ -4,6 +4,12 @@ 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). | ||||
| 
 | ||||
| ## Unreleased | ||||
| 
 | ||||
| ### Added | ||||
| 
 | ||||
| - Pass `allow-downgrade` flag to `rustup` if `nightly` toolchain with components requested | ||||
| 
 | ||||
| ## [1.0.5] - 2020-01-26 | ||||
| 
 | ||||
| ### Fixed | ||||
|  | ||||
							
								
								
									
										54
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								README.md
									
									
									
									
									
								
							| @ -1,11 +1,27 @@ | ||||
| # `rust-toolchain` Action | ||||
| 
 | ||||
| [](https://actions-rs.github.io/#sponsoring) | ||||
|  | ||||
| [](https://gitter.im/actions-rs/community) | ||||
|  | ||||
|  | ||||
| 
 | ||||
| This GitHub Action installs [Rust toolchain](https://github.com/rust-lang/rustup.rs#toolchain-specification). | ||||
| This GitHub Action installs [Rust toolchain](https://github.com/rust-lang/rustup.rs#toolchain-specification) | ||||
| with [rustup](https://github.com/rust-lang/rustup) help. | ||||
| 
 | ||||
| Optionally it can set installed toolchain as a default and as an override for current directory. | ||||
| It supports additional targets, components and profiles and handles all | ||||
| these small papercuts from 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) | ||||
| 
 | ||||
| ## Example workflow | ||||
| 
 | ||||
| @ -25,9 +41,10 @@ jobs: | ||||
|         with: | ||||
|             toolchain: nightly | ||||
|             override: true | ||||
|             components: rustfmt, clippy | ||||
| 
 | ||||
|       # `cargo check` command here will use installed `nightly` | ||||
|       # as it set as an "override" for current directory | ||||
|       # as it is set as an "override" for current directory | ||||
| 
 | ||||
|       - name: Run cargo check | ||||
|         uses: actions-rs/cargo@v1 | ||||
| @ -115,7 +132,15 @@ to install the minimal set of `nightly` toolchain components with the `rustfmt` | ||||
|     components: rustfmt, clippy | ||||
| ``` | ||||
| 
 | ||||
| Same to the `profile` input, if the installed `rustup` does not supports "components", | ||||
| 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", | ||||
| it will be automatically upgraded by this Action. | ||||
| 
 | ||||
| ## The toolchain file | ||||
| @ -123,11 +148,22 @@ it will be automatically upgraded by this Action. | ||||
| 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. | ||||
| 
 | ||||
| ## Notes | ||||
| ## License | ||||
| 
 | ||||
| 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. | ||||
| 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). | ||||
|  | ||||
| @ -1,65 +1,74 @@ | ||||
| import {toolchain_args} from "../src/args"; | ||||
| import {morph} from "mock-env" | ||||
| import {sync as tempWriteSync} from "temp-write" | ||||
| import { getToolchainArgs } 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', async () => { | ||||
|         let args = morph(() => { | ||||
|             return toolchain_args("./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", () => { | ||||
|         const args = morph( | ||||
|             () => { | ||||
|                 return getToolchainArgs("./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 () { | ||||
|         let args = morph(() => { | ||||
|             return toolchain_args("./rust-toolchain"); | ||||
|         }, { | ||||
|             'INPUT_TOOLCHAIN': 'nightly', | ||||
|     it("uses input variable if rust-toolchain file does not exist", function () { | ||||
|         const args = morph( | ||||
|             () => { | ||||
|                 return getToolchainArgs("./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"); | ||||
| 
 | ||||
|         const args = morph( | ||||
|             () => { | ||||
|                 return getToolchainArgs(rustToolchainFile); | ||||
|             }, | ||||
|             { | ||||
|                 INPUT_TOOLCHAIN: "nightly", | ||||
|             } | ||||
|         ); | ||||
| 
 | ||||
|         expect(args.name).toBe("nightly"); | ||||
|     }); | ||||
| 
 | ||||
|     it('prioritizes rust-toolchain file over input variable', function () { | ||||
|         let rustToolchainFile = tempWriteSync("1.39.0"); | ||||
|     it("uses rust-toolchain file if input does not exist", function () { | ||||
|         const 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); | ||||
|         const args = morph(() => { | ||||
|             return getToolchainArgs(rustToolchainFile); | ||||
|         }, {}); | ||||
| 
 | ||||
|         expect(args.name).toBe("1.39.0") | ||||
|         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"); | ||||
|     it("trims content of the override file", function () { | ||||
|         const rustToolchainFile = tempWriteSync("\n     1.39.0\n\n\n\n"); | ||||
| 
 | ||||
|         let args = morph(() => { | ||||
|             return toolchain_args(rustToolchainFile); | ||||
|         const args = morph(() => { | ||||
|             return getToolchainArgs(rustToolchainFile); | ||||
|         }, {}); | ||||
| 
 | ||||
|         expect(args.name).toBe("1.39.0") | ||||
|         expect(args.name).toBe("1.39.0"); | ||||
|     }); | ||||
| }); | ||||
|  | ||||
							
								
								
									
										2
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -1,11 +0,0 @@ | ||||
| module.exports = { | ||||
|   clearMocks: true, | ||||
|   moduleFileExtensions: ['js', 'ts'], | ||||
|   testEnvironment: 'node', | ||||
|   testMatch: ['**/*.test.ts'], | ||||
|   testRunner: 'jest-circus/runner', | ||||
|   transform: { | ||||
|     '^.+\\.ts$': 'ts-jest' | ||||
|   }, | ||||
|   verbose: true | ||||
| } | ||||
							
								
								
									
										11
									
								
								jest.config.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								jest.config.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| { | ||||
|   "clearMocks": true, | ||||
|   "moduleFileExtensions": ["js", "ts"], | ||||
|   "testEnvironment": "node", | ||||
|   "testMatch": ["**/*.test.ts"], | ||||
|   "testRunner": "jest-circus/runner", | ||||
|   "transform": { | ||||
|     "^.+\\.ts$": "ts-jest" | ||||
|   }, | ||||
|   "verbose": true | ||||
| } | ||||
							
								
								
									
										2220
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2220
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										38
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								package.json
									
									
									
									
									
								
							| @ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "rust-toolchain", | ||||
|     "version": "1.0.5", | ||||
|     "version": "1.0.6", | ||||
|     "private": false, | ||||
|     "description": "Install the Rust toolchain", | ||||
|     "main": "lib/main.js", | ||||
| @ -9,10 +9,12 @@ | ||||
|         "test": "__tests__" | ||||
|     }, | ||||
|     "scripts": { | ||||
|         "build": "ncc build src/main.ts --minify", | ||||
|         "watch": "ncc build src/main.ts --watch", | ||||
|         "pretest": "git config core.hooksPath .githooks", | ||||
|         "test": "jest" | ||||
|         "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" | ||||
|     }, | ||||
|     "repository": { | ||||
|         "type": "git", | ||||
| @ -30,21 +32,27 @@ | ||||
|         "url": "https://github.com/actions-rs/toolchain/issues" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@actions-rs/core": "^0.0.8", | ||||
|         "@actions/core": "^1.2.2", | ||||
|         "@actions-rs/core": "^0.0.9", | ||||
|         "@actions/core": "^1.2.3", | ||||
|         "@actions/exec": "^1.0.3", | ||||
|         "@actions/io": "^1.0.2", | ||||
|         "npm-check-updates": "^4.0.1" | ||||
|         "@actions/io": "^1.0.2" | ||||
|     }, | ||||
|     "devDependencies": { | ||||
|         "temp-write": "^4.0.0", | ||||
|         "@types/jest": "^24.9.1", | ||||
|         "@types/node": "^13.5.0", | ||||
|         "@zeit/ncc": "^0.21.0", | ||||
|         "@types/jest": "^25.1.4", | ||||
|         "@types/node": "^13.9.3", | ||||
|         "@typescript-eslint/eslint-plugin": "^2.25.0", | ||||
|         "@typescript-eslint/parser": "^2.25.0", | ||||
|         "@zeit/ncc": "^0.22.0", | ||||
|         "eslint": "^6.8.0", | ||||
|         "eslint-config-prettier": "^6.10.1", | ||||
|         "eslint-plugin-prettier": "^3.1.2", | ||||
|         "jest": "^25.1.0", | ||||
|         "jest-circus": "^25.1.0", | ||||
|         "mock-env": "^0.2.0", | ||||
|         "ts-jest": "^25.0.0", | ||||
|         "typescript": "^3.7.5" | ||||
|         "npm-check-updates": "^4.0.5", | ||||
|         "prettier": "^2.0.2", | ||||
|         "temp-write": "^4.0.0", | ||||
|         "ts-jest": "^25.2.1", | ||||
|         "typescript": "^3.8.3" | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										61
									
								
								src/args.ts
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								src/args.ts
									
									
									
									
									
								
							| @ -1,51 +1,52 @@ | ||||
| import {input} from '@actions-rs/core'; | ||||
| import {info, debug} from "@actions/core"; | ||||
| import {existsSync, readFileSync} from 'fs'; | ||||
| import { input } from "@actions-rs/core"; | ||||
| import { 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, | ||||
| } | ||||
| 
 | ||||
| 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, | ||||
|         components: components, | ||||
|     }; | ||||
|     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}); | ||||
|     const toolchainInput = input.getInput("toolchain", { required: false }); | ||||
| 
 | ||||
|     if (toolchainInput) { | ||||
|         debug(`using toolchain from input: ${toolchainInput}`); | ||||
|         return toolchainInput | ||||
|         return toolchainInput; | ||||
|     } | ||||
| 
 | ||||
|     if (!existsSync(overrideFile)) { | ||||
|         throw new Error("toolchain input was not given and repository does not have a rust-toolchain file") | ||||
|         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" | ||||
|         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"); | ||||
|     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, | ||||
|         components: components, | ||||
|     }; | ||||
| } | ||||
|  | ||||
							
								
								
									
										61
									
								
								src/main.ts
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								src/main.ts
									
									
									
									
									
								
							| @ -1,29 +1,27 @@ | ||||
| import * as core from '@actions/core'; | ||||
| import * as exec from '@actions/exec'; | ||||
| import * as io from '@actions/io'; | ||||
| import * as core from "@actions/core"; | ||||
| 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() { | ||||
| async function run(): Promise<void> { | ||||
|     // we use path.join to make sure this works on Windows, Linux and MacOS
 | ||||
|     let toolchainOverrideFile = path.join(process.cwd(), "rust-toolchain"); | ||||
|     const toolchainOverridePath = path.join(process.cwd(), "rust-toolchain"); | ||||
| 
 | ||||
|     const opts = args.toolchain_args(toolchainOverrideFile); | ||||
|     const opts = args.getToolchainArgs(toolchainOverridePath); | ||||
|     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 { | ||||
| @ -32,11 +30,11 @@ async function run() { | ||||
|     } | ||||
| 
 | ||||
|     if (opts.profile) { | ||||
|         //@ts-ignore
 | ||||
|         // @ts-ignore: TS2345
 | ||||
|         await rustup.setProfile(opts.profile); | ||||
|     } | ||||
| 
 | ||||
|     let installOptions: ToolchainOptions = { | ||||
|     const installOptions: ToolchainOptions = { | ||||
|         default: opts.default, | ||||
|         override: opts.override, | ||||
|     }; | ||||
| @ -48,6 +46,37 @@ async function run() { | ||||
|     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) { | ||||
| @ -57,7 +86,7 @@ async function run() { | ||||
|     await versions.gatherInstalledVersions(); | ||||
| } | ||||
| 
 | ||||
| async function main() { | ||||
| async function main(): Promise<void> { | ||||
|     try { | ||||
|         await run(); | ||||
|     } catch (error) { | ||||
|  | ||||
							
								
								
									
										132
									
								
								src/versions.ts
									
									
									
									
									
								
							
							
						
						
									
										132
									
								
								src/versions.ts
									
									
									
									
									
								
							| @ -1,61 +1,9 @@ | ||||
| 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']); | ||||
|     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)); | ||||
|     } | ||||
| } | ||||
| import * as exec from "@actions/exec"; | ||||
| import * as core from "@actions/core"; | ||||
| 
 | ||||
| interface Version { | ||||
|     long: string, | ||||
|     hash: string, | ||||
|     long: string; | ||||
|     hash: string; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
| @ -69,8 +17,9 @@ interface Version { | ||||
|  * As a fallback, `parseShort` function can be used. | ||||
|  */ | ||||
| function parseFull(stdout: string): Version { | ||||
|     const regex = /\S+\s((\S+)\s\((\S+)\s(\S+)\))/m; | ||||
|     stdout = stdout.trim(); | ||||
|     const matches = stdout.match(/\S+\s((\S+)\s\((\S+)\s(\S+)\))/m); | ||||
|     const matches = regex.exec(stdout); | ||||
|     if (matches == null) { | ||||
|         throw new Error(`Unable to parse version from the "${stdout}" string`); | ||||
|     } | ||||
| @ -78,25 +27,30 @@ 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 = stdout.match(/\S+\s(.+)/m); | ||||
|     const matches = regex.exec(stdout); | ||||
|     if (matches == null) { | ||||
|         core.warning(`Unable to determine version from the "${stdout}" string`); | ||||
|         return ''; | ||||
|         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) => { | ||||
|             stdout: (buffer: Buffer): void => { | ||||
|                 stdout += buffer.toString(); | ||||
|             }, | ||||
|         }, | ||||
| @ -106,3 +60,55 @@ async function getStdout(exe: string, args: string[], options?: {}): Promise<str | ||||
| 
 | ||||
|     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(); | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										7
									
								
								tsconfig.eslint.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								tsconfig.eslint.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| { | ||||
|     "extends": "./tsconfig.json", | ||||
|     "include": [ | ||||
|         "src/**/*.ts", | ||||
|         "__tests__/**/*.ts" | ||||
|     ] | ||||
| } | ||||
| @ -1,63 +1,32 @@ | ||||
| { | ||||
|     "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. */ | ||||
|         "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"] | ||||
|     }, | ||||
|   "exclude": ["node_modules", "**/*.test.ts"] | ||||
|     "include": [ | ||||
|         "src/**/*.ts" | ||||
|     ] | ||||
| } | ||||
|  | ||||
							
								
								
									
										2
									
								
								types/mock-env/index.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								types/mock-env/index.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -3,5 +3,5 @@ declare module "mock-env" { | ||||
|         callback: () => T, | ||||
|         vars: object, | ||||
|         toRemove?: string[] | ||||
|     ) | ||||
|     ): any; | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user