fix: replace --ignore with --assume-installed=init-logind to bypass provider selection

--ignore doesn't reliably prevent pacman from considering elogind-dinit
during fresh provider resolution on all pacman versions. --assume-installed
creates a dummy installed package for init-logind, satisfying the
dependency from base without needing any provider at all. The explicitly
listed elogind-openrc then gets installed normally and provides
init-logind for real.

Dropped --ignore entirely in favor of --assume-installed + --ask=4
(conflict resolution safety net). --assume-installed only added for
non-dinit providers (openrc, runit, s6).
This commit is contained in:
2026-07-05 22:23:01 +02:00
parent 69da290ac5
commit 64b08a95ad
3 changed files with 23 additions and 33 deletions
+9 -10
View File
@@ -97,19 +97,18 @@ make_rootfs() {
args+=(-P) args+=(-P)
fi fi
# Ignore init-logind providers alphabetically before the selected # Pre-tend init-logind is already provided so pacman's resolver
# init to prevent pacman --noconfirm from pulling in the wrong one # skips provider selection entirely. Without this, --noconfirm
# (elogind-dinit < elogind-openrc) and its conflicting deps. # picks elogind-dinit (alphabetically before elogind-openrc),
# --ask 4 auto-answers YES to the "remove <conflicting>?" question # pulling in dinit -> dinit-rc which conflicts with openrc.
# as a safety net if --ignore doesn't prevent the conflict entirely. # --ask 4 auto-answers YES to any residual conflict questions.
local ignore_args=() local pacman_extra_args=()
case "${INITSYS}" in case "${INITSYS}" in
openrc) ignore_args=("--ignore=elogind-dinit" "--ask=4") ;; openrc|runit|s6) pacman_extra_args=("--assume-installed=init-logind") ;;
runit) ignore_args=("--ignore=elogind-dinit" "--ignore=elogind-openrc" "--ask=4") ;;
s6) ignore_args=("--ignore=elogind-dinit" "--ignore=elogind-openrc" "--ignore=elogind-runit" "--ask=4") ;;
esac esac
pacman_extra_args+=("--ask=4")
basestrap "${basestrap_args[@]}" "${args[@]}" "${rootfs}" "${packages[@]}" --overwrite='*' "${ignore_args[@]}" basestrap "${basestrap_args[@]}" "${args[@]}" "${rootfs}" "${packages[@]}" --overwrite='*' "${pacman_extra_args[@]}"
copy_overlay "${root_overlay}" "${rootfs}" copy_overlay "${root_overlay}" "${rootfs}"
@@ -343,22 +343,16 @@ class PMPacman(PackageManager):
# Don't report download progress for each file # Don't report download progress for each file
command.append("--noprogressbar") command.append("--noprogressbar")
# Ignore init-logind providers that come alphabetically before # Pre-tend init-logind is already provided so pacman's resolver
# the selected one, preventing pacman --noconfirm from picking # skips provider selection entirely, preventing it from selecting
# the wrong one and pulling in a conflicting init system. # elogind-dinit (alphabetically before elogind-openrc) which would
if libcalamares.globalstorage.contains("baseInit"): # pull in dinit -> dinit-rc and conflict with OpenRC.
base_init = libcalamares.globalstorage.value("baseInit") if libcalamares.globalstorage.contains("initProvider"):
provider = libcalamares.globalstorage.value("initProvider") provider = libcalamares.globalstorage.value("initProvider")
if base_init and provider: if provider and provider != "dinit":
sorted_inits = ["dinit", "openrc", "runit", "s6"] command.append("--assume-installed=init-logind")
if provider in sorted_inits:
idx = sorted_inits.index(provider)
for p in sorted_inits[:idx]:
ignore_pkg = f"{base_init}-{p}"
command.append(f"--ignore={ignore_pkg}")
# Safety net: auto-answer YES to conflict resolution (e.g. # Safety net: auto-answer YES to conflict resolution
# "remove dinit-rc?") if --ignore doesn't prevent the conflict.
command.append("--ask=4") command.append("--ask=4")
if self.pacman_needed_only: if self.pacman_needed_only:
@@ -221,17 +221,14 @@ class PMPacman(PackageManager):
command.append("--noprogressbar") command.append("--noprogressbar")
command.append("--overwrite=*") command.append("--overwrite=*")
# Same --ignore logic as basestrap module to prevent pacman # Pre-tend init-logind is already provided so pacman's resolver
# --noconfirm from picking the wrong init-logind provider. # skips provider selection entirely, preventing it from selecting
# elogind-dinit (alphabetically before elogind-openrc) which would
# pull in dinit -> dinit-rc and conflict with OpenRC.
if libcalamares.globalstorage.contains("initProvider"): if libcalamares.globalstorage.contains("initProvider"):
provider = libcalamares.globalstorage.value("initProvider") provider = libcalamares.globalstorage.value("initProvider")
base_init = libcalamares.globalstorage.value("baseInit") if provider and provider != "dinit":
if base_init and provider: command.append("--assume-installed=init-logind")
sorted_inits = ["dinit", "openrc", "runit", "s6"]
if provider in sorted_inits:
idx = sorted_inits.index(provider)
for p in sorted_inits[:idx]:
command.append(f"--ignore={base_init}-{p}")
# Safety net: auto-answer YES to conflict resolution # Safety net: auto-answer YES to conflict resolution
command.append("--ask=4") command.append("--ask=4")