VERSION (racine) devient la source unique de verite MAJEUR.MINEUR.CORRECTIF, incrementee a chaque commit par le hook prepare-commit-msg (BREAKING -> majeur, feat -> mineur, sinon correctif) ; post-commit rattache les fichiers derives au commit et cree le tag vX.Y.Z, publie au push (push.followTags). Tous les derives sont resynchronises : package.json, desktop Tauri, README.md/README.fr.md, docs/ROADMAP.md, CHANGELOG.md. Backend, image Docker et desktop lisent le meme fichier (plus de numero code en dur). Outils : scripts/bump_version.py, scripts/install-hooks.sh. Tests : tests/test_version.py (46, garde-fou de coherence globale).
81 lines
2.7 KiB
Bash
81 lines
2.7 KiB
Bash
#!/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
|