]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Make MkosiState a context manager
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Fri, 21 Jul 2023 14:59:00 +0000 (16:59 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Sat, 22 Jul 2023 18:06:31 +0000 (20:06 +0200)
We have to make sure we properly cleanup the workspace object we
allocate so let's make MkosiState a context manager so we do just
that.

mkosi/__init__.py
mkosi/state.py

index 98113ade9767bb3b6ff27b9246496eae5d4c0544..16fc2d8fc25c45d6f3f84dfd0ba19989caeea482 100644 (file)
@@ -47,7 +47,6 @@ from mkosi.types import PathString
 from mkosi.util import (
     InvokingUser,
     flatten,
-    flock,
     format_bytes,
     format_rlimit,
     scopedenv,
@@ -1749,12 +1748,11 @@ def finalize_staging(state: MkosiState) -> None:
 
 
 def build_image(args: MkosiArgs, config: MkosiConfig) -> None:
-    state = MkosiState(args, config)
     manifest = Manifest(config)
 
     # Make sure tmpfiles' aging doesn't interfere with our workspace
     # while we are working on it.
-    with flock(state.workspace), scopedenv({"TMPDIR" : str(state.workspace)}):
+    with MkosiState(args, config) as state, scopedenv({"TMPDIR" : str(state.workspace)}):
         install_package_manager_trees(state)
 
         with mount_image(state):
index f83b74ba23ad9692a07c85e263b1890d2bf3b568..4beb19351709c95a2c30efc895de4b8014ac069e 100644 (file)
@@ -3,6 +3,8 @@
 import importlib
 import tempfile
 from pathlib import Path
+from types import TracebackType
+from typing import Optional, Type
 
 from mkosi.btrfs import btrfs_maybe_make_subvolume
 from mkosi.config import MkosiArgs, MkosiConfig
@@ -17,8 +19,6 @@ class MkosiState:
         self.args = args
         self.config = config
 
-        self._workspace = tempfile.TemporaryDirectory(dir=config.workspace_dir or Path.cwd(), prefix=".mkosi.tmp")
-
         try:
             distro = str(self.config.distribution)
             mod = importlib.import_module(f"mkosi.distributions.{distro}")
@@ -30,12 +30,22 @@ class MkosiState:
             die("No installer for this distribution.")
         self.installer = instance
 
+    def __enter__(self) -> "MkosiState":
+        self._workspace = tempfile.TemporaryDirectory(dir=self.config.workspace_dir or Path.cwd(), prefix=".mkosi.tmp")
         btrfs_maybe_make_subvolume(self.config, self.root, mode=0o755)
         self.staging.mkdir()
         self.pkgmngr.mkdir()
         self.install_dir.mkdir(exist_ok=True)
-
         self.cache_dir.mkdir(parents=True, exist_ok=True)
+        return self
+
+    def __exit__(
+        self,
+        exc_type: Optional[Type[BaseException]],
+        exc: Optional[BaseException],
+        traceback: Optional[TracebackType]
+    ) -> None:
+        self._workspace.cleanup()
 
     @property
     def workspace(self) -> Path: