#!/usr/bin/env bash set -euo pipefail # Default paths can be overridden via environment variables : "${DOTFILES:=$HOME/.dotfiles}" : "${BREWFILE:=$DOTFILES/config/homebrew/Brewfile}" : "${TEMP_DIR:=$(mktemp -d)}" : "${DFM_MAX_RETRIES:=3}" # Remove temp folder on exit trap 'rm -rf "$TEMP_DIR"' EXIT # Installation functions for dfm, the dotfile manager # # @author Ismo Vuorinen # @license MIT # Installs all required packages in the correct order. # # Description: # Orchestrates the installation process for the dotfile manager by sequentially invoking # the installation routines for fonts, Homebrew, and Rust (cargo). It logs the start of the # overall installation process before calling each respective function. # # Globals: # lib::log - Function used to log installation progress messages. # # Arguments: # None. # # Outputs: # Logs an informational message indicating the start of the installation process. # # Returns: # None. # # Example: # all # # @description # Parse command line options controlling installation steps. parse_options() { NO_AUTOMATION=0 SKIP_FONTS=0 SKIP_BREW=0 SKIP_CARGO=0 while [[ $# -gt 0 ]]; do case "$1" in --no-automation) NO_AUTOMATION=1 ;; --no-fonts) SKIP_FONTS=1 ;; --no-brew) SKIP_BREW=1 ;; --no-cargo) SKIP_CARGO=1 ;; *) lib::error "Unknown option: $1" return 1 ;; esac shift done } # @description # Install all configured components by calling each individual # installation routine unless skipped via options. install_all() { parse_options "$@" lib::log "Installing all packages..." if [[ $SKIP_FONTS -eq 0 ]]; then install_fonts fi if [[ $SKIP_BREW -eq 0 ]]; then install_brew fi if [[ $SKIP_CARGO -eq 0 ]]; then install_cargo fi } # Installs fonts required by the dotfile manager. # # Globals: # None. # # Arguments: # None. # # Outputs: # Logs a message to STDOUT indicating that the font installation process has started. # # Returns: # None. # # Example: # install_fonts # # @description Install all configured fonts from helper script, prompting the user unless automation is disabled. install_fonts() { : "${SKIP_FONTS:=0}" : "${NO_AUTOMATION:=0}" if [[ $SKIP_FONTS -eq 1 ]]; then lib::log "Skipping fonts installation" return 0 fi if [[ $NO_AUTOMATION -eq 0 ]]; then utils::interactive::confirm "Install fonts?" || return 0 fi lib::log "Installing fonts..." local script="${DOTFILES}/scripts/install-fonts.sh" if [[ ! -x "$script" ]]; then lib::error "Font installation script not found: $script" return 1 fi bash "$script" } # Install Homebrew and set it up. # # Installs the Homebrew package manager on macOS. # # Globals: # lib::log - Logging utility used to report installation progress. # # Outputs: # Logs a message indicating the start of the Homebrew installation process. # # Example: # install_brew # # @description Install Homebrew and declared packages using the Brewfile. install_brew() { : "${SKIP_BREW:=0}" : "${NO_AUTOMATION:=0}" if [[ $SKIP_BREW -eq 1 ]]; then lib::log "Skipping Homebrew installation" return 0 fi if [[ $NO_AUTOMATION -eq 0 ]]; then utils::interactive::confirm "Install Homebrew packages?" || return 0 fi lib::log "Installing Homebrew..." if ! utils::is_installed brew; then lib::log "Homebrew not found, installing..." local installer="$TEMP_DIR/homebrew-install.sh" utils::retry "$DFM_MAX_RETRIES" \ curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh \ -o "$installer" NONINTERACTIVE=1 bash "$installer" fi if utils::is_installed brew; then brew bundle install --file="$BREWFILE" --force --quiet else lib::error "Homebrew installation failed" return 1 fi } # Installs Rust and cargo packages. # # Description: # Logs the start of the installation process for Rust and cargo packages. # The installation logic is intended to be implemented where indicated. # # Globals: # Uses lib::log for logging the installation process. # # Example: # install_cargo # # @description Install Rust tooling and cargo packages using helper scripts. install_cargo() { : "${SKIP_CARGO:=0}" : "${NO_AUTOMATION:=0}" if [[ $SKIP_CARGO -eq 1 ]]; then lib::log "Skipping Rust and cargo installation" return 0 fi if [[ $NO_AUTOMATION -eq 0 ]]; then utils::interactive::confirm "Install Rust and cargo packages?" || return 0 fi lib::log "Installing Rust and cargo packages..." if ! utils::is_installed cargo; then lib::log "Rust not found, installing rustup..." local installer="$TEMP_DIR/rustup-init.sh" utils::retry "$DFM_MAX_RETRIES" \ curl https://sh.rustup.rs -sSf -o "$installer" sh "$installer" -y source "$HOME/.cargo/env" fi local script="${DOTFILES}/scripts/install-cargo-packages.sh" if [[ -x "$script" ]]; then bash "$script" else lib::error "Cargo packages script not found: $script" return 1 fi }