From 78f155bb4f72ce118b6cb367b7b4ee1c43e031db Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Thu, 6 Mar 2025 12:18:20 +0100 Subject: [PATCH] Add support for downgrading when installing volatile packages --- mkosi/__init__.py | 2 +- mkosi/installer/__init__.py | 1 + mkosi/installer/apt.py | 10 +++++++++- mkosi/installer/dnf.py | 18 +++++++++++++++--- mkosi/installer/pacman.py | 9 ++++++++- mkosi/installer/zypper.py | 7 ++++++- 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/mkosi/__init__.py b/mkosi/__init__.py index d66369956..f2805e9ef 100644 --- a/mkosi/__init__.py +++ b/mkosi/__init__.py @@ -332,7 +332,7 @@ def install_volatile_packages(context: Context) -> None: with complete_step(f"Installing volatile packages for {context.config.distribution.pretty_name()}"): context.config.distribution.package_manager(context.config).install( - context, context.config.volatile_packages + context, context.config.volatile_packages, allow_downgrade=True ) diff --git a/mkosi/installer/__init__.py b/mkosi/installer/__init__.py index 64e3ce75d..5eeccfe8e 100644 --- a/mkosi/installer/__init__.py +++ b/mkosi/installer/__init__.py @@ -150,6 +150,7 @@ class PackageManager: packages: Sequence[str], *, apivfs: bool = True, + allow_downgrade: bool = False, ) -> None: pass diff --git a/mkosi/installer/apt.py b/mkosi/installer/apt.py index 966c9a1c7..6c518e23e 100644 --- a/mkosi/installer/apt.py +++ b/mkosi/installer/apt.py @@ -245,6 +245,7 @@ class Apt(PackageManager): packages: Sequence[str], *, apivfs: bool = True, + allow_downgrade: bool = False, ) -> None: # Debian policy is to start daemons by default. The policy-rc.d script can be used choose which ones # to start. Let's install one that denies all daemon startups. @@ -257,7 +258,14 @@ class Apt(PackageManager): with umask(~0o644): policyrcd.write_text("#!/bin/sh\nexit 101\n") - cls.invoke(context, "install", packages, apivfs=apivfs) + arguments = [] + + if allow_downgrade: + arguments += ["--allow-downgrades"] + + arguments += [*packages] + + cls.invoke(context, "install", arguments, apivfs=apivfs) policyrcd.unlink() diff --git a/mkosi/installer/dnf.py b/mkosi/installer/dnf.py index 7a3d01102..4f3ceb266 100644 --- a/mkosi/installer/dnf.py +++ b/mkosi/installer/dnf.py @@ -151,7 +151,6 @@ class Dnf(PackageManager): cmdline: list[PathString] = [ dnf, "--assumeyes", - "--best", f"--releasever={context.config.release}", "--installroot=/buildroot", "--setopt=keepcache=1", @@ -214,13 +213,14 @@ class Dnf(PackageManager): operation: str, arguments: Sequence[str] = (), *, + options: Sequence[str] = (), apivfs: bool = False, stdout: _FILE = None, cached_metadata: bool = True, ) -> CompletedProcess: try: return run( - cls.cmd(context, cached_metadata=cached_metadata) + [operation, *arguments], + cls.cmd(context, cached_metadata=cached_metadata) + [*options, operation, *arguments], sandbox=cls.sandbox(context, apivfs=apivfs), env=cls.finalize_environment(context), stdout=stdout, @@ -240,8 +240,20 @@ class Dnf(PackageManager): packages: Sequence[str], *, apivfs: bool = True, + allow_downgrade: bool = False, ) -> None: - cls.invoke(context, "install", packages, apivfs=apivfs) + arguments = [] + options = [] + + if allow_downgrade: + if Dnf.executable(context.config) == "dnf5": + arguments += ["--allow-downgrade"] + else: + options += ["--best"] + + arguments += [*packages] + + cls.invoke(context, "install", arguments, options=options, apivfs=apivfs) @classmethod def remove(cls, context: Context, packages: Sequence[str]) -> None: diff --git a/mkosi/installer/pacman.py b/mkosi/installer/pacman.py index cd142b686..22c81ad72 100644 --- a/mkosi/installer/pacman.py +++ b/mkosi/installer/pacman.py @@ -192,8 +192,15 @@ class Pacman(PackageManager): packages: Sequence[str], *, apivfs: bool = True, + allow_downgrade: bool = False, ) -> None: - arguments = ["--needed", "--assume-installed", "initramfs", *packages] + arguments = ["--needed", "--assume-installed", "initramfs"] + + if allow_downgrade: + arguments += ["--sysupgrade", "--sysupgrade"] + + arguments += [*packages] + cls.invoke(context, "--sync", arguments, apivfs=apivfs) @classmethod diff --git a/mkosi/installer/zypper.py b/mkosi/installer/zypper.py index 446898e38..c76bca987 100644 --- a/mkosi/installer/zypper.py +++ b/mkosi/installer/zypper.py @@ -136,13 +136,18 @@ class Zypper(PackageManager): packages: Sequence[str], *, apivfs: bool = True, + allow_downgrade: bool = False, ) -> None: arguments = [ "--download", "in-advance", "--recommends" if context.config.with_recommends else "--no-recommends", - *packages, ] # fmt: skip + if allow_downgrade: + arguments += ["--allow-downgrade"] + + arguments += [*packages] + cls.invoke(context, "install", arguments, apivfs=apivfs) @classmethod -- 2.47.3