tools/push.sh : wrapper git push avec token PAT depuis ~/Projets/Redox/.env

Plus besoin de taper user/password manuellement à chaque push. Charge la
variable redox_wayland depuis le .env hors-repo, injecte-la dans une URL
temporaire passée comme argument à `git push` (pas de persistance dans
.git/config), redacte le token de toute sortie au cas où il fuiterait
dans un message d'erreur, et fait un fetch après pour synchroniser
correctement le tracking ref origin/main.

Note implémentation : `git -c remote.origin.url=...` ne semble PAS
overrider l'URL utilisée pour push (testé localement), donc on passe
l'URL en argument explicite. Inconvénient : tracking ref ne se met pas
à jour automatiquement → on ajoute un git fetch ciblé après succès du
push pour réaligner origin/main.

Usage : tools/push.sh [args git push optionnels]
Surcharge : REDOX_ENV=/autre/.env tools/push.sh

Leyoda 2026 – GPLv3
This commit is contained in:
Votre Nom 2026-05-16 15:05:29 +02:00
parent c8b2cb5b61
commit ef06962c1c

88
tools/push.sh Executable file
View file

@ -0,0 +1,88 @@
#!/usr/bin/env bash
# Wrapper `git push` qui charge le token PAT depuis ~/Projets/Redox/.env
# (variable `redox_wayland=...`) et l'injecte temporairement dans
# remote.origin.url pour authentifier le push contre forge.aditua.com.
#
# Le token n'est jamais écrit dans .git/config (on utilise `git -c` qui
# ne persiste pas), n'est pas écrit dans le wrapper, et est redacté du
# stdout/stderr s'il y apparaissait par accident.
#
# Usage :
# tools/push.sh # équivalent à `git push origin`
# tools/push.sh main # push de main spécifiquement
# tools/push.sh --force-with-lease # forward les flags à git push
# tools/push.sh tag v0.1.0 # push d'un tag
#
# Surcharge : `REDOX_ENV=/autre/.env tools/push.sh` pour pointer un
# fichier .env alternatif.
set -e
set -o pipefail
ENV_FILE="${REDOX_ENV:-$HOME/Projets/Redox/.env}"
if [[ ! -f "$ENV_FILE" ]]; then
echo "ERR: fichier env introuvable : $ENV_FILE" >&2
echo " Définis REDOX_ENV=<chemin> pour pointer un autre fichier." >&2
exit 1
fi
# Extraction défensive du token. Tolère "=", quotes simples/doubles,
# espaces autour. La regex `^redox_wayland=` exige le format clé=valeur
# en début de ligne.
TOKEN=$(grep -E "^redox_wayland=" "$ENV_FILE" \
| head -1 \
| cut -d= -f2- \
| tr -d '"' \
| tr -d "'" \
| tr -d '[:space:]')
if [[ -z "$TOKEN" ]]; then
echo "ERR: variable redox_wayland vide ou absente dans $ENV_FILE" >&2
exit 1
fi
# URL origin actuelle (sans token — on l'a vérifié à l'initial push).
ORIGIN_URL=$(git remote get-url origin)
if [[ -z "$ORIGIN_URL" ]]; then
echo "ERR: pas de remote 'origin' configuré dans ce repo" >&2
exit 1
fi
# Injection du token : remplace https:// par https://leyoda:TOKEN@.
# Si l'URL n'est pas en https, on ne sait pas comment l'authentifier
# (SSH n'a pas besoin de cette gymnastique), on signale.
case "$ORIGIN_URL" in
https://*)
# On utilise sed plutôt que l'expansion bash ${VAR/from/to}
# qui ne gère pas bien les `/` dans pattern/replacement.
# `|` comme délimiteur sed pour éviter d'escaper les `/` de l'URL.
TOKENED_URL=$(printf '%s' "$ORIGIN_URL" | sed "s|^https://|https://leyoda:${TOKEN}@|")
;;
*)
echo "ERR: origin n'est pas en https:// (got: $ORIGIN_URL)" >&2
echo " Si tu es passé en SSH, ce wrapper n'est plus utile." >&2
exit 1
;;
esac
# Push direct via l'URL tokenée. `git -c remote.origin.url=` ne fait pas
# l'override d'URL pour le push (au moins sur cette version de git),
# donc on passe l'URL en argument explicite.
# Toute occurrence du token dans la sortie est redactée par sécurité.
git push "$TOKENED_URL" "$@" 2>&1 \
| sed "s|${TOKEN}|***REDACTED***|g"
PUSH_STATUS=${PIPESTATUS[0]}
# Si le push a réussi, synchroniser le tracking ref origin/main pour que
# `git status` reflète l'état distant (sinon il reste sur l'ancien tip
# de origin/main car on n'a pas pushé via le nom "origin").
if [[ $PUSH_STATUS -eq 0 ]]; then
git fetch "$TOKENED_URL" --quiet \
"+refs/heads/main:refs/remotes/origin/main" 2>/dev/null \
| sed "s|${TOKEN}|***REDACTED***|g" || true
fi
unset TOKEN TOKENED_URL
exit $PUSH_STATUS