206 lines
5.4 KiB
Bash
Executable File
206 lines
5.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# install-deps.sh: Install all system and tooling dependencies.
|
|
# Run this after cloning on a new machine (before install-stow.sh).
|
|
|
|
set -euo pipefail
|
|
|
|
DOTFILES_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Helpers
|
|
# ---------------------------------------------------------------------------
|
|
|
|
ok() { echo " ✓ $*"; }
|
|
info() { echo " → $*"; }
|
|
warn() { echo " ⚠ $*"; }
|
|
header() { echo ""; echo "==> $*"; }
|
|
|
|
have() { command -v "$1" &>/dev/null; }
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Detect Linux distribution
|
|
# ---------------------------------------------------------------------------
|
|
|
|
detect_distro() {
|
|
if [[ -f /etc/os-release ]]; then
|
|
# shellcheck source=/dev/null
|
|
. /etc/os-release
|
|
echo "$ID"
|
|
else
|
|
echo "unknown"
|
|
fi
|
|
}
|
|
|
|
DISTRO=$(detect_distro)
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# System packages
|
|
# ---------------------------------------------------------------------------
|
|
|
|
header "System packages"
|
|
|
|
COMMON_PACKAGES=(
|
|
stow
|
|
swayidle
|
|
mako
|
|
libnotify
|
|
fuzzel
|
|
wireplumber
|
|
brightnessctl
|
|
alsa-utils
|
|
wf-recorder
|
|
slurp
|
|
zenity
|
|
jq
|
|
firefox
|
|
zoxide
|
|
)
|
|
|
|
case "$DISTRO" in
|
|
endeavouros|arch)
|
|
DISTRO_PACKAGES=(
|
|
pipewire-pulse
|
|
ffmpeg
|
|
)
|
|
PACKAGES=("${COMMON_PACKAGES[@]}" "${DISTRO_PACKAGES[@]}")
|
|
|
|
# Warn about pending upgrades (partial upgrades are unsupported on Arch)
|
|
sudo pacman -Sy --noconfirm &>/dev/null
|
|
updates=$(pacman -Qu 2>/dev/null | wc -l)
|
|
if [[ "$updates" -gt 0 ]]; then
|
|
warn "$updates system package(s) are out of date."
|
|
warn "If pacman fails with dependency conflicts, run 'sudo pacman -Syu'"
|
|
warn "locally (not over SSH) then re-run this script."
|
|
echo ""
|
|
fi
|
|
|
|
# Only install packages that aren't already present
|
|
MISSING=()
|
|
for pkg in "${PACKAGES[@]}"; do
|
|
if ! pacman -Q "$pkg" &>/dev/null; then
|
|
MISSING+=("$pkg")
|
|
else
|
|
ok "$pkg"
|
|
fi
|
|
done
|
|
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
|
info "Installing: ${MISSING[*]}"
|
|
sudo pacman -S --noconfirm "${MISSING[@]}"
|
|
fi
|
|
;;
|
|
|
|
fedora|fedora-asahi-remix)
|
|
DISTRO_PACKAGES=(
|
|
pipewire-utils
|
|
ffmpeg
|
|
)
|
|
PACKAGES=("${COMMON_PACKAGES[@]}" "${DISTRO_PACKAGES[@]}")
|
|
|
|
MISSING=()
|
|
for pkg in "${PACKAGES[@]}"; do
|
|
if rpm -q "$pkg" &>/dev/null; then
|
|
ok "$pkg"
|
|
else
|
|
MISSING+=("$pkg")
|
|
fi
|
|
done
|
|
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
|
info "Installing: ${MISSING[*]}"
|
|
sudo dnf install -y "${MISSING[@]}"
|
|
fi
|
|
;;
|
|
|
|
*)
|
|
warn "Unsupported distribution: $DISTRO — skipping system packages."
|
|
;;
|
|
esac
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Tools not in distro repos — warn if missing
|
|
# ---------------------------------------------------------------------------
|
|
|
|
header "Optional tools (manual install)"
|
|
|
|
warn_missing() {
|
|
local cmd="$1" msg="$2"
|
|
if have "$cmd"; then
|
|
ok "$cmd"
|
|
else
|
|
warn "'$cmd' not found — $msg"
|
|
fi
|
|
}
|
|
|
|
warn_missing autotiling "install via pip: pip install --user autotiling"
|
|
warn_missing eww "install from https://github.com/elkowar/eww/releases"
|
|
warn_missing wezterm "install from https://wezfurlong.org/wezterm/install/linux.html"
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Starship
|
|
# ---------------------------------------------------------------------------
|
|
|
|
header "Starship"
|
|
|
|
if have starship; then
|
|
ok "starship already installed"
|
|
else
|
|
info "Installing Starship..."
|
|
curl -sS https://starship.rs/install.sh | sh
|
|
fi
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# npm global packages
|
|
# ---------------------------------------------------------------------------
|
|
|
|
header "npm global packages"
|
|
|
|
if npm list -g --depth=0 @mariozechner/pi-coding-agent &>/dev/null; then
|
|
ok "@mariozechner/pi-coding-agent already installed"
|
|
else
|
|
info "Installing @mariozechner/pi-coding-agent..."
|
|
npm install -g @mariozechner/pi-coding-agent
|
|
fi
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# pi extension dependencies
|
|
# ---------------------------------------------------------------------------
|
|
|
|
header "pi extension node_modules"
|
|
|
|
for ext_dir in "$DOTFILES_DIR"/pi/.pi/agent/extensions/*/; do
|
|
[[ -f "$ext_dir/package.json" ]] || continue
|
|
ext_name="$(basename "$ext_dir")"
|
|
|
|
if [[ -d "$ext_dir/node_modules" ]]; then
|
|
ok "$ext_name (node_modules already present)"
|
|
else
|
|
info "Running npm install for $ext_name..."
|
|
npm install --prefix "$ext_dir" --ignore-scripts
|
|
fi
|
|
done
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Fonts
|
|
# ---------------------------------------------------------------------------
|
|
|
|
header "Fonts"
|
|
|
|
FONT_DIR="$HOME/.local/share/fonts/JetBrainsMono"
|
|
if [[ -d "$FONT_DIR" ]]; then
|
|
ok "JetBrains Mono Nerd Font already installed"
|
|
else
|
|
info "Installing JetBrains Mono Nerd Font..."
|
|
TMP="$(mktemp -d)"
|
|
curl -fLo "$TMP/JetBrainsMono.zip" \
|
|
"https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip"
|
|
mkdir -p "$FONT_DIR"
|
|
unzip -q "$TMP/JetBrainsMono.zip" -d "$FONT_DIR"
|
|
rm -rf "$TMP"
|
|
fc-cache -f "$FONT_DIR"
|
|
ok "Font installed"
|
|
fi
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
echo ""
|
|
echo "All dependencies done. Run ./install-stow.sh to link configs."
|