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:
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user