Files
dotfiles/link-dotfiles
vh bf179ef0b1 feat(installers): consolidate app installers into host-aware install-apps
Fold macinstaller + install-apt-pkgs + install-tools + install-zellij into a
single host-aware lk-installers/install-apps (macOS->Homebrew, bootstrapping
Homebrew if absent; Linux->apt + upstream installers). Installs the tools the
configs assume (bat, fd, fzf, zoxide, zellij, nvim, btop, htop, tldr) plus the
fzf-git.sh helper and fzf shell integration; idempotent.

link-dotfiles gains --apps to install then link in one shot. .zshrc drops the
redundant brew/system zsh-autosuggestions source (zinit already loads it),
fixing the missing-file error on a fresh box. README documents the new flow.
2026-06-26 07:55:16 -07:00

62 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# One-shot, host-aware dotfile linker for Linux & macOS.
#
# home_root/* -> ~/<name> (e.g. ~/.zshrc) via `stow home_root`
# home_config/* -> ~/.config/<name> (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."