diff --git a/ekernel.py b/ekernel.py index 50cd736..d8a720a 100644 --- a/ekernel.py +++ b/ekernel.py @@ -173,11 +173,12 @@ def efi (f): if f"already mounted on {Kernel.esp}" not in msg: raise RuntimeError(e.stderr.decode().splitlines()[0]) assert Kernel.boot.exists() - r = f(*args, **kwargs) - # umount esp - if mounted: - subprocess.run(["umount", str(Kernel.esp)], check=True) - return r + try: + return f(*args, **kwargs) + finally: + # umount esp + if mounted: + subprocess.run(["umount", str(Kernel.esp)], check=True) return locator @cli diff --git a/tests/test_clean.py b/tests/test_clean.py index 6448949..134cc68 100644 --- a/tests/test_clean.py +++ b/tests/test_clean.py @@ -100,6 +100,15 @@ class Tests (unittest.TestCase): self.assertEqual(run("-q", "-k", "10"), 0) self.check_clean(10) + @capture_stdout + def test_clean_umount_on_error (self): + with self.assertRaises(SystemExit): + self.assertEqual(run("-h"), 0) + tracer, (args, kwargs) = self.interceptor.trace[-1] + self.assertEqual(tracer.name, "subprocess.run") + self.assertEqual(args, (["umount", "/tmp"],)) + self.assertEqual(kwargs, {"check": True}) + @colorless @capture_stdout def test_clean_dry_run (self): diff --git a/tests/test_install.py b/tests/test_install.py index 9a62ac1..763efeb 100644 --- a/tests/test_install.py +++ b/tests/test_install.py @@ -82,3 +82,7 @@ class Tests (unittest.TestCase): with self.assertRaises(SystemExit): self.assertEqual(run("-s", str(data.latest)), 1) self.assertRegex(sys.stderr.getvalue(), r"missing.*bzImage") + tracer, (args, kwargs) = self.interceptor.trace[-1] + self.assertEqual(tracer.name, "subprocess.run") + self.assertEqual(args, (["umount", "/tmp"],)) + self.assertEqual(kwargs, {"check": True})