From: Daan De Meyer Date: Wed, 26 Jul 2023 13:06:40 +0000 (+0200) Subject: Introduce rmtree() and remove unlink_try_hard() X-Git-Tag: v15~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e79584f8172be06bd8b7aa7dd790027cb6a18142;p=thirdparty%2Fmkosi.git Introduce rmtree() and remove unlink_try_hard() --- diff --git a/mkosi/__init__.py b/mkosi/__init__.py index 57596d13c..98551d14d 100644 --- a/mkosi/__init__.py +++ b/mkosi/__init__.py @@ -39,10 +39,9 @@ from mkosi.manifest import Manifest from mkosi.mounts import mount_overlay, mount_passwd, mount_tools, scandir_recursive from mkosi.pager import page from mkosi.qemu import copy_ephemeral, machine_cid, run_qemu -from mkosi.remove import unlink_try_hard 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 +from mkosi.tree import copy_tree, move_tree, rmtree from mkosi.types import PathString from mkosi.util import ( InvokingUser, @@ -100,7 +99,7 @@ def clean_paths( with complete_step(f"Cleaning {toolp.name} metadata…"): for path in paths: - unlink_try_hard(path) + rmtree(path) def clean_dnf_metadata(root: Path, always: bool) -> None: @@ -202,7 +201,7 @@ def remove_files(state: MkosiState) -> None: with complete_step("Removing files…"): for pattern in state.config.remove_files: for p in state.root.glob(pattern.lstrip("/")): - unlink_try_hard(p) + rmtree(p) def install_distribution(state: MkosiState) -> None: @@ -1114,7 +1113,7 @@ def print_output_size(path: Path) -> None: def empty_directory(path: Path) -> None: try: for f in os.listdir(path): - unlink_try_hard(path / f) + rmtree(path / f) except FileNotFoundError: pass @@ -1137,14 +1136,14 @@ def unlink_output(args: MkosiArgs, config: MkosiConfig) -> None: if config.output_dir.exists(): for p in config.output_dir.iterdir(): if p.name.startswith(prefix): - unlink_try_hard(p) + rmtree(p) if remove_build_cache: if config.cache_dir: for p in cache_tree_paths(config): if p.exists(): with complete_step(f"Removing cache entry {p}…"): - unlink_try_hard(p) + rmtree(p) if config.build_dir and config.build_dir.exists() and any(config.build_dir.iterdir()): with complete_step("Clearing out build directory…"): @@ -1593,7 +1592,7 @@ def save_cache(state: MkosiState) -> None: final, build, manifest = cache_tree_paths(state.config) with complete_step("Installing cache copies"): - unlink_try_hard(final) + rmtree(final) # We only use the cache-overlay directory for caching if we have a base tree, otherwise we just # cache the root directory. @@ -1603,7 +1602,7 @@ def save_cache(state: MkosiState) -> None: move_tree(state.config, state.root, final) if need_build_packages(state.config) and (state.workspace / "build-overlay").exists(): - unlink_try_hard(build) + rmtree(build) move_tree(state.config, state.workspace / "build-overlay", build) manifest.write_text(json.dumps(state.config.cache_manifest())) diff --git a/mkosi/distributions/centos.py b/mkosi/distributions/centos.py index a7ecc91da..cddd943ab 100644 --- a/mkosi/distributions/centos.py +++ b/mkosi/distributions/centos.py @@ -10,8 +10,8 @@ from mkosi.config import MkosiConfig from mkosi.distributions import DistributionInstaller from mkosi.distributions.fedora import Repo, invoke_dnf, setup_dnf from mkosi.log import complete_step, die -from mkosi.remove import unlink_try_hard from mkosi.state import MkosiState +from mkosi.tree import rmtree def move_rpm_db(root: Path) -> None: @@ -21,7 +21,7 @@ def move_rpm_db(root: Path) -> None: if newdb.exists() and not newdb.is_symlink(): with complete_step("Moving rpm database /usr/lib/sysimage/rpm → /var/lib/rpm"): - unlink_try_hard(olddb) + rmtree(olddb) shutil.move(newdb, olddb) newdb.symlink_to(os.path.relpath(olddb, start=newdb.parent)) diff --git a/mkosi/distributions/fedora.py b/mkosi/distributions/fedora.py index c376c05ed..53dcdd397 100644 --- a/mkosi/distributions/fedora.py +++ b/mkosi/distributions/fedora.py @@ -10,9 +10,9 @@ from typing import Any, NamedTuple from mkosi.architecture import Architecture from mkosi.distributions import DistributionInstaller from mkosi.log import die -from mkosi.remove import unlink_try_hard from mkosi.run import bwrap from mkosi.state import MkosiState +from mkosi.tree import rmtree from mkosi.util import sort_packages @@ -227,6 +227,6 @@ def fixup_rpmdb_location(root: Path) -> None: rpmdb = root / "usr/lib/sysimage/rpm" if not rpmdb.exists(): rpmdb = root / "var/lib/rpm" - unlink_try_hard(rpmdb) + rmtree(rpmdb) shutil.move(rpmdb_home, rpmdb) rpmdb_home.symlink_to(os.path.relpath(rpmdb, start=rpmdb_home.parent)) diff --git a/mkosi/distributions/gentoo.py b/mkosi/distributions/gentoo.py index 8d761f101..d08968cea 100644 --- a/mkosi/distributions/gentoo.py +++ b/mkosi/distributions/gentoo.py @@ -10,10 +10,9 @@ from pathlib import Path from mkosi.architecture import Architecture from mkosi.distributions import DistributionInstaller from mkosi.log import ARG_DEBUG, complete_step, die -from mkosi.remove import unlink_try_hard from mkosi.run import bwrap, chroot_cmd, run from mkosi.state import MkosiState -from mkosi.tree import copy_tree +from mkosi.tree import copy_tree, rmtree from mkosi.types import PathString @@ -92,7 +91,7 @@ class GentooInstaller(DistributionInstaller): run(cmd) if stage3_tar.stat().st_mtime > old: - unlink_try_hard(stage3) + rmtree(stage3) stage3.mkdir(exist_ok=True) diff --git a/mkosi/qemu.py b/mkosi/qemu.py index f4b130179..27709d817 100644 --- a/mkosi/qemu.py +++ b/mkosi/qemu.py @@ -18,9 +18,8 @@ from typing import Iterator, Optional from mkosi.architecture import Architecture from mkosi.config import ConfigFeature, MkosiArgs, MkosiConfig, OutputFormat from mkosi.log import die -from mkosi.remove import unlink_try_hard from mkosi.run import MkosiAsyncioThread, run, spawn -from mkosi.tree import copy_tree +from mkosi.tree import copy_tree, rmtree from mkosi.types import PathString from mkosi.util import ( Distribution, @@ -208,7 +207,7 @@ def copy_ephemeral(config: MkosiConfig, src: Path) -> Iterator[Path]: copy_tree(config, src, tmp) yield tmp finally: - unlink_try_hard(tmp) + rmtree(tmp) def run_qemu(args: MkosiArgs, config: MkosiConfig) -> None: diff --git a/mkosi/remove.py b/mkosi/remove.py deleted file mode 100644 index aa0d02413..000000000 --- a/mkosi/remove.py +++ /dev/null @@ -1,21 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1+ - -import shutil -from pathlib import Path -from typing import Optional - - -def unlink_try_hard(path: Optional[Path]) -> None: - if path is None: - return - - path = Path(path) - try: - path.unlink() - return - except FileNotFoundError: - return - except Exception: - pass - - shutil.rmtree(path) diff --git a/mkosi/tree.py b/mkosi/tree.py index aa2c5d4dc..640890d84 100644 --- a/mkosi/tree.py +++ b/mkosi/tree.py @@ -79,6 +79,10 @@ def copy_tree(config: MkosiConfig, src: Path, dst: Path, *, preserve_owner: bool run(copy) +def rmtree(path: Path) -> None: + run(["rm", "-rf", "--", path]) + + def move_tree(config: MkosiConfig, src: Path, dst: Path) -> None: if src == dst: return @@ -93,4 +97,4 @@ def move_tree(config: MkosiConfig, src: Path, dst: Path) -> None: raise e copy_tree(config, src, dst) - run(["rm", "-rf", src]) + rmtree(src)