#!/bin/bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Le dépôt est cloné dans ~/.dotfiles, avec cette structure : # ~/.dotfiles/dotfiles/ -> packages stow (zellij, spaceship, zsh) # ~/.dotfiles/install/ -> ce script # DOTFILES_DIR pointe donc sur le sous-dossier "dotfiles" voisin de "install". DOTFILES_DIR="$(cd "$SCRIPT_DIR/../dotfiles" && pwd)" log() { echo "[*] $*"; } err() { echo "Erreur: $*" >&2; } # usage: stow_config # Si le répertoire cible existe déjà, on ne touche à rien (idempotence # non-destructive) : on suppose que la config est déjà en place. stow_config() { local package="$1" local target="$2" if [ -e "$target" ]; then log "Config déjà présente ($target), on ne touche à rien. Skip." return fi mkdir -p "$target" log "Stow du package '$package' vers $target ..." (cd "$DOTFILES_DIR" && stow -vSt "$target" "$package") } # --- 1. Dépendances système --- log "Mise à jour des paquets apt ..." sudo apt update log "Installation des dépendances apt ..." sudo apt -y install apt-transport-https curl gnupg stow zsh fzf # --- 2. Rust / cargo --- if ! command -v cargo >/dev/null 2>&1; then log "cargo introuvable, installation de rustup ..." curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y fi if [ -f "$HOME/.cargo/env" ]; then # shellcheck disable=SC1091 source "$HOME/.cargo/env" fi if ! command -v cargo >/dev/null 2>&1; then err "cargo toujours introuvable après installation, abandon." exit 1 fi # --- 3. Zellij + sa config --- log "Installation de zellij ..." cargo install --locked zellij stow_config "zellij" "$HOME/.config/zellij" # --- 4. Zsh perso --- # Le fichier reste nommé "zshrc.perso" (sans point) dans le dépôt, # mais on veut un symlink caché ~/.zshrc.perso. stow ne permet pas ce # renommage nativement (sauf convention "dot-" qu'on ne veut pas imposer # au dépôt), donc on crée le symlink manuellement. ZSHRC_PERSO_SRC="$DOTFILES_DIR/zsh/zshrc.perso" ZSHRC_PERSO_DEST="$HOME/.zshrc.perso" if [ -e "$ZSHRC_PERSO_DEST" ] || [ -L "$ZSHRC_PERSO_DEST" ]; then log "$ZSHRC_PERSO_DEST existe déjà, on ne touche à rien. Skip." else if [ ! -f "$ZSHRC_PERSO_SRC" ]; then err "Fichier source introuvable : $ZSHRC_PERSO_SRC" exit 1 fi log "Création du symlink $ZSHRC_PERSO_DEST -> $ZSHRC_PERSO_SRC ..." ln -s "$ZSHRC_PERSO_SRC" "$ZSHRC_PERSO_DEST" fi # --- 5. Spaceship (prompt zsh) --- SPACESHIP_DIR="$HOME/.zsh/spaceship-prompt" if [ -d "$SPACESHIP_DIR/.git" ]; then log "Spaceship (upstream) déjà présent, mise à jour ..." git -C "$SPACESHIP_DIR" pull --ff-only elif [ -e "$SPACESHIP_DIR" ]; then log "$SPACESHIP_DIR existe mais n'est pas un dépôt git, on ne touche à rien. Skip." else log "Installation de spaceship (clone upstream) ..." mkdir -p "$HOME/.zsh" git clone --depth=1 https://github.com/spaceship-prompt/spaceship-prompt.git "$SPACESHIP_DIR" fi stow_config "spaceship" "$HOME/.config/spaceship" # --- 6. Outils Rust additionnels --- log "Installation des outils Rust (bat, bottom, diskus, procs, cargo-update) ..." cargo install --locked bat bottom diskus procs cargo-update log "Installation terminée avec succès."