From b62a6c00f96e66da89f497e576aa5430c98625fd Mon Sep 17 00:00:00 2001 From: Andrejus Date: Tue, 24 Mar 2026 18:09:17 +0000 Subject: [PATCH] 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> --- .gitignore | 1 + install.d/10-brew.sh | 2 +- install.d/11-apt.sh | 2 +- install.d/12-pacman.sh | 2 +- install.d/20-ssh.sh | 2 +- install.d/21-git.sh | 2 +- install.d/24-tmux.sh | 12 +- install.d/25-vim.sh | 9 +- install.d/{27-preview.sh => 26-preview.sh} | 5 +- install.d/30-mise.sh | 29 +--- install.d/41-docker.sh | 2 +- install.d/42-azure.sh | 2 +- install.d/50-redis.sh | 2 +- install.d/70-cca.sh | 3 +- install.d/71-rectangle.sh | 3 +- ...3-betterdisplay.sh => 72-betterdisplay.sh} | 3 +- install.d/72-meetingbar.sh | 16 -- install.d/{74-dockutil.sh => 73-dockutil.sh} | 3 +- install.d/{76-vscode.sh => 74-vscode.sh} | 3 +- install.d/{81-cmatrix.sh => 75-cmatrix.sh} | 2 +- install.d/75-wispr-flow.sh | 16 -- install.d/90-macos.sh | 157 +++++------------- script/install | 14 +- 23 files changed, 88 insertions(+), 204 deletions(-) rename install.d/{27-preview.sh => 26-preview.sh} (99%) rename install.d/{73-betterdisplay.sh => 72-betterdisplay.sh} (85%) delete mode 100755 install.d/72-meetingbar.sh rename install.d/{74-dockutil.sh => 73-dockutil.sh} (84%) rename install.d/{76-vscode.sh => 74-vscode.sh} (84%) rename install.d/{81-cmatrix.sh => 75-cmatrix.sh} (100%) delete mode 100644 install.d/75-wispr-flow.sh diff --git a/.gitignore b/.gitignore index f5ea053..d88611e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ home/.vim/pack # compiled binaries home/.tmux/donut +*.zwc diff --git a/install.d/10-brew.sh b/install.d/10-brew.sh index b1e437b..ba4594f 100755 --- a/install.d/10-brew.sh +++ b/install.d/10-brew.sh @@ -15,5 +15,5 @@ if ! command -v brew &> /dev/null; then else log_skip "Homebrew already installed" fi -brew --version | log_quote log_pass "Homebrew installed" +echo "Homebrew $(cat "$(brew --repository 2>/dev/null)"/.git/describe-cache/* 2>/dev/null || brew --version | head -1)" | log_quote diff --git a/install.d/11-apt.sh b/install.d/11-apt.sh index 6a271f5..c9fa53c 100755 --- a/install.d/11-apt.sh +++ b/install.d/11-apt.sh @@ -29,6 +29,6 @@ sudo apt-get install -qq "${apt_packages[@]}" unset apt_packages -apt --version | log_quote log_pass "apt packages installed" +apt --version | log_quote diff --git a/install.d/12-pacman.sh b/install.d/12-pacman.sh index 6c97fe3..c4e7920 100755 --- a/install.d/12-pacman.sh +++ b/install.d/12-pacman.sh @@ -30,6 +30,6 @@ if ! command -v yay &>/dev/null; then rm -rf /tmp/yay fi +log_pass "pacman packages installed" pacman --version | log_quote yay --version | log_quote -log_pass "pacman packages installed" diff --git a/install.d/20-ssh.sh b/install.d/20-ssh.sh index db1ace5..6a2c835 100755 --- a/install.d/20-ssh.sh +++ b/install.d/20-ssh.sh @@ -23,7 +23,7 @@ if [ ! -f "$ssh_key" ]; then -C "$(whoami)@$(hostname)-$(date -I)" fi +log_pass "SSH key configured" cat "$ssh_pub" | log_quote unset ssh_method ssh_target ssh_key ssh_pub -log_pass "SSH key configured" diff --git a/install.d/21-git.sh b/install.d/21-git.sh index 23d13f8..abb88de 100755 --- a/install.d/21-git.sh +++ b/install.d/21-git.sh @@ -26,5 +26,5 @@ if ! command -v git &> /dev/null; then esac fi -git --version | log_quote log_pass "git configured" +git --version | log_quote diff --git a/install.d/24-tmux.sh b/install.d/24-tmux.sh index fc19ef2..bfb9cb5 100755 --- a/install.d/24-tmux.sh +++ b/install.d/24-tmux.sh @@ -23,11 +23,13 @@ if ! command -v tmux &> /dev/null; then esac fi -tmux -V | log_quote - -# Compile screensaver +# Compile screensaver (skip if binary is newer than source) if command -v cc &> /dev/null && [ -f "$HOME/.tmux/donut.c" ]; then - cc -O2 -o "$HOME/.tmux/donut" "$HOME/.tmux/donut.c" -lm - log_pass "Compiled donut screensaver" + if [ ! -f "$HOME/.tmux/donut" ] || [ "$HOME/.tmux/donut.c" -nt "$HOME/.tmux/donut" ]; then + cc -O2 -o "$HOME/.tmux/donut" "$HOME/.tmux/donut.c" -lm + fi fi +log_pass "tmux configured" +tmux -V | log_quote + diff --git a/install.d/25-vim.sh b/install.d/25-vim.sh index 93ef7b7..611d5c7 100755 --- a/install.d/25-vim.sh +++ b/install.d/25-vim.sh @@ -18,11 +18,12 @@ for url in "${vim_plugins[@]}"; do name=$(basename "$url" .git) dest="$vim_pack_dir/$name" if [[ -d "$dest" ]]; then - git -C "$dest" pull --quiet - log_pass "$name updated" + git -C "$dest" pull --quiet & else - git clone --depth 1 --quiet "$url" "$dest" - log_pass "$name installed" + git clone --depth 1 --quiet "$url" "$dest" & fi done +wait + log_pass "vim plugins configured" +vim --version 2>/dev/null | sed -n '1p' | log_quote diff --git a/install.d/27-preview.sh b/install.d/26-preview.sh similarity index 99% rename from install.d/27-preview.sh rename to install.d/26-preview.sh index 8123328..2b18d2d 100755 --- a/install.d/27-preview.sh +++ b/install.d/26-preview.sh @@ -22,7 +22,6 @@ if ! command -v chafa &> /dev/null; then ;; esac fi -command -v chafa &> /dev/null && chafa --version | sed -n '1p' | log_quote # pdftotext — PDF text extraction (part of poppler) if ! command -v pdftotext &> /dev/null; then @@ -41,6 +40,6 @@ if ! command -v pdftotext &> /dev/null; then ;; esac fi -command -v pdftotext &> /dev/null && pdftotext -v 2>&1 | sed -n '1p' | log_quote - log_pass "preview dependencies" +command -v chafa &> /dev/null && chafa --version | sed -n '1p' | log_quote +command -v pdftotext &> /dev/null && pdftotext -v 2>&1 | sed -n '1p' | log_quote diff --git a/install.d/30-mise.sh b/install.d/30-mise.sh index d780cf2..3b19319 100755 --- a/install.d/30-mise.sh +++ b/install.d/30-mise.sh @@ -49,9 +49,7 @@ if [[ "$DOTS_ENV" != "codespaces" ]]; then log_info "Installing runtimes..." MISE_QUIET=1 mise install "${MISE_RUNTIMES[@]}" 2>&1 | log_quote - for tool in "${MISE_RUNTIMES[@]}"; do - MISE_QUIET=1 mise use -g "$tool" 2>&1 | log_quote - done + MISE_QUIET=1 mise use -g "${MISE_RUNTIMES[@]}" 2>&1 | log_quote fi # Activate mise shims so runtimes (e.g. python3) are available for app installers @@ -78,9 +76,7 @@ if [[ "$DOTS_ENV" != "codespaces" ]]; then fi log_info "Installing apps..." -for tool in "${MISE_APPS[@]}"; do - MISE_QUIET=1 mise use -g "$tool" 2>&1 | tail -1 | log_quote -done +MISE_QUIET=1 mise use -g "${MISE_APPS[@]}" 2>&1 | log_quote # Rebuild bat theme cache with mise-installed bat (must match delta's syntect version) bat cache --build &>/dev/null @@ -94,24 +90,5 @@ if [[ "$DOTS_ENV" != "codespaces" ]]; then fi fi -# Verify installations -log_info "Verifying installations..." -{ - if [[ "$DOTS_ENV" != "codespaces" ]]; then - mise exec -- python --version - mise exec -- poetry --version - echo "node $(mise exec -- node --version)" - echo "npm $(mise exec -- npm --version)" - mise exec -- gh --version - mise exec -- terraform --version | sed -n '1p' - echo "firebase: $(mise exec -- firebase --version)" - echo "fastfetch: $(mise exec -- fastfetch --version 2>&1 | sed -n '1p')" - mise exec -- glow --version | sed -n '1p' - fi - echo "fzf $(fzf --version)" - bat --version | sed -n '1p' - zoxide --version - rg --version | sed -n '1p' - delta --version 2>/dev/null | sed -n '1p' || echo "delta: installed (version check failed)" -} | log_quote log_pass "mise tools installed" +mise ls --current 2>/dev/null | awk '{printf "%s %s\n", $1, $2}' | log_quote diff --git a/install.d/41-docker.sh b/install.d/41-docker.sh index 91bff5c..6e47380 100755 --- a/install.d/41-docker.sh +++ b/install.d/41-docker.sh @@ -56,5 +56,5 @@ if ! groups "$USER" | grep -q "\b$docker_group\b"; then sudo usermod -aG docker "$USER" fi -docker --version | log_quote log_pass "Docker configured" +docker --version | log_quote diff --git a/install.d/42-azure.sh b/install.d/42-azure.sh index 1391d39..c6109be 100755 --- a/install.d/42-azure.sh +++ b/install.d/42-azure.sh @@ -26,5 +26,5 @@ if ! command -v az &>/dev/null; then esac fi -az --version | log_quote log_pass "Azure CLI installed" +echo "$BREW_FORMULA_VERSIONS" | grep "^azure-cli " | log_quote diff --git a/install.d/50-redis.sh b/install.d/50-redis.sh index 50026fb..bd6bde4 100755 --- a/install.d/50-redis.sh +++ b/install.d/50-redis.sh @@ -31,5 +31,5 @@ if ! command -v redis-cli &>/dev/null; then esac fi -redis-cli --version | log_quote log_pass "Redis installed" +redis-cli --version | log_quote diff --git a/install.d/70-cca.sh b/install.d/70-cca.sh index 64f6843..fdfc7be 100755 --- a/install.d/70-cca.sh +++ b/install.d/70-cca.sh @@ -10,7 +10,6 @@ if ! echo "$BREW_CASKS" | grep -q "^colour-contrast-analyser$"; then brew install --cask colour-contrast-analyser -else - log_skip "CCA already installed" fi log_pass "CCA installed" +echo "$BREW_CASK_VERSIONS" | grep "^colour-contrast-analyser " | log_quote diff --git a/install.d/71-rectangle.sh b/install.d/71-rectangle.sh index 3596f8b..171dc8f 100755 --- a/install.d/71-rectangle.sh +++ b/install.d/71-rectangle.sh @@ -10,7 +10,6 @@ if ! echo "$BREW_CASKS" | grep -q "^rectangle$"; then brew install --cask rectangle -else - log_skip "Rectangle already installed" fi log_pass "Rectangle installed" +echo "$BREW_CASK_VERSIONS" | grep "^rectangle " | log_quote diff --git a/install.d/73-betterdisplay.sh b/install.d/72-betterdisplay.sh similarity index 85% rename from install.d/73-betterdisplay.sh rename to install.d/72-betterdisplay.sh index 45cd6c4..5f05c32 100755 --- a/install.d/73-betterdisplay.sh +++ b/install.d/72-betterdisplay.sh @@ -10,7 +10,6 @@ if ! echo "$BREW_CASKS" | grep -q "^betterdisplay$"; then brew install --cask betterdisplay -else - log_skip "BetterDisplay already installed" fi log_pass "BetterDisplay installed" +echo "$BREW_CASK_VERSIONS" | grep "^betterdisplay " | log_quote diff --git a/install.d/72-meetingbar.sh b/install.d/72-meetingbar.sh deleted file mode 100755 index 21063d6..0000000 --- a/install.d/72-meetingbar.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -# ----------------------------------------------------------------------------- -# Description: -# (macOS only) Install MeetingBar. -# - -# macOS only -[[ "$DOTS_OS" != "macos" ]] && { log_skip "Not macOS"; return 0; } - -if ! echo "$BREW_CASKS" | grep -q "^meetingbar$"; then - brew install --cask meetingbar -else - log_skip "MeetingBar already installed" -fi -log_pass "MeetingBar installed" diff --git a/install.d/74-dockutil.sh b/install.d/73-dockutil.sh similarity index 84% rename from install.d/74-dockutil.sh rename to install.d/73-dockutil.sh index 84b894e..e2765d2 100755 --- a/install.d/74-dockutil.sh +++ b/install.d/73-dockutil.sh @@ -10,7 +10,6 @@ if ! echo "$BREW_FORMULAE" | grep -q "^dockutil$"; then brew install dockutil -else - log_skip "dockutil already installed" fi log_pass "dockutil installed" +echo "$BREW_FORMULA_VERSIONS" | grep "^dockutil " | log_quote diff --git a/install.d/76-vscode.sh b/install.d/74-vscode.sh similarity index 84% rename from install.d/76-vscode.sh rename to install.d/74-vscode.sh index 804956b..06647c6 100755 --- a/install.d/76-vscode.sh +++ b/install.d/74-vscode.sh @@ -10,7 +10,6 @@ if ! echo "$BREW_CASKS" | grep -q "^visual-studio-code$"; then brew install --cask visual-studio-code -else - log_skip "VSCode already installed" fi log_pass "VSCode installed" +echo "$BREW_CASK_VERSIONS" | grep "^visual-studio-code " | log_quote diff --git a/install.d/81-cmatrix.sh b/install.d/75-cmatrix.sh similarity index 100% rename from install.d/81-cmatrix.sh rename to install.d/75-cmatrix.sh index 61678e3..3bfc268 100755 --- a/install.d/81-cmatrix.sh +++ b/install.d/75-cmatrix.sh @@ -24,5 +24,5 @@ if ! command -v cmatrix &> /dev/null; then ;; esac fi -command -v cmatrix &> /dev/null && cmatrix -V 2>&1 | sed -n '1p' | log_quote log_pass "cmatrix installed" +command -v cmatrix &> /dev/null && cmatrix -V 2>&1 | sed -n '1p' | log_quote diff --git a/install.d/75-wispr-flow.sh b/install.d/75-wispr-flow.sh deleted file mode 100644 index 302a260..0000000 --- a/install.d/75-wispr-flow.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -# ----------------------------------------------------------------------------- -# Description: -# (macOS only) Install Wispr Flow. -# - -# macOS only -[[ "$DOTS_OS" != "macos" ]] && { log_skip "Not macOS"; return 0; } - -if ! echo "$BREW_CASKS" | grep -q "^wispr-flow$"; then - brew install --cask wispr-flow -else - log_skip "Wispr Flow already installed" -fi -log_pass "Wispr Flow installed" diff --git a/install.d/90-macos.sh b/install.d/90-macos.sh index a679aaf..3a1a843 100755 --- a/install.d/90-macos.sh +++ b/install.d/90-macos.sh @@ -8,129 +8,63 @@ # macOS only [[ "$DOTS_OS" != "macos" ]] && { log_skip "Not macOS"; return 0; } +# Only write if value differs from desired +_defaults_set() { + local domain="$1" key="$2" type="$3" value="$4" + local current + current=$(defaults read "$domain" "$key" 2>/dev/null) || current="" + [[ "$current" == "$value" ]] && return 0 + defaults write "$domain" "$key" "$type" "$value" +} + # Keyboard -# -------- -# off -- Keyboard: Capitalize words automatically -defaults write -globalDomain NSAutomaticCapitalizationEnabled -bool false - -# off -- Keyboard: Add period with double-space -defaults write -globalDomain NSAutomaticPeriodSubstitutionEnabled -bool false - -# off -- Keyboard: Quote substitution -defaults write -globalDomain NSAutomaticQuoteSubstitutionEnabled -bool false - -# off -- Keyboard: Dash substitution -defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false - -# off -- Keyboard: Auto-correct -defaults write NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false -defaults write NSGlobalDomain WebAutomaticSpellingCorrectionEnabled -bool false +_defaults_set -globalDomain NSAutomaticCapitalizationEnabled -bool false +_defaults_set -globalDomain NSAutomaticPeriodSubstitutionEnabled -bool false +_defaults_set -globalDomain NSAutomaticQuoteSubstitutionEnabled -bool false +_defaults_set NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false +_defaults_set NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false +_defaults_set NSGlobalDomain WebAutomaticSpellingCorrectionEnabled -bool false # Appearance -# ---------- -# Graphite -- Appearance (prevent top-left window colours) -defaults write -globalDomain AppleAquaColorVariant -int 6 - -# on -- Appearance: Dark mode -defaults write -globalDomain AppleInterfaceStyle -string "Dark" - -# #2CB494 -- Highlight color -defaults write -globalDomain AppleHighlightColor -string "0.172549 0.705882 0.580392" +_defaults_set -globalDomain AppleAquaColorVariant -int 6 +_defaults_set -globalDomain AppleInterfaceStyle -string Dark +_defaults_set -globalDomain AppleHighlightColor -string "0.172549 0.705882 0.580392" # Control Center -# -------------- -# off -- Control Center: Show Bluetooth icon in menu bar -defaults write \ - ~/Library/Preferences/ByHost/com.apple.controlcenter.plist \ - Bluetooth \ - -int 24 - -# off -- Control Center: Show Wi-Fi icon in menu bar -defaults write \ - ~/Library/Preferences/ByHost/com.apple.controlcenter.plist \ - WiFi \ - -int 24 - -# off -- Control Center: Show Now Playing icon in menu bar -defaults write \ - ~/Library/Preferences/ByHost/com.apple.controlcenter.plist \ - NowPlaying \ - -int 24 - -# off -- Control Center: Show Battery icon in menu bar -defaults write \ - ~/Library/Preferences/ByHost/com.apple.controlcenter.plist \ - Battery \ - -int 24 +_defaults_set ~/Library/Preferences/ByHost/com.apple.controlcenter.plist Bluetooth -int 24 +_defaults_set ~/Library/Preferences/ByHost/com.apple.controlcenter.plist WiFi -int 24 +_defaults_set ~/Library/Preferences/ByHost/com.apple.controlcenter.plist NowPlaying -int 24 +_defaults_set ~/Library/Preferences/ByHost/com.apple.controlcenter.plist Battery -int 24 # Finder -# ------ -# on -- Finder: Add quit option -defaults write com.apple.finder QuitMenuItem -bool true - -# on -- Finder: Show hidden files -defaults write com.apple.finder AppleShowAllFiles -bool true - -# on -- Finder: Show all filename extensions -defaults write NSGlobalDomain AppleShowAllExtensions -bool true - -# off -- Finder: Show warning before changing an extension -defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false - -# on -- Finder: Show path bar -defaults write com.apple.finder ShowPathbar -bool true - -# on -- Finder: Show status bar -defaults write com.apple.finder ShowStatusBar -bool true - -# on -- Finder: Keep folders on top -defaults write com.apple.finder _FXSortFoldersFirst -bool true - -# off -- Finder: Use macOS Crash Reporter -defaults write com.apple.CrashReporter DialogType -string "none" - -# off -- Finder: Enable dashboard widgets -defaults write com.apple.dashboard mcx-disabled -bool true - -# on -- Finder: Show hard drives on desktop -defaults write com.apple.finder ShowHardDrivesOnDesktop -bool true - -# on -- Finder: Show external hard drives on desktop -defaults write com.apple.finder ShowExternalHardDrivesOnDesktop -bool true - -# on -- Finder: Show removable media on desktop -defaults write com.apple.finder ShowRemovableMediaOnDesktop -bool true - -# on -- Finder: Show mounted servers on desktop -defaults write com.apple.finder ShowMountedServersOnDesktop -bool true - -# off -- Finder: Show recent tags -defaults write com.apple.finder ShowRecentTags -bool false - -# off -- Finder: Create .DS_Store files -defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true -defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true - -# home -- Finder: New Finder windows show -defaults write com.apple.finder NewWindowTargetPath -string "file://${HOME}/" - -# list -- Finder: Preferred view style -defaults write com.apple.finder FXPreferredViewStyle -string "nlsv" +_defaults_set com.apple.finder QuitMenuItem -bool true +_defaults_set com.apple.finder AppleShowAllFiles -bool true +_defaults_set NSGlobalDomain AppleShowAllExtensions -bool true +_defaults_set com.apple.finder FXEnableExtensionChangeWarning -bool false +_defaults_set com.apple.finder ShowPathbar -bool true +_defaults_set com.apple.finder ShowStatusBar -bool true +_defaults_set com.apple.finder _FXSortFoldersFirst -bool true +_defaults_set com.apple.CrashReporter DialogType -string none +_defaults_set com.apple.dashboard mcx-disabled -bool true +_defaults_set com.apple.finder ShowHardDrivesOnDesktop -bool true +_defaults_set com.apple.finder ShowExternalHardDrivesOnDesktop -bool true +_defaults_set com.apple.finder ShowRemovableMediaOnDesktop -bool true +_defaults_set com.apple.finder ShowMountedServersOnDesktop -bool true +_defaults_set com.apple.finder ShowRecentTags -bool false +_defaults_set com.apple.desktopservices DSDontWriteUSBStores -bool true +_defaults_set com.apple.desktopservices DSDontWriteNetworkStores -bool true +_defaults_set com.apple.finder NewWindowTargetPath -string "file://${HOME}/" +_defaults_set com.apple.finder FXPreferredViewStyle -string nlsv # Spotlight -# --------- -# on -- Spotlight: Hide menu bar icon -defaults write com.apple.Spotlight MenuItemHidden -int 1 +_defaults_set com.apple.Spotlight MenuItemHidden -int 1 # Dock -# ---- -# off -- Dock: Show recent applications -defaults write com.apple.dock show-recents -bool false - -# on -- Dock: Use scroll gestures -defaults write com.apple.dock scroll-to-open -bool true +_defaults_set com.apple.dock show-recents -bool false +_defaults_set com.apple.dock scroll-to-open -bool true # Remove default apps from the dock +dock_state=$(defaults read com.apple.dock persistent-apps 2>/dev/null || echo "") default_apps=( "Messages" "Mail" @@ -149,7 +83,7 @@ default_apps=( "Pages" ) for default_app in "${default_apps[@]}"; do - dockutil --remove "$default_app" --no-restart 1>/dev/null 2>&1 || true + [[ $dock_state == *"$default_app"* ]] && dockutil --remove "$default_app" --no-restart 1>/dev/null 2>&1 || true done # Set up apps in the dock @@ -161,7 +95,6 @@ dock_order=( "/System/Applications/Utilities/Activity Monitor.app" "/Applications/iTerm.app" ) -dock_state=$(defaults read com.apple.dock persistent-apps 2>/dev/null || echo "") for i in "${!dock_order[@]}"; do if [[ $i -ne 0 ]]; then path="${dock_order[$i]}" diff --git a/script/install b/script/install index 4e36a7d..fe0d676 100755 --- a/script/install +++ b/script/install @@ -88,8 +88,6 @@ if [[ "$DOTS_PKG" == "brew" ]]; then export HOMEBREW_NO_ENV_HINTS=1 export HOMEBREW_NO_AUTO_UPDATE=1 export HOMEBREW_NO_INSTALL_CLEANUP=1 - export BREW_CASKS=$(brew list --cask 2>/dev/null || true) - export BREW_FORMULAE=$(brew list 2>/dev/null || true) fi # Set up directory variables @@ -137,6 +135,15 @@ run() { 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 @@ -167,7 +174,8 @@ run() { printf "completed in ${time_color}${execution_ms_formatted}ms${NC}\n" done } -echo -e "\n${GREY}Logging to \"$log_abs_target\"${NC}" +log_info "Logging to \"$log_abs_target\"" + total_start_ns=$(now_ns) run 2>&1 | tee "$log_abs_target" total_end_ns=$(now_ns)