]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Add support for downgrading when installing volatile packages
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 6 Mar 2025 11:18:20 +0000 (12:18 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 3 Sep 2025 07:41:25 +0000 (09:41 +0200)
mkosi/__init__.py
mkosi/installer/__init__.py
mkosi/installer/apt.py
mkosi/installer/dnf.py
mkosi/installer/pacman.py
mkosi/installer/zypper.py

index d6636995643e5a4ee2653a15bafecd4b053844a2..f2805e9ef8bb641e676a7a598c18f5e954124569 100644 (file)
@@ -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
         )
 
 
index 64e3ce75d6cce1487ff14bed03f77e0532e039c2..5eeccfe8edfda3c8cafd3a215a3c641c4ef6cb89 100644 (file)
@@ -150,6 +150,7 @@ class PackageManager:
         packages: Sequence[str],
         *,
         apivfs: bool = True,
+        allow_downgrade: bool = False,
     ) -> None:
         pass
 
index 966c9a1c7bfacabd1557508dbb93312ea0a436f3..6c518e23e52be8c46b48a27a329a7d27b4f39bbc 100644 (file)
@@ -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()
 
index 7a3d01102ad97a89951c78ffe46a176638d74055..4f3ceb266bc68ecc87252076060234f7710adcfc 100644 (file)
@@ -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:
index cd142b686824bd32c5757fed783ce9a0dabdcb59..22c81ad72af265b152bb15f2452ba730e0be39dd 100644 (file)
@@ -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
index 446898e38a084ab6e827191e43c37688b48295ed..c76bca987a3f5e50aca43d36a3a753a303c07387 100644 (file)
@@ -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