diff --git a/install-packages.sh b/install-packages.sh index 334922b..304d7ba 100644 --- a/install-packages.sh +++ b/install-packages.sh @@ -19,17 +19,18 @@ if [[ ${#packages[@]} -eq 0 ]]; then exit 1 fi -echo "Installing ${#packages[@]} packages..." -skipped=() -for pkg in "${packages[@]}"; do - if pacman -Si "$pkg" &>/dev/null || pacman -Sg "$pkg" &>/dev/null; then - sudo pacman -S --needed --noconfirm "$pkg" - else - echo "Skipping '$pkg': not found in repositories" - skipped+=("$pkg") - fi -done +echo "Resolving ${#packages[@]} packages..." + +# Dry-run to find unknown packages (no sudo needed for --print) +mapfile -t skipped < <(pacman -S --needed --print "${packages[@]}" 2>&1 >/dev/null \ + | grep "target not found" | awk -F': ' '{print $2}') if [[ ${#skipped[@]} -gt 0 ]]; then - echo "Skipped ${#skipped[@]} package(s): ${skipped[*]}" + echo "Skipping ${#skipped[@]} package(s) not found: ${skipped[*]}" + mapfile -t packages < <(comm -23 \ + <(printf '%s\n' "${packages[@]}" | sort) \ + <(printf '%s\n' "${skipped[@]}" | sort)) fi + +echo "Installing ${#packages[@]} packages..." +sudo pacman -S --needed "${packages[@]}"