feat: Add project integrity check script
This script automates checks for formatting, linting, building, and testing across all Cargo workspaces and the Wear OS Gradle build. It provides a summary of all stages, indicating PASS, WARN, or FAIL. The script's exit code reflects the number of failed stages.
This commit is contained in:
Executable
+113
@@ -0,0 +1,113 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Project integrity check after a refactor.
|
||||||
|
# Runs fmt, clippy, build and tests for every Cargo world plus the Wear OS Gradle build.
|
||||||
|
# All stages run even if earlier ones fail. A summary table is printed at the end.
|
||||||
|
# Exit code equals the number of FAIL stages (WARN stages do not count).
|
||||||
|
|
||||||
|
set -u
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
export JAVA_HOME="/opt/android-studio/jbr"
|
||||||
|
|
||||||
|
# Colors only when stdout is a terminal
|
||||||
|
if [[ -t 1 ]]; then
|
||||||
|
C_RESET=$'\e[0m'
|
||||||
|
C_RED=$'\e[31m'
|
||||||
|
C_GREEN=$'\e[32m'
|
||||||
|
C_YELLOW=$'\e[33m'
|
||||||
|
C_BOLD=$'\e[1m'
|
||||||
|
else
|
||||||
|
C_RESET=""
|
||||||
|
C_RED=""
|
||||||
|
C_GREEN=""
|
||||||
|
C_YELLOW=""
|
||||||
|
C_BOLD=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Stage results, parallel arrays
|
||||||
|
STAGE_NAMES=()
|
||||||
|
STAGE_STATUS=()
|
||||||
|
STAGE_SECONDS=()
|
||||||
|
FAIL_COUNT=0
|
||||||
|
|
||||||
|
# run_stage <label> <working-dir> <severity> <cmd...>
|
||||||
|
# severity = "fail" -> non-zero exit marks FAIL and increments FAIL_COUNT
|
||||||
|
# severity = "warn" -> non-zero exit marks WARN, does not affect exit code
|
||||||
|
run_stage() {
|
||||||
|
local label="$1"; shift
|
||||||
|
local workdir="$1"; shift
|
||||||
|
local severity="$1"; shift
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "${C_BOLD}=== ${label} ===${C_RESET}"
|
||||||
|
echo " dir: ${workdir}"
|
||||||
|
echo " cmd: $*"
|
||||||
|
|
||||||
|
local start=$SECONDS
|
||||||
|
local rc=0
|
||||||
|
( cd "$workdir" && "$@" ) || rc=$?
|
||||||
|
local dur=$(( SECONDS - start ))
|
||||||
|
|
||||||
|
STAGE_NAMES+=("$label")
|
||||||
|
STAGE_SECONDS+=("$dur")
|
||||||
|
|
||||||
|
if [[ $rc -eq 0 ]]; then
|
||||||
|
STAGE_STATUS+=("PASS")
|
||||||
|
echo "${C_GREEN}-> PASS${C_RESET} (${dur}s)"
|
||||||
|
elif [[ "$severity" == "warn" ]]; then
|
||||||
|
STAGE_STATUS+=("WARN")
|
||||||
|
echo "${C_YELLOW}-> WARN (rc=${rc})${C_RESET} (${dur}s) -- not counted as failure"
|
||||||
|
else
|
||||||
|
STAGE_STATUS+=("FAIL")
|
||||||
|
FAIL_COUNT=$(( FAIL_COUNT + 1 ))
|
||||||
|
echo "${C_RED}-> FAIL (rc=${rc})${C_RESET} (${dur}s)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# fmt is executed (not --check), so the working tree may be modified.
|
||||||
|
# clippy escalates warnings to errors per project convention.
|
||||||
|
# test uses -j 4 to avoid linker thrashing on a many-crate workspace.
|
||||||
|
cargo_world() {
|
||||||
|
local world_label="$1"
|
||||||
|
local dir="$2"
|
||||||
|
run_stage "${world_label} :: fmt" "$dir" fail cargo fmt
|
||||||
|
run_stage "${world_label} :: clippy" "$dir" fail cargo clippy --all-targets --all-features -- -D warnings
|
||||||
|
run_stage "${world_label} :: build" "$dir" fail cargo build --all-targets
|
||||||
|
run_stage "${world_label} :: test" "$dir" fail cargo test -j 4
|
||||||
|
}
|
||||||
|
|
||||||
|
cargo_world "common" "${REPO_ROOT}/common"
|
||||||
|
cargo_world "server" "${REPO_ROOT}/server"
|
||||||
|
cargo_world "clients/desktop" "${REPO_ROOT}/clients/desktop"
|
||||||
|
cargo_world "experiments" "${REPO_ROOT}/experiments"
|
||||||
|
|
||||||
|
# Wear OS (Gradle). lintDebug is WARN-only because legacy Android Lint findings
|
||||||
|
# would otherwise turn the script red regardless of the refactor under review.
|
||||||
|
# Instrumented tests are intentionally excluded (AVD MockWebServer hang, see memory).
|
||||||
|
WEAROS_DIR="${REPO_ROOT}/clients/wearos"
|
||||||
|
run_stage "wearos :: assembleDebug" "$WEAROS_DIR" fail ./gradlew assembleDebug
|
||||||
|
run_stage "wearos :: lintDebug" "$WEAROS_DIR" warn ./gradlew lintDebug
|
||||||
|
run_stage "wearos :: testDebugUnitTest" "$WEAROS_DIR" fail ./gradlew testDebugUnitTest
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
echo
|
||||||
|
echo "${C_BOLD}========== SUMMARY ==========${C_RESET}"
|
||||||
|
total=0
|
||||||
|
for i in "${!STAGE_NAMES[@]}"; do
|
||||||
|
name="${STAGE_NAMES[$i]}"
|
||||||
|
status="${STAGE_STATUS[$i]}"
|
||||||
|
dur="${STAGE_SECONDS[$i]}"
|
||||||
|
total=$(( total + dur ))
|
||||||
|
case "$status" in
|
||||||
|
PASS) color="$C_GREEN" ;;
|
||||||
|
WARN) color="$C_YELLOW" ;;
|
||||||
|
FAIL) color="$C_RED" ;;
|
||||||
|
*) color="" ;;
|
||||||
|
esac
|
||||||
|
printf " %s%-4s%s %5ds %s\n" "$color" "$status" "$C_RESET" "$dur" "$name"
|
||||||
|
done
|
||||||
|
echo " ----"
|
||||||
|
printf " total: %ds across %d stages, %d failure(s)\n" "$total" "${#STAGE_NAMES[@]}" "$FAIL_COUNT"
|
||||||
|
|
||||||
|
exit "$FAIL_COUNT"
|
||||||
Reference in New Issue
Block a user