]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Introduce rmtree() and remove unlink_try_hard()
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 26 Jul 2023 13:06:40 +0000 (15:06 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 29 Jul 2023 10:22:58 +0000 (12:22 +0200)
mkosi/__init__.py
mkosi/distributions/centos.py
mkosi/distributions/fedora.py
mkosi/distributions/gentoo.py
mkosi/qemu.py
mkosi/remove.py [deleted file]
mkosi/tree.py

index 57596d13c4437ed35003103d6c27008131b93f5f..98551d14d66b6cb0e0a7764f61230716f7a633ec 100644 (file)
@@ -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()))
index a7ecc91dad1fc0e378c86ea0bbf65db529ac5b14..cddd943ab23992c7723f4b2cba3cba9bc20c27d8 100644 (file)
@@ -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))
index c376c05edb6dd0901e56f4e8a1985f7a63a70b69..53dcdd397045a174ed36a790f59faf881c7b2013 100644 (file)
@@ -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))
index 8d761f101ea5dbd9a1a8ac338e7d4193dd2393ef..d08968ceae376d935d6cd81f3ed280997af6e9a7 100644 (file)
@@ -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)
 
index f4b13017955ec43a0d0d6a8674d68cee4e86e903..27709d817c081241c191355ebc659268c3697ba9 100644 (file)
@@ -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 (file)
index aa0d024..0000000
+++ /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)
index aa2c5d4dccf4b3bde831a9a38478e83b40fe89ca..640890d84280614a1cedda7177bf42badea6a3d8 100644 (file)
@@ -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)