diff --git a/yum/depsolve.py b/yum/depsolve.py index d8e3ecc6..046623d1 100644 --- a/yum/depsolve.py +++ b/yum/depsolve.py @@ -1436,6 +1436,14 @@ class Depsolve(object): return False return x.sourcerpm == y.sourcerpm + def _conflict_req(x, y): + if y is None: + return False + for ydep in y.conflicts: + if x.checkPrco('provides', ydep): + return True + return False + def _compare_arch_distance(x, y, req_compare_arch): # take X and Y package objects # determine which has a closer archdistance to compare_arch @@ -1488,15 +1496,9 @@ class Depsolve(object): continue unique_nevra_pkgs[pkg.pkgtup] = pkg pkgs = unique_nevra_pkgs.values() - - # Do a conflict filtering; get rid of those pkgs that reqpo conflicts - # with - if reqpo is not None: - pkgs = [pkg for pkg in pkgs - if not any(pkg.checkPrco('provides', conflict) - for conflict in reqpo.conflicts)] pkgresults = {} + penalize = set() for pkg in pkgs: pkgresults[pkg] = 0 @@ -1602,6 +1604,10 @@ class Depsolve(object): self.verbose_logger.log(logginglevels.DEBUG_4, _('common sourcerpm %s and %s' % (po, reqpo))) pkgresults[po] += 20 + if _conflict_req(po, reqpo): + self.verbose_logger.log(logginglevels.DEBUG_4, + _('conflict req %s and %s' % (po, reqpo))) + penalize.add(po) if self.isPackageInstalled(po.base_package_name): self.verbose_logger.log(logginglevels.DEBUG_4, _('base package %s is installed for %s' % (po.base_package_name, po))) @@ -1686,6 +1692,13 @@ class Depsolve(object): pkgresults[po] += 1000 pkgresults[po] += (len(po.name)*-1) + # Bump down any packages that we identified as "last-resort" in such a + # way that they all score below the worst overall score whilst keeping + # their relative differences. + shift = max(pkgresults.values()) - min(pkgresults.values()) + 1 + for po in penalize: + pkgresults[po] -= shift + bestorder = sorted(pkgresults.items(), key=lambda x: (x[1], x[0]), reverse=True) self.verbose_logger.log(logginglevels.DEBUG_4,