diff --git a/pmb/chroot/__init__.py b/pmb/chroot/__init__.py index 83c061bd..8958e130 100644 --- a/pmb/chroot/__init__.py +++ b/pmb/chroot/__init__.py @@ -4,4 +4,4 @@ from pmb.chroot.init import init, init_keys, UsrMerge from pmb.chroot.mount import mount, mount_native_into_foreign, remove_mnt_pmbootstrap from pmb.chroot.run import root, rootm, user, userm, exists as user_exists from pmb.chroot.shutdown import shutdown -from pmb.chroot.zap import zap +from pmb.chroot.zap import zap, del_chroot diff --git a/pmb/chroot/zap.py b/pmb/chroot/zap.py index 8f61c374..4ef526c9 100644 --- a/pmb/chroot/zap.py +++ b/pmb/chroot/zap.py @@ -1,6 +1,7 @@ # Copyright 2023 Oliver Smith # SPDX-License-Identifier: GPL-3.0-or-later import glob +from pathlib import Path from pmb.core.arch import Arch from pmb.helpers import logging import os @@ -10,14 +11,31 @@ import pmb.config.workdir import pmb.chroot import pmb.config.pmaports import pmb.config.workdir +import pmb.helpers.cli import pmb.helpers.pmaports import pmb.helpers.run -from pmb.meta import Cache +import pmb.helpers.mount import pmb.parse.apkindex from pmb.core import Chroot from pmb.core.context import get_context +def del_chroot(path: Path, confirm=True, dry=False): + if confirm and not pmb.helpers.cli.confirm(f"Remove {path}?"): + return + if dry: + return + + # Safety first! + assert path.is_absolute() + assert path.is_relative_to(get_context().config.work) + + # umount_all() will throw if any mount under path fails to unmount + pmb.helpers.mount.umount_all(path) + + pmb.helpers.run.root(["rm", "-rf", path]) + + def zap(confirm=True, dry=False, pkgs_local=False, http=False, pkgs_local_mismatch=False, pkgs_online_mismatch=False, distfiles=False, rust=False, netboot=False): @@ -51,7 +69,7 @@ def zap(confirm=True, dry=False, pkgs_local=False, http=False, pmb.chroot.shutdown() # Deletion patterns for folders inside get_context().config.work - patterns = list(Chroot.iter_patterns()) + patterns = [] if pkgs_local: patterns += ["packages"] if http: @@ -63,6 +81,9 @@ def zap(confirm=True, dry=False, pkgs_local=False, http=False, if netboot: patterns += ["images_netboot"] + for chroot in Chroot.glob(): + del_chroot(chroot, confirm, dry) + # Delete everything matching the patterns for pattern in patterns: logging.debug(f"Deleting {pattern}")