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/yum/__init__.py b/yum/__init__.py index 8489562..1382833 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,7 +593,9 @@ 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 + #print "\n".join(["TS: %s" % str(tx) for tx in self.tsInfo]) depTree = self._buildDepTree() + #self._dumpDepTree(depTree) count = 0 while len(self.po_with_problems) > 0 and rescode == 1: count += 1 @@ -627,34 +629,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) return depTree - + 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, [])) + toRemove.add(po) + for txmbr in self.tsInfo.getMembers(po.pkgtup): + for pkg in (txmbr.updates + txmbr.obsoletes): + print "REMOVE", repr(pkg) + toRemove.add(pkg) + self._getDepsToRemove(pkg, deptree, toRemove) + self._getDepsToRemove(po, deptree, toRemove) + + #print "TOREMOVE : (%s)" % ','.join([str(p) for p in toRemove]) return toRemove + def _getDepsToRemove(self,po, deptree, toRemove): + #print "CHECK : ",str(po) + print po, deptree.get(po, []), deptree + 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"""