#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' readonly SCRIPT_NAME="${0##*/}" readonly FONT_BASE_DIR="$HOME/.local/share/fonts" readonly TMP_DIR="$(mktemp -d)" log() { printf '\033[1;34m[%s]\033[0m %s\n' "${SCRIPT_NAME%.sh}" "$*"; } warn() { printf '\033[1;33m[%s] WARN:\033[0m %s\n' "${SCRIPT_NAME%.sh}" "$*" >&2; } die() { printf '\033[1;31m[%s] ERROR:\033[0m %s\n' "${SCRIPT_NAME%.sh}" "$*" >&2; exit 1; } cleanup() { rm -rf "$TMP_DIR" } trap cleanup EXIT if (( EUID == 0 )); then die "Do not run as root. Run as your normal desktop user so fonts install under $HOME." fi for tool in curl unzip fc-cache find; do command -v "$tool" >/dev/null 2>&1 || die "Missing required tool: $tool" done latest_nerd_font_url() { local asset_name="$1" local url url="$( curl -fsSL https://api.github.com/repos/ryanoasis/nerd-fonts/releases/latest \ | grep "browser_download_url.*${asset_name}" \ | cut -d '"' -f 4 \ | head -n 1 \ || true )" [[ -n "$url" ]] || die "Could not find download URL for $asset_name. Check connectivity or GitHub API limits." printf '%s' "$url" } install_nerd_font() { local display_name="$1" local asset_name="$2" local font_dir="$3" local download_url="$4" local zip_path="$TMP_DIR/${asset_name}.zip" local extract_dir="$TMP_DIR/${asset_name}" local installed_count if [[ -z "$download_url" ]]; then log "Finding latest $display_name release..." download_url="$(latest_nerd_font_url "${asset_name}.zip")" fi log "Downloading $display_name..." curl -fL --retry 3 --retry-delay 2 -o "$zip_path" "$download_url" log "Extracting $display_name..." mkdir -p "$extract_dir" "$font_dir" unzip -q -o "$zip_path" -d "$extract_dir" installed_count="$( find "$extract_dir" -type f \( -name '*.ttf' -o -name '*.otf' \) \ -exec cp {} "$font_dir/" \; \ -printf '.' \ | wc -c )" [[ "$installed_count" -gt 0 ]] || die "No font files found in ${asset_name}.zip" find "$font_dir" -type f \( -name '*.ttf' -o -name '*.otf' \) -exec chmod 0644 {} + log "Installed $installed_count font files to $font_dir" } mkdir -p "$FONT_BASE_DIR" install_nerd_font \ "Ubuntu Sans Nerd Font" \ "UbuntuSans" \ "$FONT_BASE_DIR/UbuntuSans" \ "" install_nerd_font \ "JetBrains Mono Nerd Font" \ "JetBrainsMono" \ "$FONT_BASE_DIR/JetBrainsMonoNerdFont" \ "" log "Updating font cache..." fc-cache -f "$FONT_BASE_DIR" if command -v fc-match >/dev/null 2>&1; then log "Resolved terminal font: $(fc-match 'JetBrainsMono Nerd Font Mono')" fi log "Done. Configure your terminal to use JetBrainsMono Nerd Font Mono for Starship Powerline symbols."