#!/usr/bin/env bash # One-shot, host-aware dotfile linker for Linux & macOS. # # home_root/* -> ~/ (e.g. ~/.zshrc) via `stow home_root` # home_config/* -> ~/.config/ (e.g. ~/.config/nvim) via `stow home_config` # # Ensures GNU stow is present first (Homebrew on macOS; apt/dnf/pacman on Linux), # so a fresh box needs nothing pre-installed. Re-running is safe — stow is # idempotent and refuses to clobber unrelated real files. # # Windows / PowerShell: run ./link-dotfiles.ps1 instead (stow has no native # Windows port; the .ps1 mirrors this with junctions + symlinks). set -euo pipefail repo="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$repo" # `--apps`: install all host CLI tools first, then link. Without it, this only # links (fast + idempotent). App install is delegated to the host-aware # lk-installers/install-apps. if [ "${1:-}" = "--apps" ]; then echo "Installing apps first (--apps)…" "$repo/lk-installers/install-apps" fi ensure_stow() { command -v stow >/dev/null 2>&1 && return echo "GNU stow not found — installing it…" case "$(uname -s)" in Darwin) if ! command -v brew >/dev/null 2>&1; then echo "error: Homebrew is required on macOS. Run ./lk-installers/install-apps (or ./link-dotfiles --apps) first." >&2 exit 1 fi brew install stow ;; Linux) if command -v apt >/dev/null 2>&1; then sudo apt update && sudo apt install -y stow elif command -v dnf >/dev/null 2>&1; then sudo dnf install -y stow elif command -v pacman >/dev/null 2>&1; then sudo pacman -S --noconfirm stow else echo "error: no supported package manager (apt/dnf/pacman). Install GNU stow manually." >&2 exit 1 fi ;; *) echo "error: unsupported OS '$(uname -s)'. On Windows run ./link-dotfiles.ps1 instead." >&2 exit 1 ;; esac } ensure_stow echo "Linking home_root -> ~" stow -v home_root echo "Linking home_config -> ~/.config" stow -v --target="$HOME/.config" home_config echo "Done."