Repository navigation
Normalize explicit paths in shebang index checks - #2831
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
Copilot review overview
🟢 Approval recommended
The normalization is correctly centralized and covered by integration tests for both affected hooks.
Review effort: Balanced
Findings: None
What changed in this PR
Normalizes explicit shebang-hook paths to match Git index paths.
Changes:
- Strips leading
./before index matching. - Updates both shebang hooks and cross-platform integration coverage.
| File | Description |
|---|---|
crates/prek/src/hooks/pre_commit_hooks/shebangs.rs |
Normalizes paths before index lookup. |
crates/prek/src/hooks/pre_commit_hooks/check_executables_have_shebangs.rs |
Passes filenames directly to shared matching. |
crates/prek/src/hooks/pre_commit_hooks/check_shebang_scripts_are_executable.rs |
Uses shared path normalization. |
crates/prek/tests/builtin_hooks.rs |
Covers explicit ./ paths for both hooks. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #2831 +/- ##
=======================================
Coverage 94.28% 94.28%
=======================================
Files 142 142
Lines 30750 30752 +2
=======================================
+ Hits 28993 28996 +3
+ Misses 1757 1756 -1 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
📦 Cargo Bloat Comparison
Expand for cargo-bloat outputHead Branch ResultsBase Branch Results |
⚡️ Hyperfine BenchmarksSummary: 2 regressions, 3 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.0 ± 0.1 | 1.8 | 2.8 | 1.01 ± 0.08 |
prek-head --version |
1.9 ± 0.1 | 1.8 | 2.4 | 1.00 |
prek list
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base list |
7.9 ± 1.4 | 7.4 | 18.2 | 1.00 |
prek-head list |
10.1 ± 12.4 | 7.5 | 84.5 | 1.28 ± 1.57 |
prek list: 27.6000% slower
prek validate-config .pre-commit-config.yaml
⏭️ Skipped: .pre-commit-config.yaml not found
prek sample-config
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base sample-config |
2.4 ± 0.2 | 2.2 | 3.8 | 1.00 |
prek-head sample-config |
2.4 ± 0.3 | 2.2 | 4.6 | 1.01 ± 0.18 |
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 |
15.0 ± 0.5 | 14.5 | 16.0 | 1.01 ± 0.04 |
prek-head run --all-files |
14.8 ± 0.4 | 14.2 | 15.7 | 1.00 |
prek run --all-files (warm - with cache)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run --all-files |
14.9 ± 0.5 | 14.0 | 15.8 | 1.02 ± 0.04 |
prek-head run --all-files |
14.6 ± 0.3 | 14.1 | 15.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 |
16.0 ± 8.3 | 14.0 | 73.7 | 1.08 ± 0.57 |
prek-head run --all-files |
14.7 ± 0.4 | 14.1 | 15.9 | 1.00 |
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 |
7.3 ± 0.3 | 7.0 | 7.9 | 1.00 |
prek-head run trailing-whitespace --all-files |
7.3 ± 0.2 | 7.1 | 7.8 | 1.00 ± 0.04 |
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 |
7.4 ± 4.0 | 6.4 | 28.7 | 1.00 |
prek-head run end-of-file-fixer --all-files |
7.6 ± 4.8 | 6.5 | 33.2 | 1.03 ± 0.87 |
prek run check-json --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-json --all-files |
6.2 ± 1.6 | 5.5 | 14.6 | 1.05 ± 0.27 |
prek-head run check-json --all-files |
5.9 ± 0.2 | 5.6 | 6.4 | 1.00 |
prek run check-yaml --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-yaml --all-files |
6.0 ± 0.1 | 5.8 | 6.2 | 1.00 ± 0.02 |
prek-head run check-yaml --all-files |
6.0 ± 0.1 | 5.8 | 6.2 | 1.00 |
prek run check-toml --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-toml --all-files |
5.9 ± 0.3 | 5.6 | 7.0 | 1.02 ± 0.05 |
prek-head run check-toml --all-files |
5.8 ± 0.1 | 5.6 | 6.1 | 1.00 |
prek run check-xml --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-xml --all-files |
5.8 ± 0.1 | 5.7 | 6.0 | 1.01 ± 0.03 |
prek-head run check-xml --all-files |
5.8 ± 0.1 | 5.6 | 6.1 | 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 |
6.1 ± 0.1 | 5.9 | 6.5 | 1.00 |
prek-head run detect-private-key --all-files |
6.1 ± 0.1 | 6.0 | 6.6 | 1.01 ± 0.03 |
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 |
6.2 ± 0.1 | 6.0 | 6.6 | 1.00 |
prek-head run fix-byte-order-marker --all-files |
7.8 ± 5.8 | 6.1 | 31.3 | 1.25 ± 0.94 |
prek run fix-byte-order-marker --all-files: 25.0200% slower
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 |
8.8 ± 10.6 | 3.9 | 27.7 | 2.20 ± 2.66 |
prek-head install-hooks |
4.0 ± 0.1 | 3.9 | 4.0 | 1.00 |
✅ Performance improvement for prek install-hooks (cold - no cache): 54.6100% faster
prek install-hooks (warm - with cache)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base install-hooks |
4.0 ± 0.1 | 3.9 | 4.0 | 1.00 ± 0.02 |
prek-head install-hooks |
3.9 ± 0.0 | 3.9 | 4.0 | 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 |
11.7 ± 11.9 | 8.6 | 62.0 | 1.30 ± 1.32 |
prek-head run |
9.0 ± 0.2 | 8.7 | 9.4 | 1.00 |
✅ Performance improvement for prek run (staged files only): 22.8200% faster
prek run --files '*.json' (specific file type)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run --files '*.json' |
4.6 ± 0.1 | 4.3 | 4.9 | 1.00 ± 0.04 |
prek-head run --files '*.json' |
4.6 ± 0.1 | 4.4 | 4.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 |
5.9 ± 0.1 | 5.8 | 6.0 | 1.00 |
prek-head run --dry-run --all-files |
6.1 ± 0.1 | 5.9 | 6.3 | 1.03 ± 0.02 |
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 |
7.0 ± 0.1 | 6.8 | 7.2 | 1.00 |
prek-head run check-hooks-apply --all-files |
7.0 ± 0.2 | 6.8 | 7.5 | 1.01 ± 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 |
8.3 ± 5.0 | 6.9 | 26.3 | 1.18 ± 0.71 |
prek-head run check-useless-excludes --all-files |
7.0 ± 0.2 | 6.8 | 7.4 | 1.00 |
✅ Performance improvement for prek run check-useless-excludes --all-files: 15.5500% faster
prek run identity --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run identity --all-files |
6.2 ± 0.2 | 6.0 | 7.0 | 1.00 ± 0.05 |
prek-head run identity --all-files |
6.2 ± 0.1 | 6.0 | 6.5 | 1.00 |
Normalize leading
./when matching explicit filenames against Git index paths, so both shebang hooks check these files instead of silently skipping them.