#!/bin/sh # ----------------------------------------------------------------------------- # ObsiGate — incrément automatique de la version livrée (SemVer) à chaque commit. # # Source unique de vérité : ./VERSION (MAJEUR.MINEUR.CORRECTIF) # # `!:` / `BREAKING CHANGE:` -> MAJEUR (x.0.0) # `feat:` -> MINEUR (x.y.0) # tout le reste (fix, perf…) -> CORRECTIF (x.y.z) # # Aucun incrément pour : merge, squash, revert, `chore(release)`, amend. # Commit rédigé dans un éditeur (message pas encore saisi) : l'incrément est # différé à `post-commit`, qui dispose du message final. # # `scripts/bump_version.py` incrémente VERSION et resynchronise les fichiers # dérivés (package.json, desktop, READMEs, ROADMAP, CHANGELOG) ; le `git add` est # fait ici, par le hook lui-même. La liste des fichiers est laissée à # `.githooks/post-commit`, qui rattache l'incrément au commit (git fige l'arbre # avant `prepare-commit-msg` : un `git add` à cet instant ne serait pris en # compte qu'au commit suivant). # # Neutraliser ponctuellement : SKIP_VERSION_BUMP=1 git commit ... # ----------------------------------------------------------------------------- set -eu [ "${SKIP_VERSION_BUMP:-}" = "" ] || exit 0 msg_file="${1:-}" source_kind="${2:-message}" case "$source_kind" in merge|squash|commit) exit 0 ;; # merge / squash / amend (-c, -C, --amend) esac [ -n "$msg_file" ] && [ -f "$msg_file" ] || exit 0 root="$(git rev-parse --show-toplevel)" tool="$root/scripts/bump_version.py" [ -f "$tool" ] || exit 0 py="" for cand in python3 python; do if command -v "$cand" >/dev/null 2>&1; then py="$cand"; break; fi done if [ -z "$py" ]; then echo "⚠ version : aucun interpréteur Python trouvé — version non incrémentée." >&2 exit 0 fi list="$(git rev-parse --git-path obsigate-version-files)" defer="$(git rev-parse --git-path obsigate-version-defer)" # Message pas encore rédigé (ouverture d'un éditeur) : on diffère l'incrément. if ! grep -qvE '^[[:space:]]*(#|$)' "$msg_file"; then : > "$defer" exit 0 fi rm -f "$defer" # marqueur d'un commit précédent avorté out="" if out="$("$py" "$tool" --from-message-file "$msg_file" --files-out "$list" 2>&1)"; then printf '%s\n' "$out" else status=$? if [ "$status" = "3" ]; then rm -f "$list" exit 0 # 3 = version inchangée (revert, release…) : pas une erreur fi echo "✗ version : échec de l'incrément automatique de ./VERSION" >&2 printf '%s\n' "$out" >&2 echo " → corriger, ou passer outre avec : SKIP_VERSION_BUMP=1 git commit ..." >&2 exit 1 fi # Ajout des fichiers synchronisés (chemins explicites). if [ -s "$list" ]; then # shellcheck disable=SC2046 git add -- $(tr -d '\r' < "$list") fi