fix(installer): parse pkglist name field, skip unresolvable pkgs, keymap confirm
pacstrap failed at line 382 because pkglist lines from pacman -Q are 'name version' and were passed whole as pacman targets (~400 'target not found'). Parse only the first field, pre-filter against pacman -Slq so packages missing from the live repos (local-aur) are skipped with a warning, and fall back to an unfiltered list if pacman -Syy fails. Keymap screen now offers a US-layout confirm before the gum filter.
This commit is contained in:
@@ -40,6 +40,7 @@ trap 'gum style --foreground 9 --bold "Failed at line $LINENO. See $LOG"' ERR
|
|||||||
die() { gum style --foreground 9 --bold "ERROR: $*"; exit 1; }
|
die() { gum style --foreground 9 --bold "ERROR: $*"; exit 1; }
|
||||||
info() { gum style --foreground 12 --bold "$*"; }
|
info() { gum style --foreground 12 --bold "$*"; }
|
||||||
ok() { gum style --foreground 10 --bold "$*"; }
|
ok() { gum style --foreground 10 --bold "$*"; }
|
||||||
|
warn() { gum style --foreground 11 --bold "$*"; }
|
||||||
|
|
||||||
header() {
|
header() {
|
||||||
gum style \
|
gum style \
|
||||||
@@ -85,10 +86,18 @@ screen_keymap() {
|
|||||||
header "Keyboard Layout"
|
header "Keyboard Layout"
|
||||||
echo ""
|
echo ""
|
||||||
gum style --foreground 15 \
|
gum style --foreground 15 \
|
||||||
"Select your console keymap." \
|
"Select the keyboard layout of your physical keyboard." \
|
||||||
"This affects passwords and the LUKS passphrase at boot."
|
"This affects passwords and the LUKS passphrase at boot." \
|
||||||
|
"" \
|
||||||
|
"The default is the US layout (us)."
|
||||||
echo ""
|
echo ""
|
||||||
KEYMAP=$(localectl list-keymaps | gum filter --header "+ Keymap" --placeholder "Search keymaps...")
|
if gum confirm --affirmative "Use us (default)" --negative "Choose another layout" \
|
||||||
|
"Use US keyboard layout (us)?"; then
|
||||||
|
KEYMAP="us"
|
||||||
|
else
|
||||||
|
KEYMAP=$(localectl list-keymaps | gum filter --header "+ Keymap" --placeholder "Search keymaps...") \
|
||||||
|
|| die "No keymap selected."
|
||||||
|
fi
|
||||||
[[ -z "$KEYMAP" ]] && die "No keymap selected."
|
[[ -z "$KEYMAP" ]] && die "No keymap selected."
|
||||||
loadkeys "$KEYMAP" 2>/dev/null || true
|
loadkeys "$KEYMAP" 2>/dev/null || true
|
||||||
log "Keymap: $KEYMAP"
|
log "Keymap: $KEYMAP"
|
||||||
@@ -357,15 +366,48 @@ install_pacstrap() {
|
|||||||
|
|
||||||
local pkglist="/run/archiso/bootmnt/arch/pkglist.x86_64.txt"
|
local pkglist="/run/archiso/bootmnt/arch/pkglist.x86_64.txt"
|
||||||
local pkgs=()
|
local pkgs=()
|
||||||
|
local dropped=()
|
||||||
|
local filter_ok=false
|
||||||
|
|
||||||
if [[ -f "$pkglist" ]]; then
|
if [[ -f "$pkglist" ]]; then
|
||||||
while IFS= read -r pkg; do
|
# The medium's pkglist comes from `pacman -Q`: lines are "name version".
|
||||||
[[ -z "$pkg" ]] && continue
|
# Parse only the first field, then drop names not resolvable in the live
|
||||||
|
# session's repos (e.g. local-aur packages are not configured there).
|
||||||
|
info "Syncing package databases for resolvability check..."
|
||||||
|
if pacman -Syy --noconfirm >>"$LOG" 2>&1; then
|
||||||
|
declare -A available=()
|
||||||
|
local db_line
|
||||||
|
while IFS= read -r db_line; do
|
||||||
|
[[ -n "$db_line" ]] && available["$db_line"]=1
|
||||||
|
done < <(pacman -Slq 2>>"$LOG" || true)
|
||||||
|
(( ${#available[@]} > 0 )) && filter_ok=true
|
||||||
|
else
|
||||||
|
warn "pacman -Syy failed (see $LOG) — installing without resolvability filter."
|
||||||
|
fi
|
||||||
|
|
||||||
|
local line pkg
|
||||||
|
while IFS= read -r line; do
|
||||||
|
[[ -z "$line" ]] && continue
|
||||||
|
pkg=${line%% *}
|
||||||
skip "$pkg" && continue
|
skip "$pkg" && continue
|
||||||
|
if $filter_ok && [[ -z "${available[$pkg]:-}" ]]; then
|
||||||
|
dropped+=("$pkg")
|
||||||
|
continue
|
||||||
|
fi
|
||||||
pkgs+=("$pkg")
|
pkgs+=("$pkg")
|
||||||
done < "$pkglist"
|
done < "$pkglist"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if (( ${#dropped[@]} > 0 )); then
|
||||||
|
warn "Skipped ${#dropped[@]} pkglist package(s) not found in configured repos:"
|
||||||
|
gum style --foreground 11 "${dropped[@]/#/ - }"
|
||||||
|
local d
|
||||||
|
for d in "${dropped[@]}"; do
|
||||||
|
log "Pacstrap: skipped unresolvable: $d"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Hardcoded essentials are never filtered — they must be in allowed repos.
|
||||||
for p in base linux linux-firmware linux-cachyos linux-cachyos-headers \
|
for p in base linux linux-firmware linux-cachyos linux-cachyos-headers \
|
||||||
networkmanager grub efibootmgr sudo git intel-ucode amd-ucode \
|
networkmanager grub efibootmgr sudo git intel-ucode amd-ucode \
|
||||||
mkinitcpio cryptsetup dosfstools e2fsprogs btrfs-progs \
|
mkinitcpio cryptsetup dosfstools e2fsprogs btrfs-progs \
|
||||||
@@ -378,7 +420,7 @@ install_pacstrap() {
|
|||||||
done
|
done
|
||||||
|
|
||||||
info "Installing ${#pkgs[@]} packages (this may take a while)..."
|
info "Installing ${#pkgs[@]} packages (this may take a while)..."
|
||||||
log "Pacstrap: ${#pkgs[@]} packages"
|
log "Pacstrap: ${#pkgs[@]} packages, ${#dropped[@]} skipped"
|
||||||
pacstrap "$TARGET" "${pkgs[@]}" --noconfirm 2>>"$LOG"
|
pacstrap "$TARGET" "${pkgs[@]}" --noconfirm 2>>"$LOG"
|
||||||
|
|
||||||
ok "Packages installed."
|
ok "Packages installed."
|
||||||
|
|||||||
Reference in New Issue
Block a user