Add aliases for hook priorities#2331
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #2331 +/- ##
=======================================
Coverage 93.36% 93.36%
=======================================
Files 129 129
Lines 27408 27470 +62
=======================================
+ Hits 25589 25647 +58
- Misses 1819 1823 +4 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
📦 Cargo Bloat ComparisonBinary size change: +0.00% (29.1 MiB → 29.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.2 ± 0.1 | 2.1 | 2.5 | 1.00 |
prek-head --version |
2.3 ± 0.1 | 2.1 | 2.8 | 1.05 ± 0.07 |
prek list
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base list |
10.0 ± 0.2 | 9.5 | 10.5 | 1.00 |
prek-head list |
10.2 ± 0.2 | 9.7 | 11.0 | 1.02 ± 0.03 |
prek validate-config .pre-commit-config.yaml
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base validate-config .pre-commit-config.yaml |
3.3 ± 0.1 | 3.1 | 3.5 | 1.00 |
prek-head validate-config .pre-commit-config.yaml |
3.4 ± 0.9 | 3.1 | 9.6 | 1.02 ± 0.27 |
prek sample-config
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base sample-config |
2.6 ± 0.1 | 2.4 | 3.0 | 1.02 ± 0.05 |
prek-head sample-config |
2.5 ± 0.1 | 2.3 | 2.7 | 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.9 ± 4.0 | 75.5 | 88.0 | 1.03 ± 0.06 |
prek-head run --all-files |
78.4 ± 2.1 | 76.3 | 81.8 | 1.00 |
prek run --all-files (warm - with cache)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run --all-files |
79.6 ± 2.2 | 75.4 | 84.3 | 1.00 ± 0.04 |
prek-head run --all-files |
79.3 ± 2.2 | 74.9 | 83.2 | 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 |
80.0 ± 2.5 | 75.8 | 85.3 | 1.00 |
prek-head run --all-files |
80.1 ± 3.4 | 73.7 | 90.7 | 1.00 ± 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 |
21.2 ± 0.3 | 20.4 | 22.1 | 1.01 ± 0.02 |
prek-head run trailing-whitespace --all-files |
20.9 ± 0.4 | 20.3 | 21.8 | 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.8 ± 2.2 | 25.2 | 33.2 | 1.00 |
prek-head run end-of-file-fixer --all-files |
28.0 ± 2.1 | 25.3 | 32.9 | 1.01 ± 0.11 |
prek run check-json --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-json --all-files |
8.5 ± 0.3 | 8.1 | 9.2 | 1.02 ± 0.05 |
prek-head run check-json --all-files |
8.4 ± 0.3 | 7.6 | 9.0 | 1.00 |
prek run check-yaml --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-yaml --all-files |
8.4 ± 0.2 | 8.0 | 8.8 | 1.00 |
prek-head run check-yaml --all-files |
8.4 ± 0.7 | 8.0 | 11.9 | 1.00 ± 0.09 |
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.5 | 8.7 | 1.00 ± 0.06 |
prek-head run check-toml --all-files |
8.2 ± 0.3 | 7.7 | 9.4 | 1.00 |
prek run check-xml --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-xml --all-files |
8.0 ± 0.3 | 7.5 | 8.7 | 1.00 |
prek-head run check-xml --all-files |
8.0 ± 0.3 | 7.7 | 9.1 | 1.00 ± 0.05 |
prek run detect-private-key --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run detect-private-key --all-files |
14.5 ± 1.3 | 12.7 | 16.8 | 1.00 |
prek-head run detect-private-key --all-files |
14.7 ± 1.3 | 12.8 | 17.1 | 1.01 ± 0.13 |
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 |
19.4 ± 0.8 | 17.8 | 21.1 | 1.03 ± 0.06 |
prek-head run fix-byte-order-marker --all-files |
18.8 ± 0.7 | 17.7 | 20.8 | 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.7 ± 0.1 | 4.7 | 4.8 | 1.00 |
prek-head install-hooks |
4.7 ± 0.1 | 4.7 | 4.9 | 1.00 ± 0.02 |
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.00 |
prek-head install-hooks |
4.8 ± 0.1 | 4.7 | 5.0 | 1.02 ± 0.03 |
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 |
38.9 ± 1.6 | 37.4 | 44.5 | 1.00 |
prek-head run |
39.6 ± 2.7 | 36.4 | 49.0 | 1.02 ± 0.08 |
prek run --files '*.json' (specific file type)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run --files '*.json' |
8.5 ± 0.2 | 8.2 | 9.0 | 1.00 ± 0.03 |
prek-head run --files '*.json' |
8.4 ± 0.2 | 8.1 | 8.7 | 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.4 ± 0.2 | 7.2 | 7.7 | 1.01 ± 0.03 |
prek-head run --dry-run --all-files |
7.3 ± 0.2 | 6.9 | 7.8 | 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.6 ± 0.2 | 12.1 | 13.0 | 1.00 |
prek-head run check-hooks-apply --all-files |
12.8 ± 0.3 | 12.4 | 13.3 | 1.02 ± 0.03 |
prek run check-useless-excludes --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-useless-excludes --all-files |
11.3 ± 0.4 | 11.0 | 12.6 | 1.03 ± 0.04 |
prek-head run check-useless-excludes --all-files |
11.1 ± 0.2 | 10.8 | 11.4 | 1.00 |
prek run identity --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run identity --all-files |
10.4 ± 0.1 | 10.1 | 10.7 | 1.00 |
prek-head run identity --all-files |
10.4 ± 0.1 | 10.2 | 10.8 | 1.01 ± 0.02 |
|
Thanks! I’m concerned that named priorities would introduce a second grouping concept alongside groups, but with unrelated semantics: groups select hooks, while priorities schedule them. The same natural names, such as YAML anchors can be a workaround before we add named priorities: - id: ruff
priority: &checks 10
- id: mypy
priority: *checks |
|
I agree but we fully embraced prek dropping pre-commit compatibility and switched to prek.toml. There are no anchors in toml. I see your point but selection and order are ultimately two different things. Do you think this is just a naming problem? We could also enforce the priorities to all start/end with a specific prefix/suffix to make it clearer. Imo this would be a great feature since assigning and maintaining int based priorities in a toml file with 50 hooks is a real pain |
|
Thanks! |
In projects with lots of hooks (and therefore repos) I found it very hard to follow which hooks run in which priority. I want to run as many as possible in parallel and therefore assign them to groups. Until now, I had to assign the same integer to hooks that can run at the same time (=belong to the same group), so I always wished for this feature.
I tried to do it in such a way that needs minimal changes and decided to basically only change the config parsing. In the end, it will still result in an u32 and all further logic still applies.
I also changed validate_group_name to validate_config_name to apply the same restrictions to the priorities names as for groups.
Used AI to find all docs that needs to be updated and updated them.
My first contribution here, so tell me if I missed something or if you want some changes.