#!/usr/bin/env bash # Exit 0 if every submodule has a clean working tree (no modified/untracked files). # Use in CI or after merges: bash scripts/verify/submodules-clean.sh # Set SKIP_EXIT=1 to report dirty submodules without failing. set -euo pipefail ROOT="$(cd "$(dirname "$0")/../.." && pwd)" cd "$ROOT" SKIP_EXIT="${SKIP_EXIT:-0}" tmp="$(mktemp)" trap 'rm -f "$tmp"' EXIT dirty=0 while IFS= read -r subpath; do [[ -z "$subpath" ]] && continue if ! git -C "$ROOT/$subpath" rev-parse --git-dir >/dev/null 2>&1; then continue fi out="$(git -C "$ROOT/$subpath" status --porcelain 2>/dev/null || true)" if [[ -n "$out" ]]; then dirty=1 printf '%s\n' "=== $subpath ===" >>"$tmp" printf '%s\n' "$out" >>"$tmp" fi done < <(git config --file .gitmodules --get-regexp '^submodule\..*\.path$' | awk '{print $2}' | sort -u) if (( dirty )); then echo "submodules-clean: dirty submodule working trees:" >&2 cat "$tmp" >&2 if [[ "$SKIP_EXIT" != "1" ]]; then exit 1 fi exit 0 fi echo "submodules-clean: OK (all submodules clean)"