#!/bin/bash # packages/install.sh - Module to install package lists set -euo pipefail if [ $# -ne 1 ]; then echo "Usage: $0 " exit 1 fi dotfiles_dir="$1" # Source shared utilities source "$dotfiles_dir/scripts/utils.sh" # Detect package manager detect_package_manager() { if command_exists apt; then echo "apt" elif command_exists yum; then echo "yum" elif command_exists dnf; then echo "dnf" elif command_exists pacman; then echo "pacman" elif command_exists brew; then echo "brew" else echo "unknown" fi } # Install packages with detected package manager install_packages() { local package_manager="$1" shift local packages=("$@") if [ ${#packages[@]} -eq 0 ]; then log_info "No packages to install" return 0 fi case "$package_manager" in apt) log_info "Installing packages with apt..." sudo apt update && sudo apt install -y "${packages[@]}" ;; yum) log_info "Installing packages with yum..." sudo yum install -y "${packages[@]}" ;; dnf) log_info "Installing packages with dnf..." sudo dnf install -y "${packages[@]}" ;; pacman) log_info "Installing packages with pacman..." sudo pacman -S --noconfirm "${packages[@]}" ;; brew) log_info "Installing packages with brew..." brew install "${packages[@]}" ;; *) log_error "Unknown package manager. Please install packages manually." return 1 ;; esac } # Read packages from file read_package_file() { local file="$1" if [ -f "$file" ]; then grep -v '^#' "$file" | grep -v '^[[:space:]]*$' | tr '\n' ' ' fi } # Loop through package lists and install install_package_lists() { local dotfiles_dir="$1" local packages_dir="$dotfiles_dir/packages" if [ ! -d "$packages_dir" ]; then log_warning "No packages directory found at $packages_dir" return 0 fi local package_manager package_manager=$(detect_package_manager) if [ "$package_manager" = "unknown" ]; then log_error "No supported package manager found" return 1 fi log_info "Detected package manager: $package_manager" # Define package group order local package_files=("base.txt" "cli-tools.txt" "dev.txt" "gui.txt") # Determine which groups to install local selected_groups=() if is_interactive; then echo "Available package groups:" for pkg in "${package_files[@]}"; do if [ -f "$packages_dir/$pkg" ]; then echo " - $pkg" fi done read -rp "Enter groups to install (comma-separated or 'all'): " choice if [[ "$choice" =~ ^([Aa]ll)$ ]]; then selected_groups=("${package_files[@]}") else IFS=',' read -ra parts <<< "$choice" for part in "${parts[@]}"; do grp="${part// /}" if [[ " ${package_files[*]} " == *"$grp"* ]]; then selected_groups+=("$grp") else log_warning "Unknown package group: $grp" fi done fi else # Non-interactive: install only the base group selected_groups=("base.txt") fi # Loop through selected package lists for package_file in "${selected_groups[@]}"; do file_path="$packages_dir/$package_file" if [ ! -f "$file_path" ]; then log_info "Package file $package_file not found, skipping" continue fi log_info "Installing packages from $package_file..." local packages packages=$(read_package_file "$file_path") if [ -n "$packages" ]; then read -ra package_array <<< "$packages" install_packages "$package_manager" "${package_array[@]}" log_success "Completed installation from $package_file" else log_info "No packages found in $package_file" fi done } # Execute when run directly install_package_lists "$dotfiles_dir"