#!/usr/bin/env bash # ============================================================================= # run_onchange_30-ensure-cargo.sh.tmpl # Make sure rustup/cargo is available. If not, install rustup. # After cargo is ready, install bat from crates.io on debian (apt renames # upstream bat to batcat, which breaks .zshrc's `alias cat=bat`). # # Runs on every apply because the script body rarely changes but we want a # fresh check after package installs. # ============================================================================= set -euo pipefail log() { printf '\033[1;34m[cargo]\033[0m %s\n' "$*"; } # --- 1. Ensure cargo is on PATH --- if ! command -v cargo >/dev/null 2>&1; then if command -v rustup >/dev/null 2>&1; then log "rustup present but cargo missing — running rustup default" rustup default stable else log "no cargo or rustup — installing rustup" sh -c "$(curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs)" -- -y --default-toolchain stable --profile minimal # shellcheck disable=SC1091 source "$HOME/.cargo/env" fi fi # Ensure subsequent commands in this script can find cargo export PATH="$HOME/.cargo/bin:$PATH" log "rustup installed: $(rustup --version 2>/dev/null || echo unknown)" log "cargo installed: $(cargo --version)" # --- 2. Install bat from crates.io if missing (debian only) --- {{ if eq .os_family "debian" -}} if ! command -v bat >/dev/null 2>&1; then log "installing bat via cargo (upstream, debian renames it to batcat)" cargo install bat --locked log "bat installed: $(bat --version)" else log "bat already installed: $(bat --version)" fi {{ else -}} # Arch already installs upstream bat via pacman; nothing extra to do. log "skipping cargo bat install (os_family={{ .os_family }}, pacman handles it)" {{ end -}}