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. :param version_range: the range of versions.
:return: the list of suitable packages :return: the list of suitable packages
""" """
candidates = set() candidates = []
# find package by name
if name in self.packages:
candidates.update(self.packages.find_all(name, version_range))
# find package by provides # find package by provides
# in case of rpm: # in case of rpm:
# set(candidates) >= set(provides) # set(candidates) >= set(provides)
if name in self.provides: if name in self.provides:
candidates.update(self._resolve_relation( candidates.extend(sorted(
self.provides[name], version_range) 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: if name in self.obsoletes:
candidates.update(self._resolve_relation( candidates.extend(sorted(
self.obsoletes[name], version_range) 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): def get_unresolved_dependencies(self):
"""Gets the set of unresolved dependencies. """Gets the set of unresolved dependencies.