diff --git a/cli.py b/cli.py index 6a9385b..57f473e 100644 --- a/cli.py +++ b/cli.py @@ -104,8 +104,8 @@ class YumBaseCli(yum.YumBase, output.YumOutput): and sets up the basics of the repository""" if self._repos and thisrepo is None: - self.verbose_logger.log(yum.logginglevels.DEBUG_4, - 'skipping reposetup, pkgsack exists') + # self.verbose_logger.log(yum.logginglevels.DEBUG_4, + # 'skipping reposetup, pkgsack exists') return self._repos if not thisrepo: diff --git a/test/skipbroken-tests.py b/test/skipbroken-tests.py index b1ddd40..b8bf268 100644 --- a/test/skipbroken-tests.py +++ b/test/skipbroken-tests.py @@ -239,8 +239,8 @@ class SkipBrokenTests(DepsolveTests): self.tsInfo.addInstall(ipo) - self.assertEquals('empty', *self.resolveCode(skip=True)) - self.assertResult([]) + self.assertEquals('ok', *self.resolveCode(skip=True)) + self.assertResult([ipo, provides2]) def testOnlyOneRequirementAvailable(self): ipo = self.repoPackage('foo') diff --git a/yum/__init__.py b/yum/__init__.py index 8489562..be32f4a 100644 --- a/yum/__init__.py +++ b/yum/__init__.py @@ -363,8 +363,8 @@ class YumBase(depsolve.Depsolve): takes optional archlist for archs to include""" if self._pkgSack and thisrepo is None: - self.verbose_logger.log(logginglevels.DEBUG_4, - 'skipping reposetup, pkgsack exists') + # self.verbose_logger.log(logginglevels.DEBUG_4, + # 'skipping reposetup, pkgsack exists') return self._pkgSack if thisrepo is None: @@ -593,28 +593,32 @@ class YumBase(depsolve.Depsolve): ''' Remove the packages with depsolve errors and depsolve again ''' # Keep removing packages & Depsolve until all errors is gone # or the transaction is empty - depTree = self._buildDepTree() + #print "\n".join(["TS: %s" % str(tx) for tx in self.tsInfo]) count = 0 while len(self.po_with_problems) > 0 and rescode == 1: count += 1 + self.verbose_logger.debug("Skip-broken round %i", count) + depTree = self._buildDepTree() startTs = set(self.tsInfo) toRemove = set() for po,wpo in self.po_with_problems: # check if the problem is caused by a package in the transaction if not self.tsInfo.exists(po.pkgtup): if wpo: - toRemove = self._getPackagesToRemove(wpo, depTree, toRemove) + self._getPackagesToRemove(wpo, depTree, toRemove) + if not wpo.repoid == 'installed': # Only remove non installed packages from pkgSack + self.pkgSack.delPackage(wpo) else: continue else: - toRemove = self._getPackagesToRemove(po, depTree, toRemove) + self._getPackagesToRemove(po, depTree, toRemove) + if not po.repoid == 'installed': # Only remove non installed packages from pkgSack + self.pkgSack.delPackage(po) if toRemove: for po in toRemove: if self.tsInfo.exists(po.pkgtup): self.tsInfo.remove(po.pkgtup) - if not po.repoid == 'installed': # Only remove non installed packages from pkgSack - self.verbose_logger.info("skipping %s from %s because of depsolving problems" % (str(po),po.repoid)) - self.pkgSack.delPackage(po) + self.verbose_logger.info("skipping %s from %s because of depsolving problems" % (str(po),po.repoid)) else: # Nothing was removed, so we still got a problem break # Bail out rescode, restring = self.resolveDeps() @@ -627,33 +631,36 @@ class YumBase(depsolve.Depsolve): return rescode, restring def _buildDepTree(self): - ''' create a dictionary with po -> deps and dep -> pos references ''' - depTree = {} + ''' create a dictionary with po and deps and deps and reqs references ''' + depTree = { } for txmbr in self.tsInfo: - if not txmbr.po in depTree: - depTree[txmbr.po] = set() - for po in (txmbr.updates + txmbr.obsoletes): # + txmbr.depends_on): - # Add po -> dep reference - depTree[txmbr.po].add(po) - if not po in depTree: - depTree[po] = set() - # Add dep -> reference - depTree[po].add(txmbr.po) - + for dep in txmbr.depends_on: + depTree.setdefault(dep, []).append(txmbr.po) + # self._printDepTree(depTree) return depTree - + + def _printDepTree(self, tree): + for pkg, l in tree.iteritems(): + print pkg + for p in l: + print "\t", p + def _getPackagesToRemove(self,po,deptree,toRemove): ''' walk trough the po->deps, dep->po's reference tree too get the related po to remove. ''' - stack = [ po ] - while stack: - po = stack.pop() - if po not in toRemove: - toRemove.add(po) - stack.extend(deptree.get(po, [])) - return toRemove + toRemove.add(po) + for txmbr in self.tsInfo.getMembers(po.pkgtup): + for pkg in (txmbr.updates + txmbr.obsoletes): + toRemove.add(pkg) + self._getDepsToRemove(pkg, deptree, toRemove) + self._getDepsToRemove(po, deptree, toRemove) + + def _getDepsToRemove(self,po, deptree, toRemove): + for dep in deptree.get(po, []): # Loop trough all deps of po + toRemove.add(dep) + self._getDepsToRemove(dep, deptree, toRemove) def runTransaction(self, cb): """takes an rpm callback object, performs the transaction"""