From 691817477f59c291935d4cf82feed9f7574948c9 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 13 Mar 2022 08:15:36 -0400 Subject: [PATCH] package: Fail diagnostic when not able to resolve When a package expression cannot be resolved (i.e. not installable), add a diagnostic failure result with appropriate message. Signed-off-by: James Valleroy --- plinth/package.py | 17 +++++++++++++++-- plinth/tests/test_package.py | 16 ++++++++++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/plinth/package.py b/plinth/package.py index 287423aee..7b9e352c2 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -56,6 +56,9 @@ class Package(PackageExpression): self.codename = codename self.architecture = architecture + def __repr__(self): + return self.name + def __or__(self, other): return PackageOr(self, other) @@ -79,6 +82,9 @@ class PackageOr(PackageExpression): self.package1 = package1 self.package2 = package2 + def __repr__(self): + return self.package1.name + ' | ' + self.package2.name + def possible(self) -> list[str]: return self.package1.possible() + self.package2.possible() @@ -169,8 +175,15 @@ class Packages(app.FollowerComponent): """Run diagnostics and return results.""" results = super().diagnose() cache = apt.Cache() - # XXX: Needs to be able to handle missing packages. - for package_name in self.resolve(): + for package_expression in self.packages: + try: + package_name = package_expression.actual() + except MissingPackageError: + message = _('Package {expression} is not available for ' + 'install').format(expression=package_expression) + results.append([message, 'failed']) + continue + result = 'warning' latest_version = '?' if package_name in cache: diff --git a/plinth/tests/test_package.py b/plinth/tests/test_package.py index e787e8e8e..522fb8fde 100644 --- a/plinth/tests/test_package.py +++ b/plinth/tests/test_package.py @@ -126,16 +126,24 @@ def test_diagnose(cache): cache.return_value = { 'package2': Mock(candidate=Mock(version='2.0', is_installed=True)), 'package3': Mock(candidate=Mock(version='3.0', is_installed=False)), + 'package7': Mock(candidate=Mock(version='4.0', is_installed=True)), } - component = Packages('test-component', - ['package1', 'package2', 'package3']) + component = Packages('test-component', [ + 'package1', 'package2', 'package3', + Package('package4') | Package('package5'), + Package('package6') | Package('package7') + ]) results = component.diagnose() - assert '(?)' in results[0][0] - assert results[0][1] == 'warning' + assert 'not available for install' in results[0][0] + assert results[0][1] == 'failed' assert '(2.0)' in results[1][0] assert results[1][1] == 'passed' assert '(3.0)' in results[2][0] assert results[2][1] == 'warning' + assert 'not available for install' in results[3][0] + assert results[3][1] == 'failed' + assert '(4.0)' in results[4][0] + assert results[4][1] == 'passed' @patch('plinth.package.packages_installed')