fix: preserve hold status on status updates

This commit is contained in:
2026-03-15 19:03:05 +02:00
parent dc394f7df9
commit 1db8eb0ac4
2 changed files with 29 additions and 3 deletions

View File

@@ -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:

View File

@@ -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