Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #1761 +/- ##
==========================================
- Coverage 91.76% 91.71% -0.06%
==========================================
Files 98 98
Lines 19737 19847 +110
==========================================
+ Hits 18112 18203 +91
- Misses 1625 1644 +19 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Pull request overview
This PR improves remote repository cloning in prek by retrying authentication-related clone failures with interactive Git terminal prompts enabled, while keeping the initial cloning pass non-interactive and parallel.
Changes:
- Introduces
Store::clone_repos()to batch-clone remote repos with a parallel, non-interactive first pass and a sequential, interactive retry for auth failures. - Adds
TerminalPromptsupport to the Git clone flow and anis_auth_error()helper to detect auth-related clone failures. - Refactors workspace/project repo initialization to use the new batch clone API and tweaks CI detection via
EnvVars::is_under_ci().
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| crates/prek/src/workspace.rs | Refactors remote repo initialization to use Store::clone_repos() results instead of per-repo concurrent tasks. |
| crates/prek/src/store.rs | Adds batched clone API with auth-failure retry sequencing and new error variant for clone failures. |
| crates/prek/src/git.rs | Adds TerminalPrompt mode support, auth-error detection, and threads prompt mode into clone/submodule operations. |
| crates/prek/src/cli/try_repo.rs | Updates try-repo to clone via clone_repos() instead of the removed per-repo clone API. |
| crates/prek/src/cli/run/run.rs | Switches CI check to EnvVars::is_under_ci(). |
| crates/prek-consts/src/env_vars.rs | Adds LC_ALL constant and introduces EnvVars::is_under_ci(). |
📦 Cargo Bloat ComparisonBinary size change: +0.82% (24.5 MiB → 24.7 MiB) Expand for cargo-bloat outputHead Branch ResultsBase Branch Results |
⚡️ Hyperfine PerformanceEnvironment
CLI CommandsBenchmarking basic commands in the main repo:
|
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base --version |
2.5 ± 0.1 | 2.3 | 2.9 | 1.04 ± 0.07 |
prek-head --version |
2.4 ± 0.1 | 2.3 | 3.0 | 1.00 |
prek list
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base list |
9.3 ± 0.2 | 9.0 | 9.9 | 1.00 |
prek-head list |
9.6 ± 0.4 | 8.9 | 10.6 | 1.03 ± 0.05 |
prek validate-config .pre-commit-config.yaml
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base validate-config .pre-commit-config.yaml |
3.4 ± 0.2 | 3.1 | 3.9 | 1.06 ± 0.07 |
prek-head validate-config .pre-commit-config.yaml |
3.2 ± 0.1 | 3.0 | 3.5 | 1.00 |
prek sample-config
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base sample-config |
2.7 ± 0.1 | 2.6 | 3.1 | 1.00 ± 0.04 |
prek-head sample-config |
2.7 ± 0.1 | 2.6 | 2.8 | 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 |
156.0 ± 2.6 | 152.6 | 160.3 | 1.00 |
prek-head run --all-files |
158.2 ± 4.6 | 153.6 | 167.9 | 1.01 ± 0.03 |
prek run --all-files (warm - with cache)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run --all-files |
157.0 ± 2.8 | 151.3 | 163.8 | 1.00 ± 0.02 |
prek-head run --all-files |
156.9 ± 2.6 | 153.6 | 162.7 | 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 |
157.5 ± 2.9 | 152.2 | 164.4 | 1.01 ± 0.07 |
prek-head run --all-files |
156.3 ± 10.5 | 149.0 | 227.1 | 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 |
22.4 ± 0.9 | 21.6 | 27.0 | 1.00 |
prek-head run trailing-whitespace --all-files |
22.5 ± 0.6 | 21.5 | 23.5 | 1.00 ± 0.05 |
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 |
29.3 ± 2.2 | 25.3 | 33.4 | 1.03 ± 0.11 |
prek-head run end-of-file-fixer --all-files |
28.5 ± 2.0 | 25.8 | 32.7 | 1.00 |
prek run check-json --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-json --all-files |
13.7 ± 0.4 | 12.8 | 14.7 | 1.04 ± 0.06 |
prek-head run check-json --all-files |
13.2 ± 0.7 | 12.2 | 14.9 | 1.00 |
prek run check-yaml --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-yaml --all-files |
12.4 ± 0.3 | 11.9 | 13.1 | 1.00 |
prek-head run check-yaml --all-files |
13.0 ± 0.7 | 12.1 | 14.2 | 1.05 ± 0.06 |
prek run check-toml --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-toml --all-files |
12.6 ± 0.4 | 11.8 | 13.6 | 1.00 |
prek-head run check-toml --all-files |
13.0 ± 0.5 | 12.1 | 13.9 | 1.03 ± 0.05 |
prek run check-xml --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run check-xml --all-files |
13.1 ± 0.7 | 11.9 | 15.1 | 1.04 ± 0.07 |
prek-head run check-xml --all-files |
12.5 ± 0.4 | 11.7 | 13.3 | 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.8 ± 0.1 | 4.7 | 4.9 | 1.00 |
prek-head install-hooks |
4.9 ± 0.1 | 4.8 | 5.1 | 1.02 ± 0.03 |
prek install-hooks (warm - with cache)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base install-hooks |
4.9 ± 0.1 | 4.9 | 5.0 | 1.00 |
prek-head install-hooks |
5.0 ± 0.1 | 4.9 | 5.1 | 1.01 ± 0.02 |
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 |
19.6 ± 0.4 | 18.8 | 20.2 | 1.00 |
prek-head run |
19.7 ± 0.3 | 19.3 | 20.5 | 1.01 ± 0.02 |
prek run --files '*.json' (specific file type)
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run --files '*.json' |
8.4 ± 0.2 | 7.9 | 8.7 | 1.05 ± 0.04 |
prek-head run --files '*.json' |
8.0 ± 0.2 | 7.6 | 8.3 | 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 |
13.0 ± 0.2 | 12.7 | 13.4 | 1.00 |
prek-head run --dry-run --all-files |
13.1 ± 0.2 | 12.8 | 13.6 | 1.01 ± 0.03 |
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 |
14.4 ± 0.6 | 12.8 | 15.1 | 1.09 ± 0.06 |
prek-head run check-hooks-apply --all-files |
13.2 ± 0.4 | 12.9 | 14.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 |
13.0 ± 0.3 | 12.6 | 13.8 | 1.01 ± 0.03 |
prek-head run check-useless-excludes --all-files |
12.9 ± 0.1 | 12.7 | 13.3 | 1.00 |
prek run identity --all-files
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
prek-base run identity --all-files |
11.5 ± 0.3 | 10.9 | 12.0 | 1.00 |
prek-head run identity --all-files |
11.7 ± 0.2 | 11.4 | 12.2 | 1.02 ± 0.04 |
When a repo clone fails because authentication is required, retry that clone with GIT_TERMINAL_PROMPT=1 so Git can prompt the user for credentials. The retry flow keeps the initial clone pass non-interactive, detects auth-related failures, and then retries only those failed clones with terminal prompts enabled. Retries run sequentially so users only see one credential prompt at a time and know which repository is requesting authentication.
When a repo clone fails because authentication is required, retry that clone with
GIT_TERMINAL_PROMPT=1so Git can prompt the user for credentials.The retry flow keeps the initial clone pass non-interactive, detects auth-related failures, and then retries only those failed clones with terminal prompts enabled. Retries run sequentially so users only see one credential prompt at a time and know which repository is requesting authentication.
Closes #1634
Closes #1173
Related #1193
Related #1472