Make rustup install profile configurable#2111
Conversation
Until now `language: rust` toolchains were always installed with `rustup toolchain install --profile minimal`, which omits rustfmt and clippy and breaks the canonical `cargo fmt`/`cargo clippy` pre-commit hooks. Honour PREK_RUST_PROFILE if set so users can opt into `default` (rustfmt + clippy) or `complete` without forking. Default is unchanged (`minimal`).
rustup recognises only `minimal`, `default`, and `complete` as profiles. Reject anything else with a warning and fall back to `minimal` so a typo in the env var surfaces as a clear prek log line rather than a cryptic rustup failure mid-install. Matches the warn-and-fall-back pattern already used for PREK_CONTAINER_RUNTIME and PREK_UV_SOURCE.
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Adds support for selecting the rustup installation profile for managed Rust toolchains via a new environment variable, and documents the behavior.
Changes:
- Introduce
PREK_RUST_PROFILEenv var to controlrustup --profileduring toolchain install. - Update Rust toolchain installation to use the configured profile (defaulting to
minimal). - Document the new env var and describe Rust toolchain profile behavior.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| docs/reference/environment-variables.md | Documents new PREK_RUST_PROFILE env var and its allowed values/default. |
| docs/languages.md | Adds Rust docs section explaining default rustup profile and how to override it. |
| crates/prek/src/languages/rust/rustup.rs | Reads PREK_RUST_PROFILE once and passes it to rustup toolchain install --profile. |
| crates/prek-consts/src/env_vars.rs | Adds PREK_RUST_PROFILE constant to central env var list. |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #2111 +/- ##
==========================================
- Coverage 92.38% 92.36% -0.02%
==========================================
Files 121 121
Lines 24837 24847 +10
==========================================
+ Hits 22946 22951 +5
- Misses 1891 1896 +5 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
📦 Cargo Bloat ComparisonBinary size change: +0.00% (26.1 MiB → 26.1 MiB) Expand for cargo-bloat outputHead Branch ResultsBase Branch Results |
⚡️ Hyperfine BenchmarksSummary: 0 regressions, 0 improvements above the 10% threshold. Environment
CLI CommandsBenchmarking basic commands in the main repo:
|
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base --version |
2.4 ± 0.1 | 2.3 | 2.8 | 1.03 ± 0.04 |
prek-head --version |
2.4 ± 0.1 | 2.2 | 2.5 | 1.00 |
prek list
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base list |
9.5 ± 0.7 | 9.1 | 15.4 | 1.01 ± 0.08 |
prek-head list |
9.4 ± 0.1 | 9.1 | 9.9 | 1.00 |
prek validate-config .pre-commit-config.yaml
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base validate-config .pre-commit-config.yaml |
3.2 ± 0.1 | 3.1 | 3.4 | 1.00 |
prek-head validate-config .pre-commit-config.yaml |
3.2 ± 0.1 | 3.1 | 4.0 | 1.01 ± 0.04 |
prek sample-config
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base sample-config |
2.7 ± 0.1 | 2.7 | 3.3 | 1.02 ± 0.05 |
prek-head sample-config |
2.7 ± 0.1 | 2.6 | 3.2 | 1.00 |
Cold vs Warm Runs
Comparing first run (cold) vs subsequent runs (warm cache):
prek run --all-files (cold - no cache)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run --all-files |
80.1 ± 2.1 | 77.3 | 82.9 | 1.01 ± 0.04 |
prek-head run --all-files |
79.5 ± 2.5 | 75.6 | 82.8 | 1.00 |
prek run --all-files (warm - with cache)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run --all-files |
78.9 ± 2.3 | 75.0 | 83.0 | 1.02 ± 0.04 |
prek-head run --all-files |
77.6 ± 1.7 | 74.8 | 80.4 | 1.00 |
Full Hook Suite
Running the builtin hook suite on the benchmark workspace:
prek run --all-files (full builtin hook suite)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run --all-files |
79.0 ± 2.5 | 75.2 | 85.1 | 1.00 |
prek-head run --all-files |
79.5 ± 2.7 | 74.8 | 84.7 | 1.01 ± 0.05 |
Individual Hook Performance
Benchmarking each hook individually on the test repo:
prek run trailing-whitespace --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run trailing-whitespace --all-files |
20.8 ± 0.5 | 20.1 | 22.8 | 1.00 ± 0.03 |
prek-head run trailing-whitespace --all-files |
20.8 ± 0.4 | 20.1 | 21.6 | 1.00 |
prek run end-of-file-fixer --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run end-of-file-fixer --all-files |
27.7 ± 2.9 | 23.8 | 36.6 | 1.03 ± 0.13 |
prek-head run end-of-file-fixer --all-files |
26.8 ± 2.1 | 23.9 | 30.5 | 1.00 |
prek run check-json --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-json --all-files |
8.3 ± 0.2 | 7.9 | 8.6 | 1.00 |
prek-head run check-json --all-files |
8.4 ± 0.3 | 8.0 | 9.2 | 1.01 ± 0.04 |
prek run check-yaml --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-yaml --all-files |
8.1 ± 0.6 | 7.8 | 11.1 | 1.02 ± 0.07 |
prek-head run check-yaml --all-files |
7.9 ± 0.1 | 7.8 | 8.2 | 1.00 |
prek run check-toml --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-toml --all-files |
8.2 ± 0.3 | 7.7 | 9.0 | 1.00 ± 0.05 |
prek-head run check-toml --all-files |
8.1 ± 0.3 | 7.7 | 9.2 | 1.00 |
prek run check-xml --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-xml --all-files |
8.2 ± 0.2 | 7.8 | 8.9 | 1.01 ± 0.04 |
prek-head run check-xml --all-files |
8.2 ± 0.3 | 7.8 | 8.7 | 1.00 |
prek run detect-private-key --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run detect-private-key --all-files |
13.8 ± 1.4 | 11.9 | 17.2 | 1.00 ± 0.13 |
prek-head run detect-private-key --all-files |
13.8 ± 1.1 | 12.1 | 15.9 | 1.00 |
prek run fix-byte-order-marker --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run fix-byte-order-marker --all-files |
23.4 ± 4.2 | 19.6 | 43.4 | 1.03 ± 0.20 |
prek-head run fix-byte-order-marker --all-files |
22.7 ± 1.6 | 19.8 | 27.0 | 1.00 |
Installation Performance
Benchmarking hook installation (fast path hooks skip Python setup):
prek install-hooks (cold - no cache)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base install-hooks |
4.9 ± 0.1 | 4.8 | 5.0 | 1.03 ± 0.02 |
prek-head install-hooks |
4.8 ± 0.1 | 4.7 | 4.9 | 1.00 |
prek install-hooks (warm - with cache)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base install-hooks |
4.8 ± 0.1 | 4.7 | 4.9 | 1.01 ± 0.03 |
prek-head install-hooks |
4.8 ± 0.1 | 4.7 | 4.9 | 1.00 |
File Filtering/Scoping Performance
Testing different file selection modes:
prek run (staged files only)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run |
40.7 ± 0.9 | 39.0 | 42.5 | 1.00 ± 0.04 |
prek-head run |
40.6 ± 1.3 | 38.8 | 44.1 | 1.00 |
prek run --files '*.json' (specific file type)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run --files '*.json' |
9.3 ± 1.1 | 8.5 | 11.3 | 1.09 ± 0.13 |
prek-head run --files '*.json' |
8.6 ± 0.1 | 8.5 | 8.9 | 1.00 |
Workspace Discovery & Initialization
Benchmarking hook discovery and initialization overhead:
prek run --dry-run --all-files (measures init overhead)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run --dry-run --all-files |
7.6 ± 0.1 | 7.4 | 8.1 | 1.01 ± 0.02 |
prek-head run --dry-run --all-files |
7.5 ± 0.1 | 7.4 | 7.6 | 1.00 |
Meta Hooks Performance
Benchmarking meta hooks separately:
prek run check-hooks-apply --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-hooks-apply --all-files |
12.1 ± 0.8 | 11.3 | 13.4 | 1.06 ± 0.07 |
prek-head run check-hooks-apply --all-files |
11.5 ± 0.1 | 11.2 | 11.6 | 1.00 |
prek run check-useless-excludes --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-useless-excludes --all-files |
11.5 ± 0.1 | 11.3 | 11.7 | 1.00 ± 0.02 |
prek-head run check-useless-excludes --all-files |
11.5 ± 0.2 | 11.2 | 12.2 | 1.00 |
prek run identity --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run identity --all-files |
10.7 ± 0.1 | 10.5 | 10.8 | 1.00 |
prek-head run identity --all-files |
10.8 ± 0.1 | 10.5 | 11.0 | 1.01 ± 0.01 |
If rust is not already present on the system,
language: rusttoolchains are always installed withrustup toolchain install --profile minimal, which omits rustfmt and clippy and breaks possiblecargo fmt/cargo clippypre-commit hooks. Added PREK_RUST_PROFILE envvar so users can opt intodefault(rustfmt + clippy) orcomplete. Default is unchanged fromminimal.