Files
dotfiles/script/install
Andrejus b62a6c00f9 chore(install): optimize logging, speed, cleanup
- Version logged after [PASS] (not before) across all scripts
- Pre-cache brew package lists with log_info progress
- Read brew version from git describe cache (skip Ruby startup)
- Batch mise use -g calls (single invocation for all tools)
- Replace mise verify step with mise ls --current
- Parallel vim plugin pulls
- Skip donut compile when binary is fresh
- Pre-check macOS defaults before writing (skip fsync when unchanged)
- Pre-check dock state before dockutil calls
- Remove redundant 'already installed' skip logs
- Remove meetingbar and wispr-flow install scripts
- Renumber scripts to fill gaps

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-24 18:09:38 +00:00

188 lines
5.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -eo pipefail
# --------------------------------------------------------------------
# Script to run all install scripts contained in install.d
#
if [[ -t 1 && -n "$TERM" && "$TERM" != "dumb" ]]; then
TEAL=$'\033[38;2;44;180;148m'
TEAL_BOLD=$'\033[1;38;2;44;180;148m'
RED=$'\033[38;2;248;140;20m'
GREEN=$'\033[38;2;114;144;184m'
YELLOW=$'\033[38;2;252;252;56m'
GREY=$'\033[38;2;128;128;128m'
NC=$'\033[0m'
else
TEAL=""
TEAL_BOLD=""
RED=""
GREEN=""
YELLOW=""
GREY=""
NC=""
fi
# Log functions
log_info() { echo -e "${TEAL}[INFO]${NC} $*"; }
log_pass() { echo -e "${GREEN}[PASS]${NC} $*"; }
log_skip() { echo -e "${GREY}[SKIP]${NC} $*"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
log_error() { echo -e "${RED}[FAIL]${NC} $*"; }
log_debug() { echo -e "${TEAL}$*${NC}"; }
log_quote() { sed "s/^/ ${GREY}│ /" | sed "s/$/${NC}/"; }
# Export log functions
export -f log_info log_pass log_skip log_warn log_error log_debug log_quote
printf "\n\t${TEAL} <<< ${TEAL_BOLD}dots${TEAL} >>> ${NC}\n"
printf "\t${GREY}==============${NC}\n\n"
# High-resolution time helpers
if date +%s%N 2>/dev/null | grep -qE '^[0-9]+$'; then
now_ns() { date +%s%N; }
else
now_ns() { echo $(( $(date +%s) * 1000000000 )); }
fi
# Prevent running as root
if [[ $EUID -eq 0 && -z "$SKIP_SUDO_CHECK" ]]; then
echo -e "${RED}Failed: Running as sudo. Please run as user${NC}\n"
exit 1
fi
# Ensure sudo credentials are cached
if [[ -z "$SKIP_SUDO_CHECK" ]]; then
if ! sudo -n true 2>/dev/null; then
log_warn "Requesting sudo authentication..."
sudo -v
fi
fi
# Set up environment
export DOTS_OS=""
export DOTS_PKG=""
export DOTS_ENV=""
if [[ -n "${CODESPACES:-}" ]]; then
DOTS_ENV="codespaces"
fi
case "$OSTYPE" in
darwin*) DOTS_OS="macos"; DOTS_PKG="brew" ;;
linux*)
DOTS_OS="linux"
if command -v apt-get &>/dev/null; then
DOTS_PKG="apt"
elif command -v pacman &>/dev/null; then
DOTS_PKG="pacman"
elif command -v dnf &>/dev/null; then
DOTS_PKG="dnf"
fi
;;
esac
# Set up Homebrew environment
if [[ "$DOTS_PKG" == "brew" ]]; then
export NONINTERACTIVE=1
export HOMEBREW_NO_ANALYTICS=1
export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
export HOMEBREW_NO_ENV_HINTS=1
export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_NO_INSTALL_CLEANUP=1
fi
# Set up directory variables
if [ -L "$0" ]; then
dir=$(dirname $(readlink -f "$0"))
else
dir=$(dirname "$0")
fi
export DOTFILES=$(dirname "$dir")
install_dir="$DOTFILES/install.d"
# Set up log destination
if [[ -z "$LOG_TARGET" ]]; then
timestamp=$(date +%Y-%m-%dT%H:%M:%S)
uuid=$(
uuidgen 2> /dev/null \
|| cat /proc/sys/kernel/random/uuid 2> /dev/null \
|| echo $RANDOM
)
log_dir="$dir/logs"
mkdir -p "$log_dir"
log_target=${LOG_TARGET:-"$log_dir/$uuid.log"}
else
log_target="$LOG_TARGET"
fi
touch "$log_target"
if [[ ! -f "$log_target" ]]; then
echo -e "${RED}Failed: Unable to create log file \"$log_target\"${NC}\n"
exit 1
fi
log_abs_target=$(readlink -f "$log_target")
# Set up targets
targets=($@)
# Run install scripts
run() {
{
echo "Running \"$(basename "$0")\" at \"$(date)\""
echo "Running as \"$(whoami)\" on \"$(hostname)\""
if [[ -n "$targets" ]]; then
echo "Running ${#targets[@]} install target(s): ${targets[*]}"
else
echo "Running all install targets"
fi
} | log_quote
# Cache brew package lists (avoid repeated slow brew queries in install scripts)
if [[ "$DOTS_PKG" == "brew" ]]; then
log_info "Caching brew package lists..."
export BREW_CASKS=$(brew list --cask 2>/dev/null || true)
export BREW_FORMULAE=$(brew list 2>/dev/null || true)
export BREW_CASK_VERSIONS=$(brew list --cask --versions 2>/dev/null || true)
export BREW_FORMULA_VERSIONS=$(brew list --versions 2>/dev/null || true)
fi
scripts=("$install_dir"/*.sh)
for script in "${scripts[@]}"; do
if [[ -n "$targets" ]]; then
script_name=$(basename "$script" .sh)
script_name=${script_name#*-}
if [[ ! " ${targets[*]} " =~ " $script_name " ]]; then
continue
fi
fi
local script_name=$(basename "$script")
printf "\n\n${TEAL}<<< ${TEAL_BOLD}$script_name:${NC}\n"
local start_ns=$(now_ns)
source "$script"
local end_ns=$(now_ns)
local execution_ms=$(( (end_ns - start_ns) / 1000000 ))
local execution_ms_formatted=$(printf "%'d" "$execution_ms")
local time_color="$GREY"
if (( execution_ms < 2000 )); then
time_color="$GREEN"
elif (( execution_ms < 5000 )); then
time_color="$YELLOW"
else
time_color="$RED"
fi
printf "${TEAL}>>> ${TEAL_BOLD}${script_name}, ${NC}"
printf "completed in ${time_color}${execution_ms_formatted}ms${NC}\n"
done
}
log_info "Logging to \"$log_abs_target\""
total_start_ns=$(now_ns)
run 2>&1 | tee "$log_abs_target"
total_end_ns=$(now_ns)
total_ms=$(( (total_end_ns - total_start_ns) / 1000000 ))
total_s=$(( total_ms / 1000 ))
total_ms_rem=$(( total_ms % 1000 ))
printf "\n${TEAL}Thank you!${NC}\n"
printf "Total time: ${GREEN}%d.%03ds${NC}\n\n" "$total_s" "$total_ms_rem"