From 8baedd5358de82332b1a57b2a95fe10e167fc6f9 Mon Sep 17 00:00:00 2001 From: BigfootACA Date: Tue, 21 May 2024 17:21:56 +0800 Subject: [PATCH] builder: main.py: add --clean for cleanup workspace Signed-off-by: BigfootACA --- README.md | 1 + builder/build/bootstrap.py | 16 ++++++++++++++++ builder/lib/context.py | 5 +++++ builder/main.py | 2 ++ 4 files changed, 24 insertions(+) diff --git a/README.md b/README.md index 403ffca..ab98d3f 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ python build.py -c target/ayn-odin2-sdcard,locale/zh-cn,desktop/gnome | Option | Description | |-------------------------------------|----------------------------------| +| -C, --clean | Clean workspace before build | | -p PRESET, --preset PRESET | Select preset to create package | | -c CONFIG, --config CONFIG | Select configs to build | | -o WORKSPACE, --workspace WORKSPACE | Set workspace for builder | diff --git a/builder/build/bootstrap.py b/builder/build/bootstrap.py index a87d602..02c861e 100644 --- a/builder/build/bootstrap.py +++ b/builder/build/bootstrap.py @@ -7,6 +7,7 @@ from builder.build import locale, systemd, mkinitcpio, names from builder.build import pacman as pacman_build from builder.component import pacman as pacman_comp from builder.lib.context import ArchBuilderContext +from builder.lib.mount import MountTab log = getLogger(__name__) @@ -51,12 +52,27 @@ def do_copy(ctx: ArchBuilderContext, src: str, dst: str): if ret != 0: raise OSError("rsync failed") +def remove_workspace(ctx: ArchBuilderContext): + # ensure mount point is clean + mnts = MountTab.parse_mounts() + if any(mnts.find_folder(ctx.work)): + raise RuntimeError("mount points not cleanup") + + # DANGEROUS: fully remove workspace + log.info(f"cleaning workspace {ctx.work}") + shutil.rmtree(ctx.work) + + def build_rootfs(ctx: ArchBuilderContext): """ Build whole rootfs and generate image """ log.info("building rootfs") + # clean workspace + if ctx.clean and os.path.exists(ctx.work): + remove_workspace(ctx) + # create folders os.makedirs(ctx.work, mode=0o755, exist_ok=True) os.makedirs(ctx.get_rootfs(), mode=0o0755, exist_ok=True) diff --git a/builder/lib/context.py b/builder/lib/context.py index b0df777..0802408 100644 --- a/builder/lib/context.py +++ b/builder/lib/context.py @@ -43,6 +43,11 @@ class ArchBuilderContext: """ repack: bool = False + """ + Clean workspace before rebuild + """ + clean: bool = False + """ Top tree folder """ diff --git a/builder/main.py b/builder/main.py index 090618c..e2d40f7 100644 --- a/builder/main.py +++ b/builder/main.py @@ -15,6 +15,7 @@ def parse_arguments(ctx: ArchBuilderContext): prog="arch-image-builder", description="Build flashable image for Arch Linux", ) + parser.add_argument("-C", "--clean", help="Clean workspace before build", default=False, action='store_true') parser.add_argument("-p", "--preset", help="Select preset to create package") parser.add_argument("-c", "--config", help="Select config to build", action='append') parser.add_argument("-o", "--workspace", help="Set workspace for builder", default=ctx.work) @@ -30,6 +31,7 @@ def parse_arguments(ctx: ArchBuilderContext): if args.no_gpgcheck: ctx.gpgcheck = False if args.repack: ctx.repack = True + if args.clean: ctx.clean = True # collect configs path configs = []