from mkosi.remove import unlink_try_hard
from mkosi.run import become_root, bwrap, chroot_cmd, init_mount_namespace, run, spawn
from mkosi.state import MkosiState
-from mkosi.tree import copy_tree
+from mkosi.tree import copy_tree, move_tree
from mkosi.types import PathString
from mkosi.util import (
InvokingUser,
# this is not ideal since the compressed kernel modules will all be decompressed on boot which
# requires significant memory.
if state.config.distribution.is_apt_distribution():
- maybe_compress(state, Compression.zst, kmods, kmods)
+ maybe_compress(state.config, Compression.zst, kmods, kmods)
return kmods
die(f"Unknown compression {compression}")
-def maybe_compress(state: MkosiState, compression: Compression, src: Path, dst: Optional[Path] = None) -> None:
+def maybe_compress(config: MkosiConfig, compression: Compression, src: Path, dst: Optional[Path] = None) -> None:
if not compression or src.is_dir():
if dst:
- shutil.move(src, dst)
+ move_tree(config, src, dst)
return
if not dst:
# We only use the cache-overlay directory for caching if we have a base tree, otherwise we just
# cache the root directory.
if state.workspace.joinpath("cache-overlay").exists():
- shutil.move(state.workspace / "cache-overlay", final)
+ move_tree(state.config, state.workspace / "cache-overlay", final)
else:
- shutil.move(state.root, final)
+ move_tree(state.config, state.root, final)
if need_build_packages(state.config) and (state.workspace / "build-overlay").exists():
unlink_try_hard(build)
- shutil.move(state.workspace / "build-overlay", build)
+ move_tree(state.config, state.workspace / "build-overlay", build)
manifest.write_text(json.dumps(state.config.cache_manifest()))
def finalize_staging(state: MkosiState) -> None:
for f in state.staging.iterdir():
- shutil.move(f, state.config.output_dir)
+ move_tree(state.config, f, state.config.output_dir)
def build_image(args: MkosiArgs, config: MkosiConfig) -> None:
_, split_paths = make_image(state, split=True)
for p in split_paths:
- maybe_compress(state, state.config.compress_output, p)
+ maybe_compress(state.config, state.config.compress_output, p)
make_tar(state)
make_initrd(state)
make_directory(state)
- maybe_compress(state, state.config.compress_output,
+ maybe_compress(state.config, state.config.compress_output,
state.staging / state.config.output_with_format,
state.staging / state.config.output_with_compression)
# SPDX-License-Identifier: LGPL-2.1+
+import errno
import shutil
import subprocess
from pathlib import Path
def statfs(path: Path) -> str:
- return cast(str, run(["stat", "--file-system", "--format", "%T", path.parent],
+ return cast(str, run(["stat", "--file-system", "--format", "%T", path],
stdout=subprocess.PIPE).stdout.strip())
if result != 0:
run(copy)
+
+
+def move_tree(config: MkosiConfig, src: Path, dst: Path) -> None:
+ if src == dst:
+ return
+
+ if dst.is_dir():
+ dst = dst / src.name
+
+ try:
+ src.rename(dst)
+ except OSError as e:
+ if e.errno != errno.EXDEV:
+ raise e
+
+ copy_tree(config, src, dst)
+ run(["rm", "-rf", src])