From: Daan De Meyer Date: Thu, 15 Feb 2024 09:43:48 +0000 (+0100) Subject: Make package manager invoke() methods return the result X-Git-Tag: v21~50^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=407f49a1fc854083583ed60a99db28cd43686e01;p=thirdparty%2Fmkosi.git Make package manager invoke() methods return the result We also move the rpm database fixup call to the install() method of the distribution so we don't try to do it every time we invoke the package manager as it only needs to be done once. --- diff --git a/mkosi/distributions/centos.py b/mkosi/distributions/centos.py index cc42df687..62e5db761 100644 --- a/mkosi/distributions/centos.py +++ b/mkosi/distributions/centos.py @@ -14,7 +14,7 @@ from mkosi.distributions import ( ) from mkosi.installer import PackageManager from mkosi.installer.dnf import Dnf -from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey +from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey, fixup_rpmdb_location from mkosi.log import complete_step, die from mkosi.tree import rmtree from mkosi.util import listify @@ -84,6 +84,7 @@ class Installer(DistributionInstaller): def install(cls, context: Context) -> None: # Make sure glibc-minimal-langpack is installed instead of glibc-all-langpacks. cls.install_packages(context, ["filesystem", "glibc-minimal-langpack"], apivfs=False) + fixup_rpmdb_location(context) # On Fedora, the default rpmdb has moved to /usr/lib/sysimage/rpm so if that's the case we # need to move it back to /var/lib/rpm on CentOS. diff --git a/mkosi/distributions/fedora.py b/mkosi/distributions/fedora.py index 27eab68e5..6bf1fe8b3 100644 --- a/mkosi/distributions/fedora.py +++ b/mkosi/distributions/fedora.py @@ -12,7 +12,7 @@ from mkosi.distributions import ( ) from mkosi.installer import PackageManager from mkosi.installer.dnf import Dnf -from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey +from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey, fixup_rpmdb_location from mkosi.log import die from mkosi.util import listify @@ -61,6 +61,7 @@ class Installer(DistributionInstaller): @classmethod def install(cls, context: Context) -> None: cls.install_packages(context, ["filesystem"], apivfs=False) + fixup_rpmdb_location(context) @classmethod def install_packages(cls, context: Context, packages: Sequence[str], apivfs: bool = True) -> None: diff --git a/mkosi/distributions/opensuse.py b/mkosi/distributions/opensuse.py index 230c7e49f..d46961c2d 100644 --- a/mkosi/distributions/opensuse.py +++ b/mkosi/distributions/opensuse.py @@ -10,7 +10,7 @@ from mkosi.context import Context from mkosi.distributions import Distribution, DistributionInstaller, PackageType from mkosi.installer import PackageManager from mkosi.installer.dnf import Dnf -from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey +from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey, fixup_rpmdb_location from mkosi.installer.zypper import Zypper from mkosi.log import die from mkosi.run import find_binary, run @@ -75,6 +75,7 @@ class Installer(DistributionInstaller): @classmethod def install(cls, context: Context) -> None: cls.install_packages(context, ["filesystem", "distribution-release"], apivfs=False) + fixup_rpmdb_location(context) @classmethod def install_packages(cls, context: Context, packages: Sequence[str], apivfs: bool = True) -> None: diff --git a/mkosi/installer/apt.py b/mkosi/installer/apt.py index feb9a24e0..9d78a1ef0 100644 --- a/mkosi/installer/apt.py +++ b/mkosi/installer/apt.py @@ -11,7 +11,7 @@ from mkosi.log import die from mkosi.mounts import finalize_ephemeral_source_mounts from mkosi.run import find_binary, run from mkosi.sandbox import apivfs_cmd -from mkosi.types import PathString +from mkosi.types import CompletedProcess, PathString from mkosi.util import sort_packages, umask @@ -172,9 +172,9 @@ class Apt(PackageManager): options: Sequence[str] = (), apivfs: bool = True, mounts: Sequence[PathString] = (), - ) -> None: + ) -> CompletedProcess: with finalize_ephemeral_source_mounts(context.config) as sources: - run( + return run( cls.cmd(context, "apt-get") + [operation, *options, *sort_packages(packages)], sandbox=( context.sandbox( diff --git a/mkosi/installer/dnf.py b/mkosi/installer/dnf.py index 9058111aa..0acff3dd1 100644 --- a/mkosi/installer/dnf.py +++ b/mkosi/installer/dnf.py @@ -6,12 +6,12 @@ from pathlib import Path from mkosi.config import Cacheonly, Config from mkosi.context import Context from mkosi.installer import PackageManager -from mkosi.installer.rpm import RpmRepository, fixup_rpmdb_location, rpm_cmd, setup_rpm +from mkosi.installer.rpm import RpmRepository, rpm_cmd, setup_rpm from mkosi.log import ARG_DEBUG from mkosi.mounts import finalize_ephemeral_source_mounts from mkosi.run import find_binary, run from mkosi.sandbox import apivfs_cmd -from mkosi.types import PathString +from mkosi.types import CompletedProcess, PathString from mkosi.util import sort_packages @@ -158,32 +158,31 @@ class Dnf(PackageManager): packages: Iterable[str] = (), options: Sequence[str] = (), apivfs: bool = True, - ) -> None: - with finalize_ephemeral_source_mounts(context.config) as sources: - run( - cls.cmd(context) + [operation, *options, *sort_packages(packages)], - sandbox=( - context.sandbox( - network=True, - options=[ - "--bind", context.root, context.root, - *cls.mounts(context), - *sources, - "--chdir", "/work/src", - ], - ) + (apivfs_cmd(context.root) if apivfs else []) - ), - env=context.config.environment, - ) - - fixup_rpmdb_location(context) - - # dnf interprets the log directory relative to the install root so there's nothing we can do but to remove the - # log files from the install root afterwards. - if (context.root / "var/log").exists(): - for p in (context.root / "var/log").iterdir(): - if any(p.name.startswith(prefix) for prefix in ("dnf", "hawkey", "yum")): - p.unlink() + ) -> CompletedProcess: + try: + with finalize_ephemeral_source_mounts(context.config) as sources: + return run( + cls.cmd(context) + [operation, *options, *sort_packages(packages)], + sandbox=( + context.sandbox( + network=True, + options=[ + "--bind", context.root, context.root, + *cls.mounts(context), + *sources, + "--chdir", "/work/src", + ], + ) + (apivfs_cmd(context.root) if apivfs else []) + ), + env=context.config.environment, + ) + finally: + # dnf interprets the log directory relative to the install root so there's nothing we can do but to remove + # the log files from the install root afterwards. + if (context.root / "var/log").exists(): + for p in (context.root / "var/log").iterdir(): + if any(p.name.startswith(prefix) for prefix in ("dnf", "hawkey", "yum")): + p.unlink() @classmethod def sync(cls, context: Context, options: Sequence[str] = ()) -> None: diff --git a/mkosi/installer/pacman.py b/mkosi/installer/pacman.py index dbdad5d95..6fe0d1cce 100644 --- a/mkosi/installer/pacman.py +++ b/mkosi/installer/pacman.py @@ -11,7 +11,7 @@ from mkosi.installer import PackageManager from mkosi.mounts import finalize_ephemeral_source_mounts from mkosi.run import run from mkosi.sandbox import apivfs_cmd -from mkosi.types import PathString +from mkosi.types import CompletedProcess, PathString from mkosi.util import sort_packages, umask from mkosi.versioncomp import GenericVersion @@ -148,9 +148,9 @@ class Pacman(PackageManager): options: Sequence[str] = (), packages: Sequence[str] = (), apivfs: bool = True, - ) -> None: + ) -> CompletedProcess: with finalize_ephemeral_source_mounts(context.config) as sources: - run( + return run( cls.cmd(context) + [operation, *options, *sort_packages(packages)], sandbox=( context.sandbox( diff --git a/mkosi/installer/zypper.py b/mkosi/installer/zypper.py index f63286637..afedee5a1 100644 --- a/mkosi/installer/zypper.py +++ b/mkosi/installer/zypper.py @@ -7,11 +7,11 @@ from pathlib import Path from mkosi.config import Config, yes_no from mkosi.context import Context from mkosi.installer import PackageManager -from mkosi.installer.rpm import RpmRepository, fixup_rpmdb_location, rpm_cmd, setup_rpm +from mkosi.installer.rpm import RpmRepository, rpm_cmd, setup_rpm from mkosi.mounts import finalize_ephemeral_source_mounts from mkosi.run import run from mkosi.sandbox import apivfs_cmd -from mkosi.types import PathString +from mkosi.types import CompletedProcess, PathString from mkosi.util import sort_packages @@ -119,9 +119,9 @@ class Zypper(PackageManager): *, options: Sequence[str] = (), apivfs: bool = True, - ) -> None: + ) -> CompletedProcess: with finalize_ephemeral_source_mounts(context.config) as sources: - run( + return run( cls.cmd(context) + [operation, *options, *sort_packages(packages)], sandbox=( context.sandbox( @@ -137,8 +137,6 @@ class Zypper(PackageManager): env=context.config.environment, ) - fixup_rpmdb_location(context) - @classmethod def sync(cls, context: Context) -> None: cls.invoke(context, "refresh", apivfs=False)