#!/bin/bash # setup/lib/common.sh # # Shared helpers for the setup/install scripts under setup/. # Source this file; do not execute it directly: # # SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # # shellcheck source=../lib/common.sh # source "$SETUP_DIR/../lib/common.sh" # # Conventions: # - The caller owns `set -euo pipefail` and PACKAGES_FILE. # - Package lists use @pacman (default) / @aur / @npm section markers; # '#' starts a comment, blank lines are ignored. # - Set NPM_USE_SUDO=1 before calling install_npm_pkgs when the global # npm root is root-owned (Arch installs npm to /usr/lib/node_modules). # Print the repository root (setup/lib/ -> repo root). repo_root() { cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd } log() { echo "==> $*" } # --------------------------------------------------------------------------- # Read a packages.txt file, split into pacman / aur / npm sections. # Usage: read_packages # --------------------------------------------------------------------------- read_packages() { local file="$1" pacman_ref="$2" aur_ref="$3" npm_ref="$4" local section="pacman" local line current local -n _pacman="$pacman_ref" _aur="$aur_ref" _npm="$npm_ref" while IFS= read -r line || [[ -n "$line" ]]; do current="${line%%#*}" current="${current##*( )}" current="${current%%*( )}" [[ -z "$current" ]] && continue case "$current" in @pacman) section="pacman" ;; @aur) section="aur" ;; @npm) section="npm" ;; *) case "$section" in pacman) _pacman+=("$current") ;; aur) _aur+=("$current") ;; npm) _npm+=("$current") ;; esac ;; esac done < "$file" } # --------------------------------------------------------------------------- # Install sections (arrays passed by nameref). # --------------------------------------------------------------------------- install_pacman_pkgs() { local -n _pkgs="$1" if ((${#_pkgs[@]})); then log "Installiere Pacman-Pakete: ${_pkgs[*]}" yay -S --needed "${_pkgs[@]}" fi } install_aur_pkgs() { local -n _pkgs="$1" if ((${#_pkgs[@]})); then log "Installiere AUR-Pakete: ${_pkgs[*]}" # --aur selects yay's AUR mode. For names that a repository package # can also provide, use an explicit aur/ target in the list. yay -S --aur --needed "${_pkgs[@]}" fi } install_npm_pkgs() { local -n _pkgs="$1" if ((${#_pkgs[@]})); then log "Installiere globale npm-Pakete: ${_pkgs[*]}" if [[ "${NPM_USE_SUDO:-0}" == "1" ]]; then sudo npm install -g "${_pkgs[@]}" else npm install -g "${_pkgs[@]}" fi fi } # Install all three sections at once. install_all_pkgs() { install_pacman_pkgs "$1" install_aur_pkgs "$2" install_npm_pkgs "$3" } # --------------------------------------------------------------------------- # Enable multilib in /etc/pacman.conf (with a safety backup). # --------------------------------------------------------------------------- enable_multilib() { sudo sed -i.bak '/^#\[multilib\]/,+1 s/^#//' /etc/pacman.conf } # --------------------------------------------------------------------------- # Ensure yay (AUR helper) is installed. # --------------------------------------------------------------------------- ensure_yay() { if pacman -Q yay &>/dev/null; then echo "yay bereits installiert; fahre fort." return fi if pacman -Si yay &>/dev/null; then echo "Installiere yay mit pacman ..." sudo pacman -S --needed yay return fi echo "installiere yay via git ..." sudo pacman -S --needed base-devel git local tmp tmp="$(mktemp -d)" git clone https://aur.archlinux.org/yay.git "$tmp/yay" ( cd "$tmp/yay" makepkg -si ) rm -rf "$tmp" }