|
1 | 1 | #!/bin/sh |
2 | | -# Pre-push hook for Cortex CLI |
3 | | -# Runs comprehensive checks before push |
| 2 | +# Pre-push hook for Cortex CLI (OPTIMIZED) |
| 3 | +# Only checks crates with changes since origin |
4 | 4 |
|
5 | 5 | set -e |
6 | 6 |
|
7 | | -echo "=== Pre-push Hook ===" |
| 7 | +echo "=== Pre-push Hook (Optimized) ===" |
8 | 8 |
|
9 | | -# Format check |
10 | | -echo "Running cargo fmt check..." |
11 | | -cargo fmt --all -- --check |
| 9 | +# Get the remote branch we're pushing to |
| 10 | +REMOTE=${1:-origin} |
| 11 | +REMOTE_REF=$(git rev-parse --abbrev-ref @{upstream} 2>/dev/null || echo "$REMOTE/master") |
12 | 12 |
|
13 | | -# Clippy (warnings only, not errors) |
14 | | -echo "Running cargo clippy..." |
15 | | -cargo clippy --workspace --lib --exclude cortex-gui 2>&1 | head -100 || true |
| 13 | +# Get changed Rust files since remote |
| 14 | +CHANGED_RS_FILES=$(git diff --name-only "$REMOTE_REF"...HEAD | grep '\.rs$' || true) |
16 | 15 |
|
17 | | -# Build check |
18 | | -echo "Running cargo check..." |
19 | | -cargo check --workspace --exclude cortex-gui |
| 16 | +if [ -z "$CHANGED_RS_FILES" ]; then |
| 17 | + echo "No Rust files changed since $REMOTE_REF, skipping checks." |
| 18 | + exit 0 |
| 19 | +fi |
20 | 20 |
|
21 | | -# Run tests (exclude GUI as it needs frontend built) |
22 | | -echo "Running cargo test..." |
23 | | -cargo test --workspace --exclude cortex-gui |
| 21 | +echo "Checking changes since $REMOTE_REF..." |
24 | 22 |
|
25 | | -echo "=== Pre-push checks passed! ===" |
| 23 | +# Find changed crates |
| 24 | +CHANGED_CRATES=$(echo "$CHANGED_RS_FILES" | sed 's|/src/.*||' | sort -u | grep -v '^\.' || true) |
| 25 | + |
| 26 | +# Format check on changed files only |
| 27 | +echo "Running rustfmt --check on changed files..." |
| 28 | +echo "$CHANGED_RS_FILES" | xargs rustfmt --edition 2024 --check 2>/dev/null || { |
| 29 | + echo "ERROR: Format check failed. Run 'cargo fmt' to fix." |
| 30 | + exit 1 |
| 31 | +} |
| 32 | + |
| 33 | +# Clippy only on changed crates |
| 34 | +if [ -n "$CHANGED_CRATES" ]; then |
| 35 | + echo "Running clippy on changed crates..." |
| 36 | + CLIPPY_ARGS="" |
| 37 | + for crate in $CHANGED_CRATES; do |
| 38 | + if [ -f "$crate/Cargo.toml" ]; then |
| 39 | + crate_name=$(basename "$crate") |
| 40 | + # Skip cortex-gui (needs frontend built) |
| 41 | + if [ "$crate_name" != "cortex-gui" ] && [ "$crate_name" != "src-tauri" ]; then |
| 42 | + CLIPPY_ARGS="$CLIPPY_ARGS -p $crate_name" |
| 43 | + fi |
| 44 | + fi |
| 45 | + done |
| 46 | + |
| 47 | + if [ -n "$CLIPPY_ARGS" ]; then |
| 48 | + cargo clippy $CLIPPY_ARGS --lib 2>&1 | head -50 || true |
| 49 | + fi |
| 50 | +fi |
| 51 | + |
| 52 | +# Check only changed crates |
| 53 | +echo "Running cargo check on changed crates..." |
| 54 | +for crate in $CHANGED_CRATES; do |
| 55 | + if [ -f "$crate/Cargo.toml" ]; then |
| 56 | + crate_name=$(basename "$crate") |
| 57 | + if [ "$crate_name" != "cortex-gui" ] && [ "$crate_name" != "src-tauri" ]; then |
| 58 | + cargo check -p "$crate_name" 2>/dev/null || { |
| 59 | + echo "ERROR: cargo check failed for $crate_name" |
| 60 | + exit 1 |
| 61 | + } |
| 62 | + fi |
| 63 | + fi |
| 64 | +done |
| 65 | + |
| 66 | +# Run tests only on changed crates |
| 67 | +echo "Running tests on changed crates..." |
| 68 | +for crate in $CHANGED_CRATES; do |
| 69 | + if [ -f "$crate/Cargo.toml" ]; then |
| 70 | + crate_name=$(basename "$crate") |
| 71 | + if [ "$crate_name" != "cortex-gui" ] && [ "$crate_name" != "src-tauri" ]; then |
| 72 | + cargo test -p "$crate_name" --lib 2>/dev/null || { |
| 73 | + echo "WARNING: Tests failed for $crate_name (continuing)" |
| 74 | + } |
| 75 | + fi |
| 76 | + fi |
| 77 | +done |
| 78 | + |
| 79 | +echo "=== Pre-push passed! ===" |
0 commit comments