projet crepp_git/crepp-projects/station-meteo/hardware/transmetteur/base/v1.1 · branche main
gitCommit.sh Voir sur GitLab
#!/usr/bin/env bash
set -euo pipefail

# gitCommit.sh — génère la doc PCBA puis commit/push la carte KiCad courante.
# Générique pour n'importe quel repo "1 repo = 1 carte" : le nom du projet
# (et donc le fichier .kicad_sch associé) est déduit automatiquement du
# fichier *.kicad_pcb trouvé à la racine, plus besoin de le coder en dur.
#
# Pas de pipeline CI/CD : tout se passe ici, en local.
#   - _doc/ est committé et poussé (c'est ce que lit le hub central
#     boards.crepp.org via l'API GitLab — voir l'ancien .gitlab-ci.yml).
#   - public/ (site généré par generate_page.py) reste volontairement LOCAL,
#     pour consultation personnelle : jamais ajouté au commit ni poussé,
#     puisqu'il n'y a plus de job "pages" pour le publier de toute façon.

if [ -z "${1:-}" ]; then
  echo "Usage: $0 \"message de commit\""
  exit 1
fi

COMMIT_MSG="$1"

# --- Vérifier que kicad-cli est accessible (natif, Flatpak, ou installé à
# un emplacement standard non présent dans le PATH) AVANT de lancer quoi que
# ce soit. On délègue à kicad_cli_utils.py plutôt que de tester juste
# `command -v kicad-cli` en bash : un simple test de PATH bash ne sait pas
# reconnaître une install Flatpak ("flatpak run --command=kicad-cli
# org.kicad.KiCad"), ni chercher dans les emplacements d'installation
# Windows/macOS/Linux standards quand le PATH est incomplet — toute cette
# logique est écrite une seule fois, en Python, et partagée avec le plugin
# GUI KiCad (voir kicad_cli_utils.py).
if ! python3 scripts/kicad_cli_utils.py; then
  echo "" >&2
  echo "Erreur : kicad-cli introuvable ou non fonctionnel (voir message ci-dessus)." >&2
  exit 1
fi

# --- Repérer le projet KiCad automatiquement ---
mapfile -t PCB_FILES < <(find . -maxdepth 1 -name "*.kicad_pcb")

if [ ${#PCB_FILES[@]} -eq 0 ]; then
  echo "Erreur : aucun fichier *.kicad_pcb trouvé à la racine du repo." >&2
  exit 1
elif [ ${#PCB_FILES[@]} -gt 1 ]; then
  echo "Erreur : plusieurs fichiers *.kicad_pcb trouvés, impossible de choisir automatiquement :" >&2
  printf '  %s\n' "${PCB_FILES[@]}" >&2
  exit 1
fi

PCB_FILE="${PCB_FILES[0]}"
PROJECT_NAME="$(basename "${PCB_FILE%.kicad_pcb}")"
SCH_FILE="${PROJECT_NAME}.kicad_sch"

if [ ! -f "$SCH_FILE" ]; then
  echo "Erreur : fichier schéma attendu introuvable : $SCH_FILE" >&2
  exit 1
fi

echo "Carte détectée : $PROJECT_NAME"

# --- Mise à jour du sommaire du README ---
echo "Update of TOC..."
python3 scripts/generate_TOC.py "README.md"
echo "TOC updated !"

# --- Génération de la doc PCBA ---
mkdir -p _doc
python3 scripts/generate_icd.py "$SCH_FILE" Modules/ _doc/doc.html
python3 scripts/export_board.py
python3 scripts/generate_page.py

# --- Résumé des fichiers générés dans _doc/ (récursif : les gerbers et les
# SVG de couches vivent dans des sous-dossiers, un simple "maxdepth 1" ne les
# verrait jamais et laisserait passer un export kicad-cli entièrement
# silencieusement en échec) ---
echo ""
echo "Contenu de _doc/ :"
FILE_COUNT=0
while IFS= read -r -d '' f; do
  size=$(du -h "$f" | cut -f1)
  printf "  %-50s %s\n" "${f#_doc/}" "$size"
  FILE_COUNT=$((FILE_COUNT + 1))
done < <(find _doc -type f -print0 | sort -z)

if [ "$FILE_COUNT" -eq 0 ]; then
  echo "Attention : _doc/ est vide, rien n'a été généré !" >&2
  exit 1
fi

TOTAL_SIZE=$(du -sh _doc | cut -f1)
echo "  -> $FILE_COUNT fichier(s), $TOTAL_SIZE au total"
echo ""

# --- Vérifications ciblées : gerbers et SVG spécifiquement, puisque ce sont
# eux qui peuvent manquer sans faire échouer le résumé ci-dessus (doc.html,
# lui, est toujours écrit indépendamment de kicad-cli). ---
MISSING=0

n_gerbers=$(find _doc/gerbers -maxdepth 1 -type f 2>/dev/null | wc -l)
if [ "$n_gerbers" -eq 0 ]; then
  echo "Erreur : _doc/gerbers/ est vide ou absent (export kicad-cli des gerbers a échoué)." >&2
  MISSING=1
else
  echo "  -> ${n_gerbers} fichier(s) gerber"
fi

if [ ! -f "_doc/gerbers.zip" ]; then
  echo "Erreur : _doc/gerbers.zip absent (archive des gerbers non générée)." >&2
  MISSING=1
fi

n_svg=$(find _doc/svg -maxdepth 1 -type f -name "*.svg" 2>/dev/null | wc -l)
if [ "$n_svg" -eq 0 ]; then
  echo "Erreur : aucun SVG de schéma dans _doc/svg/ (export kicad-cli des schémas a échoué)." >&2
  MISSING=1
else
  echo "  -> ${n_svg} SVG de schéma"
fi

n_layer_svg=$(find _doc/svg/layers -maxdepth 1 -type f -name "*.svg" 2>/dev/null | wc -l)
if [ "$n_layer_svg" -eq 0 ]; then
  echo "Erreur : aucun SVG de couche dans _doc/svg/layers/ (export kicad-cli des couches a échoué)." >&2
  MISSING=1
else
  echo "  -> ${n_layer_svg} SVG de couche PCB"
fi

if [ "$MISSING" -eq 1 ]; then
  echo "" >&2
  echo "Au moins un export attendu manque. Regarde les logs kicad-cli ci-dessus" >&2
  echo "(cherche '[avertissement] échec de la commande' ou 'commande introuvable')" >&2
  echo "avant de commit/push une doc incomplète." >&2
  exit 1
fi
echo ""

# --- Commit & push ---
# public/ est explicitement exclu (pathspec ':!public'), qu'il soit ou non
# dans .gitignore : c'est un output de consultation locale, plus jamais
# publié automatiquement (pas de pipeline CI ni de job "pages").
# IMPORTANT : `git commit -a` re-stage TOUS les fichiers déjà suivis par
# git, ce qui contournerait cette exclusion si public/ a été committé par le
# passé (avant ce script) — d'où `git add .` explicite SANS `-a` sur commit.
git add . ':!public'
git commit -m "$COMMIT_MSG"
branch=$(git rev-parse --abbrev-ref HEAD)
git push origin "$branch"

echo ""
echo "Site généré localement : file://$(pwd)/public/index.html"
echo "(non commité, non publié — ouvre-le directement dans ton navigateur)"