From: Daan De Meyer Date: Wed, 26 Jul 2023 21:14:23 +0000 (+0200) Subject: Rework clean_package_manager_metadata() X-Git-Tag: v15~50^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F1719%2Fhead;p=thirdparty%2Fmkosi.git Rework clean_package_manager_metadata() --- diff --git a/mkosi/__init__.py b/mkosi/__init__.py index 82b4dbdf4..1583054c1 100644 --- a/mkosi/__init__.py +++ b/mkosi/__init__.py @@ -34,6 +34,7 @@ from mkosi.config import ( Verb, ) from mkosi.install import add_dropin_config_from_resource +from mkosi.installer import clean_package_manager_metadata from mkosi.log import Style, color_error, complete_step, die, log_step from mkosi.manifest import Manifest from mkosi.mounts import mount_overlay, mount_passwd, mount_tools, scandir_recursive @@ -43,14 +44,7 @@ from mkosi.run import become_root, bwrap, chroot_cmd, init_mount_namespace, run from mkosi.state import MkosiState from mkosi.tree import copy_tree, move_tree, rmtree from mkosi.types import PathString -from mkosi.util import ( - InvokingUser, - flatten, - format_bytes, - format_rlimit, - scopedenv, - try_import, -) +from mkosi.util import InvokingUser, format_bytes, format_rlimit, scopedenv, try_import @contextlib.contextmanager @@ -82,116 +76,6 @@ def mount_image(state: MkosiState) -> Iterator[None]: yield -def clean_paths( - root: Path, - globs: Sequence[str], - tool: str, - always: bool) -> None: - """Remove globs under root if always or if tool is not found under root.""" - - toolp = root / tool.lstrip('/') - cond = always or not os.access(toolp, os.F_OK, follow_symlinks=False) - - paths = flatten(root.glob(glob.lstrip('/')) for glob in globs) - - if not cond or not paths: - return - - with complete_step(f"Cleaning {toolp.name} metadata…"): - for path in paths: - rmtree(path) - - -def clean_dnf_metadata(root: Path, always: bool) -> None: - """Remove dnf metadata if /bin/dnf is not present in the image - - If dnf is not installed, there doesn't seem to be much use in keeping the - dnf metadata, since it's not usable from within the image anyway. - """ - paths = [ - "/var/lib/dnf", - "/var/log/dnf.*", - "/var/log/hawkey.*", - "/var/cache/dnf", - ] - - clean_paths(root, paths, tool='/bin/dnf', always=always) - - -def clean_yum_metadata(root: Path, always: bool) -> None: - """Remove yum metadata if /bin/yum is not present in the image""" - paths = [ - "/var/lib/yum", - "/var/log/yum.*", - "/var/cache/yum", - ] - - clean_paths(root, paths, tool='/bin/yum', always=always) - - -def clean_rpm_metadata(root: Path, always: bool) -> None: - """Remove rpm metadata if /bin/rpm is not present in the image""" - paths = [ - "/var/lib/rpm", - "/usr/lib/sysimage/rpm", - ] - - clean_paths(root, paths, tool='/bin/rpm', always=always) - - -def clean_apt_metadata(root: Path, always: bool) -> None: - """Remove apt metadata if /usr/bin/apt is not present in the image""" - paths = [ - "/var/lib/apt", - "/var/log/apt", - "/var/cache/apt", - ] - - clean_paths(root, paths, tool='/usr/bin/apt', always=always) - - -def clean_dpkg_metadata(root: Path, always: bool) -> None: - """Remove dpkg metadata if /usr/bin/dpkg is not present in the image""" - paths = [ - "/var/lib/dpkg", - "/var/log/dpkg.log", - ] - - clean_paths(root, paths, tool='/usr/bin/dpkg', always=always) - - -def clean_pacman_metadata(root: Path, always: bool) -> None: - """Remove pacman metadata if /usr/bin/pacman is not present in the image""" - paths = [ - "/var/lib/pacman", - "/var/cache/pacman", - "/var/log/pacman.log" - ] - - clean_paths(root, paths, tool='/usr/bin/pacman', always=always) - - -def clean_package_manager_metadata(state: MkosiState) -> None: - """Remove package manager metadata - - Try them all regardless of the distro: metadata is only removed if the - package manager is present in the image. - """ - - if state.config.clean_package_metadata == ConfigFeature.disabled: - return - - # we try then all: metadata will only be touched if any of them are in the - # final image - always = state.config.clean_package_metadata == ConfigFeature.enabled - clean_dnf_metadata(state.root, always=always) - clean_yum_metadata(state.root, always=always) - clean_rpm_metadata(state.root, always=always) - clean_apt_metadata(state.root, always=always) - clean_dpkg_metadata(state.root, always=always) - clean_pacman_metadata(state.root, always=always) - - def remove_files(state: MkosiState) -> None: """Remove files based on user-specified patterns""" diff --git a/mkosi/installer/__init__.py b/mkosi/installer/__init__.py index 5d742c4f7..4e50e38e6 100644 --- a/mkosi/installer/__init__.py +++ b/mkosi/installer/__init__.py @@ -1 +1,31 @@ # SPDX-License-Identifier: LGPL-2.1+ + +import os + +from mkosi.config import ConfigFeature +from mkosi.state import MkosiState +from mkosi.tree import rmtree + + +def clean_package_manager_metadata(state: MkosiState) -> None: + """ + Remove package manager metadata + + Try them all regardless of the distro: metadata is only removed if + the package manager is not present in the image. + """ + + if state.config.clean_package_metadata == ConfigFeature.disabled: + return + + always = state.config.clean_package_metadata == ConfigFeature.enabled + + for tool, paths in (("rpm", ["var/lib/rpm", "usr/lib/sysimage/rpm"]), + ("dpkg", ["var/lib/dpkg"]), + ("pacman", ["var/lib/pacman"])): + for bin in ("bin", "sbin"): + if not always and os.access(state.root / "usr" / bin / tool, mode=os.F_OK, follow_symlinks=False): + break + else: + for p in paths: + rmtree(state.root / p)