import os
import platform
import shutil
+import subprocess
import sys
import tempfile
from pathlib import Path
from mkosi.log import log_notice, log_setup
from mkosi.run import find_binary, run, uncaught_exception_handler
from mkosi.sandbox import __version__, umask
-from mkosi.tree import copy_tree
+from mkosi.tree import copy_tree, move_tree, rmtree
from mkosi.util import PathString, mandatory_variable, resource_path
else:
output_dir = Path.cwd()
- log_notice(f"Copying {staging_dir / output} to {output_dir / output}")
+ staging = staging_dir / output
+ tmp = output_dir / f"{output}.new"
+ final = output_dir / output
+
+ log_notice(f"Copying {staging} to {tmp}")
# mkosi symlinks the expected output image, so dereference it
- copy_tree(
- (staging_dir / output).resolve(),
- output_dir / output,
- )
+ try:
+ copy_tree(staging.resolve(), tmp)
+ except subprocess.CalledProcessError:
+ rmtree(tmp)
+ raise
+
+ log_notice(f"Moving {tmp} to {final}")
+ rmtree(final)
+ move_tree(tmp, final)
def initrd_common_args(parser: argparse.ArgumentParser) -> None: