139 lines
3.8 KiB
Bash
Executable File
139 lines
3.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# Check that all dependencies use workspace = true
|
|
# This ensures consistent dependency versions across the workspace
|
|
|
|
set -e
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
echo "Checking workspace dependency compliance..."
|
|
echo ""
|
|
|
|
ERRORS=0
|
|
WARNINGS=0
|
|
|
|
# List of allowed exceptions (crate-specific dependencies that don't need workspace versions)
|
|
ALLOWED_EXCEPTIONS=(
|
|
# Executor-specific
|
|
"tera"
|
|
"serde_yaml"
|
|
|
|
# API-specific
|
|
"jsonwebtoken"
|
|
"hmac"
|
|
"sha1"
|
|
"hex"
|
|
"utoipa"
|
|
"utoipa-swagger-ui"
|
|
"argon2"
|
|
"rand"
|
|
|
|
# CLI-specific
|
|
"comfy-table"
|
|
"dialoguer"
|
|
"indicatif"
|
|
"dirs"
|
|
"urlencoding"
|
|
"colored"
|
|
|
|
# Sensor-specific
|
|
"cron"
|
|
|
|
# Worker-specific
|
|
"hostname"
|
|
|
|
# Common-specific
|
|
"async-recursion"
|
|
|
|
# Dev/test dependencies (crate-specific)
|
|
"mockito"
|
|
"wiremock"
|
|
"criterion"
|
|
"assert_cmd"
|
|
"predicates"
|
|
"tokio-test"
|
|
)
|
|
|
|
# Function to check if dependency is in allowed exceptions
|
|
is_allowed_exception() {
|
|
local dep="$1"
|
|
for exception in "${ALLOWED_EXCEPTIONS[@]}"; do
|
|
if [[ "$dep" == "$exception" ]]; then
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
# Check each crate's Cargo.toml
|
|
for crate in crates/*/Cargo.toml; do
|
|
crate_name=$(basename $(dirname "$crate"))
|
|
|
|
# Find dependencies that specify version directly (not using workspace)
|
|
# Pattern: dep_name = "version" OR dep_name = { version = "..." } without workspace = true
|
|
# Only look in [dependencies], [dev-dependencies], and [build-dependencies] sections
|
|
violations=$(awk '
|
|
/^\[/ { in_deps=0 }
|
|
/^\[(dependencies|dev-dependencies|build-dependencies)\]/ { in_deps=1; next }
|
|
in_deps && /^[a-z][a-z0-9_-]+ = / && !/workspace = true/ && !/path = / && /(= "|version = ")/ {
|
|
match($0, /^[a-z][a-z0-9_-]+/);
|
|
print substr($0, RSTART, RLENGTH)
|
|
}
|
|
' "$crate" || true)
|
|
|
|
if [ -n "$violations" ]; then
|
|
has_real_violation=false
|
|
|
|
while IFS= read -r dep; do
|
|
dep=$(echo "$dep" | xargs) # trim whitespace
|
|
|
|
if [ -n "$dep" ]; then
|
|
if is_allowed_exception "$dep"; then
|
|
# Skip allowed exceptions
|
|
continue
|
|
else
|
|
if [ "$has_real_violation" = false ]; then
|
|
echo -e "${YELLOW}Checking $crate_name...${NC}"
|
|
has_real_violation=true
|
|
fi
|
|
|
|
# Show the actual line
|
|
line=$(grep "^$dep = " "$crate")
|
|
echo -e " ${RED}✗${NC} $dep"
|
|
echo -e " ${RED}$line${NC}"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
fi
|
|
done <<< "$violations"
|
|
|
|
if [ "$has_real_violation" = true ]; then
|
|
echo ""
|
|
fi
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
|
|
if [ $ERRORS -gt 0 ]; then
|
|
echo -e "${RED}✗ Found $ERRORS dependency version violation(s)${NC}"
|
|
echo ""
|
|
echo "All dependencies should use 'workspace = true' unless they are:"
|
|
echo " 1. Crate-specific dependencies not used elsewhere"
|
|
echo " 2. Listed in the allowed exceptions"
|
|
echo ""
|
|
echo "To fix:"
|
|
echo " 1. Add the dependency to [workspace.dependencies] in Cargo.toml"
|
|
echo " 2. Update the crate to use: dep_name = { workspace = true }"
|
|
echo ""
|
|
echo "Or add to ALLOWED_EXCEPTIONS in this script if it's crate-specific."
|
|
exit 1
|
|
else
|
|
echo -e "${GREEN}✓ All crates use workspace dependencies correctly${NC}"
|
|
echo ""
|
|
echo "Allowed exceptions: ${#ALLOWED_EXCEPTIONS[@]} crate-specific dependencies"
|
|
fi
|