Skip to content

Commit c5aa5a2

Browse files
committed
fix(common): compare against brnach changes
1 parent f3ff10d commit c5aa5a2

File tree

3 files changed

+57
-58
lines changed

3 files changed

+57
-58
lines changed

.github/hooks/pre-push-coverage

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,12 @@ REPO_ROOT=$(git rev-parse --show-toplevel)
1212
REPORT_FILE="$REPO_ROOT/coprocessor/fhevm-engine/coverage-report.txt"
1313
COPROCESSOR_DIR="coprocessor/fhevm-engine/"
1414

15-
# Determine the merge base to compare against (what's being pushed)
16-
MERGE_BASE=$(git merge-base main HEAD 2>/dev/null || true)
17-
if [ -z "$MERGE_BASE" ]; then
18-
exit 0
19-
fi
15+
# Fetch latest remote to ensure accurate comparison
16+
git fetch origin main --quiet 2>/dev/null || true
2017

21-
# Get changed files on this branch, filtered to actual crate directories only
18+
# Get changed files on this branch vs origin/main, filtered to actual crate directories only
2219
# (ignores root-level config: Makefile, scripts/, Cargo.toml, etc.)
23-
CRATE_CHANGES=$(git diff --name-only "$MERGE_BASE"...HEAD -- "$COPROCESSOR_DIR" 2>/dev/null | \
20+
CRATE_CHANGES=$(git diff --name-only "origin/main"...HEAD -- "$COPROCESSOR_DIR" 2>/dev/null | \
2421
while read -r f; do
2522
rel=$(echo "$f" | sed "s|^$COPROCESSOR_DIR||")
2623
crate_name=$(echo "$rel" | cut -d/ -f1)
@@ -33,19 +30,6 @@ if [ -z "$CRATE_CHANGES" ]; then
3330
exit 0
3431
fi
3532

36-
# Get the timestamp of the latest crate-related commit on this branch
37-
LAST_COMMIT_TIME=""
38-
for crate in $CRATE_CHANGES; do
39-
t=$(git log -1 --format=%ct "$MERGE_BASE"..HEAD -- "$COPROCESSOR_DIR$crate/" 2>/dev/null)
40-
if [ -n "$t" ] && { [ -z "$LAST_COMMIT_TIME" ] || [ "$t" -gt "$LAST_COMMIT_TIME" ]; }; then
41-
LAST_COMMIT_TIME="$t"
42-
fi
43-
done
44-
45-
if [ -z "$LAST_COMMIT_TIME" ]; then
46-
exit 0
47-
fi
48-
4933
# Check if coverage report exists
5034
if [ ! -f "$REPORT_FILE" ]; then
5135
echo ""
@@ -55,18 +39,33 @@ if [ ! -f "$REPORT_FILE" ]; then
5539
exit 0
5640
fi
5741

58-
# Check report freshness
59-
if stat -f %m "$REPORT_FILE" >/dev/null 2>&1; then
60-
REPORT_TIME=$(stat -f %m "$REPORT_FILE")
61-
else
62-
REPORT_TIME=$(stat -c %Y "$REPORT_FILE" 2>/dev/null)
42+
# Check report freshness via embedded commit hash
43+
REPORT_COMMIT=$(grep "^# commit:" "$REPORT_FILE" 2>/dev/null | awk '{print $3}')
44+
if [ -z "$REPORT_COMMIT" ]; then
45+
echo ""
46+
echo "WARNING: Coverage report has no commit metadata (regenerate with latest tooling)."
47+
echo " Run 'make coverage-changed' in coprocessor/fhevm-engine/ to regenerate."
48+
echo ""
49+
exit 0
6350
fi
6451

65-
if [ -z "$REPORT_TIME" ]; then
52+
# Get the latest crate-related commit on this branch
53+
LATEST_CRATE_COMMIT=""
54+
for crate in $CRATE_CHANGES; do
55+
c=$(git log -1 --format=%H "origin/main"..HEAD -- "$COPROCESSOR_DIR$crate/" 2>/dev/null)
56+
if [ -n "$c" ]; then
57+
if [ -z "$LATEST_CRATE_COMMIT" ] || [ "$(git log -1 --format=%ct "$c")" -gt "$(git log -1 --format=%ct "$LATEST_CRATE_COMMIT")" ]; then
58+
LATEST_CRATE_COMMIT="$c"
59+
fi
60+
fi
61+
done
62+
63+
if [ -z "$LATEST_CRATE_COMMIT" ]; then
6664
exit 0
6765
fi
6866

69-
if [ "$REPORT_TIME" -lt "$LAST_COMMIT_TIME" ]; then
67+
# Check if the report was generated at or after the latest crate commit
68+
if ! git merge-base --is-ancestor "$LATEST_CRATE_COMMIT" "$REPORT_COMMIT" 2>/dev/null; then
7069
echo ""
7170
echo "WARNING: Coverage report is stale (generated before latest coprocessor commit)."
7271
echo " Run 'make coverage-changed' in coprocessor/fhevm-engine/ to regenerate."

coprocessor/fhevm-engine/Makefile

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ coverage:
77
TEST_GLOBAL_LOCALSTACK=1 \
88
cargo llvm-cov --no-report --workspace --profile coverage -- --test-threads=1
99
cargo llvm-cov report --profile coverage 2>&1 | tee coverage-report.txt
10+
@echo "# commit: $$(git rev-parse HEAD)" >> coverage-report.txt
1011
@echo ""
1112
@echo "Coverage report saved to coverage-report.txt"
12-
@tail -1 coverage-report.txt
13+
@tail -2 coverage-report.txt
1314

1415
# Run coverage for a specific crate
1516
# Usage: make coverage-crate CRATE=host-listener
@@ -20,9 +21,10 @@ coverage-crate:
2021
TEST_GLOBAL_LOCALSTACK=1 \
2122
cargo llvm-cov --no-report --package $(CRATE) --profile coverage -- --test-threads=1
2223
cargo llvm-cov report --profile coverage 2>&1 | tee coverage-report.txt
24+
@echo "# commit: $$(git rev-parse HEAD)" >> coverage-report.txt
2325
@echo ""
2426
@echo "Coverage report saved to coverage-report.txt"
25-
@tail -1 coverage-report.txt
27+
@tail -2 coverage-report.txt
2628

2729
# Auto-detect changed crates vs main and run coverage only for them
2830
coverage-changed:

coprocessor/fhevm-engine/scripts/coverage-changed.sh

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,63 +11,60 @@ ENGINE_DIR="$REPO_ROOT/coprocessor/fhevm-engine"
1111

1212
cd "$ENGINE_DIR"
1313

14-
# Get changed files relative to the engine directory
15-
CHANGED_FILES=$(git diff --name-only "$BASE_BRANCH"...HEAD -- "$ENGINE_DIR" 2>/dev/null | \
16-
sed "s|^coprocessor/fhevm-engine/||" || true)
14+
# Fetch latest remote to ensure accurate comparison
15+
git fetch origin "$BASE_BRANCH" --quiet 2>/dev/null || true
1716

18-
if [ -z "$CHANGED_FILES" ]; then
19-
# Fallback: compare working tree if no commits ahead
20-
CHANGED_FILES=$(git diff --name-only "$BASE_BRANCH" -- "$ENGINE_DIR" 2>/dev/null | \
21-
sed "s|^coprocessor/fhevm-engine/||" || true)
22-
fi
17+
# Compare only your branch's changes against the remote base branch
18+
# Uses three-dot diff against origin/ to exclude changes already on main
19+
CHANGED_FILES=$(git diff --name-only "origin/$BASE_BRANCH"...HEAD -- "$ENGINE_DIR" 2>/dev/null | \
20+
sed "s|^coprocessor/fhevm-engine/||" || true)
2321

2422
if [ -z "$CHANGED_FILES" ]; then
2523
echo "No changes detected vs $BASE_BRANCH. Nothing to cover."
2624
exit 0
2725
fi
2826

29-
# Extract unique crate names from changed file paths
30-
# e.g. "host-listener/src/cmd/mod.rs" → "host-listener"
31-
# Root-level files (Cargo.toml, etc.) don't match and are skipped
32-
CHANGED_CRATES=$(echo "$CHANGED_FILES" | sed -n 's|^\([^/]*\)/.*|\1|p' | sort -u)
27+
# Extract unique directory names from changed file paths, filtered to actual crates
28+
# e.g. "host-listener/src/cmd/mod.rs" → "host-listener" (only if host-listener/Cargo.toml exists)
29+
# Root-level files (Cargo.toml, Makefile, etc.) are skipped by the sed filter
30+
ALL_DIRS=$(echo "$CHANGED_FILES" | sed -n 's|^\([^/]*\)/.*|\1|p' | sort -u)
3331

34-
# Check for root-level changes that affect all crates (e.g. Cargo.lock)
35-
# Cargo.toml profile/toolchain changes don't require full workspace coverage
36-
ROOT_CRITICAL=$(echo "$CHANGED_FILES" | grep -v '/' | grep -v '\.toml$' || true)
32+
# Only Cargo.lock affects all crates — other root-level files are ignored
3733
if echo "$CHANGED_FILES" | grep -q '^Cargo\.lock$'; then
38-
ROOT_CRITICAL="Cargo.lock"
39-
fi
40-
if [ -n "$ROOT_CRITICAL" ]; then
41-
echo "Workspace config changed ($ROOT_CRITICAL) — running full workspace coverage."
34+
echo "Cargo.lock changed — running full workspace coverage."
4235
echo ""
4336
exec make coverage
4437
fi
4538

39+
# Filter to actual crates (directories with Cargo.toml)
40+
CHANGED_CRATES=""
41+
for dir in $ALL_DIRS; do
42+
if [ -f "$dir/Cargo.toml" ]; then
43+
CHANGED_CRATES="$CHANGED_CRATES $dir"
44+
fi
45+
done
46+
CHANGED_CRATES=$(echo "$CHANGED_CRATES" | xargs)
47+
4648
if [ -z "$CHANGED_CRATES" ]; then
4749
echo "No crate-level changes detected. Nothing to cover."
4850
exit 0
4951
fi
5052

5153
echo "Changed crates:"
52-
echo "$CHANGED_CRATES" | sed 's/^/ - /'
54+
echo "$CHANGED_CRATES" | tr ' ' '\n' | sed 's/^/ - /'
5355
echo ""
5456

5557
# If fhevm-engine-common changed, run full workspace (all crates depend on it)
56-
if echo "$CHANGED_CRATES" | grep -q "^fhevm-engine-common$"; then
58+
if echo "$CHANGED_CRATES" | grep -q "fhevm-engine-common"; then
5759
echo "fhevm-engine-common changed — running full workspace coverage."
5860
echo ""
5961
exec make coverage
6062
fi
6163

62-
# Build --package flags for each changed crate
64+
# Build --package flags
6365
PKG_FLAGS=""
6466
for crate in $CHANGED_CRATES; do
65-
# Skip non-crate directories (e.g. db-migration, scripts)
66-
if [ -f "$crate/Cargo.toml" ]; then
67-
PKG_FLAGS="$PKG_FLAGS --package $crate"
68-
else
69-
echo " Skipping $crate (not a Cargo crate)"
70-
fi
67+
PKG_FLAGS="$PKG_FLAGS --package $crate"
7168
done
7269

7370
if [ -z "$PKG_FLAGS" ]; then
@@ -85,7 +82,8 @@ TEST_GLOBAL_LOCALSTACK=1 \
8582
cargo llvm-cov --no-report $PKG_FLAGS --profile coverage -- --test-threads=1
8683

8784
cargo llvm-cov report --profile coverage 2>&1 | tee coverage-report.txt
85+
echo "# commit: $(git rev-parse HEAD)" >> coverage-report.txt
8886

8987
echo ""
9088
echo "Coverage report saved to coverage-report.txt"
91-
tail -1 coverage-report.txt
89+
tail -2 coverage-report.txt

0 commit comments

Comments
 (0)