#!/usr/bin/env bash # push-assets.sh — synchronise les assets locaux vers static.alpinux.org # # Usage : # ./push-assets.sh # aperçu des changements + confirmation # ./push-assets.sh -y # pousse sans confirmation # ./push-assets.sh -n # dry-run seulement (aucune modification) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ENV_FILE="$SCRIPT_DIR/../.env" # ── Couleurs ──────────────────────────────────────────────────────── RED='\033[0;31m'; YELLOW='\033[1;33m'; GREEN='\033[0;32m' CYAN='\033[0;36m'; BOLD='\033[1m'; RESET='\033[0m' # ── Config ────────────────────────────────────────────────────────── if [ ! -f "$ENV_FILE" ]; then echo -e "${RED}Erreur : fichier .env introuvable.${RESET}" echo "Copier scripts/../.env.example en .env et remplir les valeurs." exit 1 fi # shellcheck source=/dev/null source "$ENV_FILE" LOCAL_DIR="${LOCAL_ASSETS_DIR:-/tmp/alpinux-static-assets}" REMOTE_HOST="${STATIC_HOST:?Variable STATIC_HOST manquante dans .env}" REMOTE_PATH="${STATIC_PATH:?Variable STATIC_PATH manquante dans .env}" # STATIC_USER optionnel : si absent, l'alias ~/.ssh/config est utilisé directement if [ -n "${STATIC_USER:-}" ]; then REMOTE="${STATIC_USER}@${REMOTE_HOST}:${REMOTE_PATH}/" else REMOTE="${REMOTE_HOST}:${REMOTE_PATH}/" fi # ── Arguments ─────────────────────────────────────────────────────── DRY_RUN=false AUTO_YES=false for arg in "$@"; do case "$arg" in -n|--dry-run) DRY_RUN=true ;; -y|--yes) AUTO_YES=true ;; -h|--help) sed -n '2,6p' "$0" | sed 's/^# //' exit 0 ;; esac done if [ ! -d "$LOCAL_DIR" ]; then echo -e "${RED}Erreur : répertoire local introuvable : $LOCAL_DIR${RESET}" echo "Lancer d'abord : python3 wiki/scripts/build-assets.py" exit 1 fi # ── Analyse des changements ───────────────────────────────────────── echo -e "${BOLD}Analyse des changements…${RESET}" echo -e " Source : ${CYAN}$LOCAL_DIR/${RESET}" echo -e " Cible : ${CYAN}$REMOTE${RESET}" echo "" EXCLUDES=(--exclude='.git/' --exclude='scripts/' --exclude='app/' --exclude='README.md' --exclude='.env' --exclude='.env.example' --exclude='.gitignore') DIFF=$(rsync -rlcz --dry-run --itemize-changes --delete \ --rsync-path="sudo rsync" \ "${EXCLUDES[@]}" \ "$LOCAL_DIR/" "$REMOTE" 2>&1) NEW=0; CHANGED=0; DELETED=0 while IFS= read -r line; do item="${line:0:11}" file="${line:12}" [ -z "$file" ] && continue if [[ "$item" == *"deleting"* ]]; then echo -e " ${RED}supprimé ${RESET} $file" DELETED=$(( DELETED + 1 )) elif [[ "$item" =~ ^\