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 <jvalleroy@mailbox.org>
This commit is contained in:
James Valleroy 2022-03-13 08:15:36 -04:00
parent 45820fbdfa
commit 691817477f
No known key found for this signature in database
GPG Key ID: 77C0C75E7B650808
2 changed files with 27 additions and 6 deletions

View File

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

View File

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