From 1db8eb0ac426d45eef64d8d18d3f1de53ffa2d2e Mon Sep 17 00:00:00 2001 From: Evgenii Alekseev Date: Sun, 15 Mar 2026 19:03:05 +0200 Subject: [PATCH] fix: preserve hold status on status updates --- src/ahriman/core/status/watcher.py | 7 ++++--- tests/ahriman/core/status/test_watcher.py | 25 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/ahriman/core/status/watcher.py b/src/ahriman/core/status/watcher.py index 9e05efa0..12863a6a 100644 --- a/src/ahriman/core/status/watcher.py +++ b/src/ahriman/core/status/watcher.py @@ -168,9 +168,9 @@ class Watcher(LazyLogging): package_base(str): package base to update status(BuildStatusEnum): new build status """ - package, _ = self.package_get(package_base) + package, current_status = self.package_get(package_base) with self._lock: - self._known[package_base] = (package, BuildStatus(status)) + self._known[package_base] = (package, BuildStatus(status, is_held=current_status.is_held)) self.client.package_status_update(package_base, status) def package_update(self, package: Package, status: BuildStatusEnum) -> None: @@ -182,7 +182,8 @@ class Watcher(LazyLogging): status(BuildStatusEnum): new build status """ with self._lock: - self._known[package.base] = (package, BuildStatus(status)) + _, current_status = self._known.get(package.base, (package, BuildStatus())) + self._known[package.base] = (package, BuildStatus(status, is_held=current_status.is_held)) self.client.package_update(package, status) def status_update(self, status: BuildStatusEnum) -> None: diff --git a/tests/ahriman/core/status/test_watcher.py b/tests/ahriman/core/status/test_watcher.py index 6d45f913..7646e553 100644 --- a/tests/ahriman/core/status/test_watcher.py +++ b/tests/ahriman/core/status/test_watcher.py @@ -131,6 +131,19 @@ def test_package_status_update(watcher: Watcher, package_ahriman: Package, mocke assert status.status == BuildStatusEnum.Success +def test_package_status_update_preserves_hold(watcher: Watcher, package_ahriman: Package, + mocker: MockerFixture) -> None: + """ + must preserve hold status on package status update + """ + mocker.patch("ahriman.core.status.local_client.LocalClient.package_status_update") + watcher._known = {package_ahriman.base: (package_ahriman, BuildStatus(is_held=True))} + + watcher.package_status_update(package_ahriman.base, BuildStatusEnum.Success) + _, status = watcher._known[package_ahriman.base] + assert status.is_held is True + + def test_package_status_update_unknown(watcher: Watcher, package_ahriman: Package) -> None: """ must fail on unknown package status update only @@ -150,6 +163,18 @@ def test_package_update(watcher: Watcher, package_ahriman: Package, mocker: Mock cache_mock.assert_called_once_with(package_ahriman, pytest.helpers.anyvar(int)) +def test_package_update_preserves_hold(watcher: Watcher, package_ahriman: Package, mocker: MockerFixture) -> None: + """ + must preserve hold status on package update + """ + mocker.patch("ahriman.core.status.local_client.LocalClient.package_update") + watcher._known = {package_ahriman.base: (package_ahriman, BuildStatus(is_held=True))} + + watcher.package_update(package_ahriman, BuildStatusEnum.Success) + _, status = watcher._known[package_ahriman.base] + assert status.is_held is True + + def test_status_update(watcher: Watcher) -> None: """ must update service status