packages_tree: exact match trumps other providers

Ubuntu frequently has multiple providers for the same package name,
e.g. "vim" is provided by "vim", "vim-gnome" etc.

We need to adjust the resolving algorithm to:
1. lookup in virtual packages
2. lookup in packages
3. lookup in obsoletes.
Use the package which was found last (version-sorted).

Closes-bug: 1656888

Change-Id: I7279aa6526ff9133829be2e316932c9b052c7814
Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
This commit is contained in:
Alexandru Avadanii 2017-01-15 00:40:15 +01:00
parent 3021c00156
commit 25b8673f84
1 changed files with 17 additions and 11 deletions

View File

@ -68,25 +68,31 @@ class PackagesTree(object):
:param version_range: the range of versions.
:return: the list of suitable packages
"""
candidates = set()
# find package by name
if name in self.packages:
candidates.update(self.packages.find_all(name, version_range))
candidates = []
# find package by provides
# in case of rpm:
# set(candidates) >= set(provides)
if name in self.provides:
candidates.update(self._resolve_relation(
self.provides[name], version_range)
)
candidates.extend(sorted(
self._resolve_relation(self.provides[name], version_range),
key=lambda x: x.version
))
# find package by name
if name in self.packages:
candidates.extend(sorted(
self.packages.find_all(name, version_range),
key=lambda x: x.version
))
if name in self.obsoletes:
candidates.update(self._resolve_relation(
self.obsoletes[name], version_range)
)
candidates.extend(sorted(
self._resolve_relation(self.obsoletes[name], version_range),
key=lambda x: x.version
))
return sorted(candidates, key=lambda x: x.version)
return candidates
def get_unresolved_dependencies(self):
"""Gets the set of unresolved dependencies.