#!/usr/bin/env bash # Vérifications de style communes à tout le dépôt : # - fichiers texte en UTF-8, fins de ligne Unix, sans espaces en fin de ligne, # terminés par un saut de ligne ; # - scripts shell analysés par ShellCheck (dans Docker). set -euo pipefail cd "$(dirname "$0")/.." erreurs=0 signaler() { echo "$1" erreurs=$((erreurs + 1)) } # Fichiers suivis par git, plus les nouveaux fichiers non ignorés. mapfile -t fichiers < <(git ls-files --cached --others --exclude-standard | grep -v '^LICENSE$') for f in "${fichiers[@]}"; do [ -f "$f" ] || continue case "$(file --brief --mime-encoding "$f")" in binary) continue ;; us-ascii | utf-8) ;; *) signaler "$f : encodage autre que UTF-8" ;; esac if grep -qE '^(<<<<<<<|>>>>>>>)( |$)' "$f"; then signaler "$f : marqueurs de conflit git restants" fi if grep -q $'\r' "$f"; then signaler "$f : fins de ligne Windows (CRLF)" fi # Copies fidèles de GNU Backgammon (sources et données) et de la licence # de la police : on ne reformate pas leurs espaces, pour rester # identique à l'original. case "$f" in engine/gnubg/* | engine/data/* | web/fonts/OFL.txt) continue ;; esac if grep -nE '[[:blank:]]+$' "$f" >/dev/null; then signaler "$f : espaces en fin de ligne (lignes $(grep -nE '[[:blank:]]+$' "$f" | cut -d: -f1 | paste -sd, -))" fi if [ -s "$f" ] && [ -n "$(tail -c1 "$f")" ]; then signaler "$f : pas de saut de ligne final" fi done mapfile -t scripts < <(printf '%s\n' "${fichiers[@]}" | grep -E '\.sh$' || true) if [ "${#scripts[@]}" -gt 0 ]; then if ! docker image inspect "${SHELLCHECK_IMAGE:?lancer via make lint}" >/dev/null 2>&1; then signaler "ShellCheck absent : lancer d'abord make setup" elif ! docker run --rm -v "$PWD:/src:ro" -w /src "$SHELLCHECK_IMAGE" shellcheck "${scripts[@]}"; then signaler "ShellCheck a trouvé des problèmes (voir ci-dessus)" fi fi # Application web (ADR 0009), dans Docker : Biome (style et erreurs # courantes) et TypeScript (types). Le domaine est vérifié une seconde fois # seul, sans les types de Node ni du navigateur : il doit rester pur. if ! docker image inspect "${WEB_IMAGE:?lancer via make lint}" >/dev/null 2>&1; then signaler "Outils web absents : lancer d'abord make setup" else web=(docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/src:ro" -w /src/app "$WEB_IMAGE") "${web[@]}" biome check . || signaler "Biome a trouvé des problèmes (voir ci-dessus)" "${web[@]}" tsc -p tsconfig.json --noEmit || signaler "TypeScript a trouvé des erreurs (voir ci-dessus)" "${web[@]}" tsc -p src/domain/tsconfig.json \ || signaler "le domaine utilise Node ou le navigateur (voir ci-dessus)" fi if [ "$erreurs" -gt 0 ]; then echo "Lint : $erreurs problème(s)." exit 1 fi echo "Lint : aucun problème."