diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..ba2a6f4 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,18 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-case-conflict + - id: check-executables-have-shebangs + - id: check-merge-conflict + - id: check-json + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + args: [--markdown-linebreak-ext=md] + - repo: https://github.com/python-jsonschema/check-jsonschema + rev: 0.29.2 + hooks: + - id: check-dependabot + - id: check-github-actions + - id: check-github-workflows diff --git a/CHANGELOG.md b/CHANGELOG.md index acd52af..a637784 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.12.0] - 2025-04-23 + +* Add support for installing rustup on Windows (#58 by @maennchen) + This adds support for using Rust on the GitHub provided Windows ARM runners. + +## [1.11.0] - 2025-02-24 + +* Add new parameter `cache-bin` that is propagated to `Swatinem/rust-cache` as `cache-bin` (#51 by @enkhjile) +* Add new parameter `cache-shared-key` that is propagated to `Swatinem/rust-cache` as `shared-key` (#52 by @skanehira) + +## [1.10.1] - 2024-10-01 + +* Fix problem matcher for rustfmt output. + The format has changed since https://github.com/rust-lang/rustfmt/pull/5971 and now follows the form "filename:line". + Thanks to @0xcypher02 for pointing out the problem. + +## [1.10.0] - 2024-09-23 + +* Add new parameter `cache-directories` that is propagated to `Swatinem/rust-cache` (#44 by @pranc1ngpegasus) +* Add new parameter `cache-key` that is propagated to `Swatinem/rust-cache` as `key` (#41 by @iainlane) +* Make rustup toolchain installation more robust in light of planned changes https://github.com/rust-lang/rustup/issues/3635 and https://github.com/rust-lang/rustup/pull/3985 +* Allow installing multiple Rust toolchains by specifying multiple versions in the `toolchain` input parameter. +* Configure the `rustup override` behavior via the new `override` input. (#38) + ## [1.9.0] - 2024-06-08 * Add extra argument `cache-on-failure` and forward it to `Swatinem/rust-cache`. (#39 by @samuelhnrq) diff --git a/README.md b/README.md index 5899df0..6f8a15c 100644 --- a/README.md +++ b/README.md @@ -48,16 +48,21 @@ If no `toolchain` value or toolchain file is present, it will default to `stable First, all items specified in the toolchain file are installed. Afterward, the `components` and `target` specified via inputs are installed in addition to the items from the toolchain file. -| Name | Description | Default | -|--------------------|----------------------------------------------------------------------------------------|---------------| -| `toolchain` | Rustup toolchain specifier e.g. `stable`, `nightly`, `1.42.0`. | stable | -| `target` | Additional target support to install e.g. `wasm32-unknown-unknown` | | -| `components` | Comma-separated string of additional components to install e.g. `clippy, rustfmt` | | -| `cache` | Automatically configure Rust cache (using [`Swatinem/rust-cache`]) | true | -| `cache-workspaces` | Propagates the value to [`Swatinem/rust-cache`] | | -| `cache-on-failure` | Propagates the value to [`Swatinem/rust-cache`] | true | -| `matcher` | Enable problem matcher to surface build messages and formatting issues | true | -| `rustflags` | Set the value of `RUSTFLAGS` (set to empty string to avoid overwriting existing flags) | "-D warnings" | +| Name | Description | Default | +| ------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------- | +| `toolchain` | Comma-separated list of Rustup toolchain specifier e.g. `stable`, `nightly`, `1.42.0`. The last version is the default. | stable | +| `target` | Additional target support to install e.g. `wasm32-unknown-unknown` | | +| `components` | Comma-separated string of additional components to install e.g. `clippy, rustfmt` | | +| `cache` | Automatically configure Rust cache (using [`Swatinem/rust-cache`]) | true | +| `cache-directories` | Propagates the value to [`Swatinem/rust-cache`] | | +| `cache-workspaces` | Propagates the value to [`Swatinem/rust-cache`] | | +| `cache-on-failure` | Propagates the value to [`Swatinem/rust-cache`] | true | +| `cache-key` | Propagates the value to [`Swatinem/rust-cache`] as `key` | | +| `cache-shared-key` | Propagates the value to [`Swatinem/rust-cache`] as `shared-key` | | +| `cache-bin` | Propagates the value to [`Swatinem/rust-cache`] as `cache-bin` | true | +| `matcher` | Enable problem matcher to surface build messages and formatting issues | true | +| `rustflags` | Set the value of `RUSTFLAGS` (set to empty string to avoid overwriting existing flags) | "-D warnings" | +| `override` | Setup the last installed toolchain as the default via `rustup override` | true | [`Swatinem/rust-cache`]: https://github.com/Swatinem/rust-cache @@ -85,6 +90,16 @@ You can read more rustflags, and their load order, in the [Cargo reference]. | `rustup-version` | Version as reported by `rustup --version` | | `cachekey` | A short hash of the installed rustc version | +## Dependencies + +The action works best on the GitHub-hosted runners, but can work on self-hosted ones too, provided the necessary dependencies are available. +PRs to add support for more environments are welcome. + +* bash 5 +* brew (macOS only) +* rustup or curl +* using other node actions + ## License The scripts and documentation in this project are released under the [MIT diff --git a/action.yml b/action.yml index fa6bd89..ca44c3d 100644 --- a/action.yml +++ b/action.yml @@ -13,7 +13,7 @@ branding: # The action is heavily inspired by https://github.com/dtolnay/rust-toolchain inputs: toolchain: - description: "Rust toolchain specification -- see https://rust-lang.github.io/rustup/concepts/toolchains.html#toolchain-specification" + description: "Comma-separated list of Rust toolchain specifications. Last version becomes the default. -- see https://rust-lang.github.io/rustup/concepts/toolchains.html#toolchain-specification" required: false target: description: "Target triple to install for this toolchain" @@ -28,10 +28,23 @@ inputs: cache-workspaces: description: "Paths to multiple Cargo workspaces and their target directories, separated by newlines." required: false + cache-directories: + description: "Additional non workspace directories to be cached, separated by newlines." + required: false cache-on-failure: description: "Also cache on workflow failures" default: "true" required: false + cache-key: + description: "An additional cache key that is added alongside the automatic `job`-based cache key and can be used to further differentiate jobs." + required: false + cache-shared-key: + description: "A cache key that is used instead of the automatic `job`-based key, and is stable over multiple jobs." + required: false + cache-bin: + description: "Determines whether to cache ${CARGO_HOME}/bin." + required: false + default: "true" matcher: description: "Enable the Rust problem matcher" required: false @@ -40,6 +53,10 @@ inputs: description: "set RUSTFLAGS environment variable, set to empty string to avoid overwriting build.rustflags" required: false default: "-D warnings" + override: + description: "Setup the last installed toolchain as the default via `rustup override`" + required: false + default: "true" outputs: rustc-version: @@ -74,7 +91,7 @@ runs: : construct rustup command line echo "targets=$(for t in ${targets//,/ }; do echo -n ' --target' $t; done)" >> $GITHUB_OUTPUT echo "components=$(for c in ${components//,/ }; do echo -n ' --component' $c; done)" >> $GITHUB_OUTPUT - echo "downgrade=${{inputs.toolchain == 'nightly' && inputs.components && ' --allow-downgrade' || ''}}" >> $GITHUB_OUTPUT + echo "downgrade=${{contains(inputs.toolchain, 'nightly') && inputs.components && ' --allow-downgrade' || ''}}" >> $GITHUB_OUTPUT # The environment variables always need to be set before the caching action - name: Setting Environment Variables @@ -113,26 +130,36 @@ runs: run: echo "::add-matcher::${{ github.action_path }}/rust.json" - name: Install rustup, if needed - if: runner.os != 'Windows' shell: bash run: | if ! command -v rustup &> /dev/null ; then curl --proto '=https' --tlsv1.2 --retry 10 --retry-connrefused -fsSL "https://sh.rustup.rs" | sh -s -- --default-toolchain none -y - echo "${CARGO_HOME:-$HOME/.cargo}/bin" >> $GITHUB_PATH + + # Resolve the correct CARGO_HOME path depending on OS + if [[ "$RUNNER_OS" == "Windows" ]]; then + echo "${CARGO_HOME:-$USERPROFILE/.cargo}/bin" | sed 's|/|\\|g' >> $GITHUB_PATH + else + echo "${CARGO_HOME:-$HOME/.cargo}/bin" >> $GITHUB_PATH + fi fi + env: + RUNNER_OS: "${{ runner.os }}" - name: rustup toolchain install ${{inputs.toolchain || 'stable'}} env: toolchain: ${{inputs.toolchain}} targets: ${{inputs.target}} components: ${{inputs.components}} + override: ${{inputs.override}} shell: bash run: | if [[ -z "$toolchain" && ( -f "rust-toolchain" || -f "rust-toolchain.toml" ) ]] then # Install the toolchain as specified in the file - # Might break at some point: https://github.com/rust-lang/rustup/issues/1397 - rustup show + # rustup show is the old way that implicitly installed a toolchain + # rustup toolchain install is the new explicit way + # https://github.com/rust-lang/rustup/issues/3635#issuecomment-2343511297 + rustup show active-toolchain || rustup toolchain install if [[ -n $components ]]; then rustup component add ${components//,/ } fi @@ -144,8 +171,12 @@ runs: then toolchain=stable fi - rustup toolchain install $toolchain${{steps.flags.outputs.targets}}${{steps.flags.outputs.components}} --profile minimal${{steps.flags.outputs.downgrade}} --no-self-update - rustup override set $toolchain + rustup toolchain install ${toolchain//,/ } ${{steps.flags.outputs.targets}}${{steps.flags.outputs.components}} --profile minimal${{steps.flags.outputs.downgrade}} --no-self-update + # Take the last element from the list + if [[ "$override" == "true" ]] + then + rustup override set ${toolchain//*,/ } + fi fi - id: versions @@ -180,4 +211,8 @@ runs: uses: Swatinem/rust-cache@v2 with: workspaces: ${{inputs.cache-workspaces}} + cache-directories: ${{inputs.cache-directories}} cache-on-failure: ${{inputs.cache-on-failure}} + cache-bin: ${{inputs.cache-bin}} + key: ${{inputs.cache-key}} + shared-key: ${{inputs.cache-shared-key}} diff --git a/rust.json b/rust.json index ddaa1b0..c407391 100644 --- a/rust.json +++ b/rust.json @@ -5,7 +5,7 @@ "severity": "warning", "pattern": [ { - "regexp": "^(Diff in (.+)) at line (\\d+):$", + "regexp": "^(Diff in (.+))(?: at line |:)(\\d+):$", "message": 1, "file": 2, "line": 3