From 25b8673f84946b1072605137a4a1f60c89586489 Mon Sep 17 00:00:00 2001 From: Alexandru Avadanii Date: Sun, 15 Jan 2017 00:40:15 +0100 Subject: [PATCH] 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 --- packetary/objects/packages_tree.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/packetary/objects/packages_tree.py b/packetary/objects/packages_tree.py index f02df59..0f6f045 100644 --- a/packetary/objects/packages_tree.py +++ b/packetary/objects/packages_tree.py @@ -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.