Florian Festi wrote:
FYI: I moved the searches on the transaction to the
transactioninfo.TransactionData class where they look much better now.
There also are .getNewProvides/Requires(), .getOldProvides/Requires()
methods with are useful at some places in the depsolver. LocalInstall
pkgs will also be handled within the TransactionData which will keep
them in a PackageSack for faster searching (will need "Dynamic Indexes"
patch).
Patch will follow as soon as I have divided the changes to
transactioninfo into 3 different patches. (getProvides, removedmembers,
.depends_on->sets)
Here is the part that matters for this topic. The .depends_on->sets is
already posted to the list. Will back port the removedmembers part soon as
it might be of interest for the 3.2.1 release.
I am still a bit unsure about the "right" (tm) way of detecting local
install packages as SqliteSack can take any class to build its POs from.
Can anyone comment on that?
Florian Festi
Index: yum/transactioninfo.py
===================================================================
RCS file: /cvsroot/yum/cvs/yum/yum/transactioninfo.py,v
retrieving revision 1.41
diff -u -r1.41 transactioninfo.py
--- yum/transactioninfo.py 6 Jun 2007 15:18:55 -0000 1.41
+++ yum/transactioninfo.py 14 Jun 2007 10:07:22 -0000
@@ -21,7 +21,7 @@
# with the given txmbr.
from constants import *
-from packageSack import ListPackageSack
+from packageSack import ListPackageSack, PackageSack
import Errors
import warnings
@@ -38,6 +38,10 @@
self.conditionals = {} # key = pkgname, val = list of pos to add
+ self.rpmdb = None
+ self.pkgSack = None
+ self.localSack = PackageSack()
+
# lists of txmbrs in their states - just placeholders
self.instgroups = []
self.removedgroups = []
@@ -144,6 +148,10 @@
self.pkgdict[txmember.pkgtup].append(txmember)
self.changed = True
+ # Is this the right criteria?
+ if not isinstance(txmember.po, (YumInstalledPackage, YumAvailablePackageSqlite)):
+ self.localSack.addPackage(txmember.po)
+
if self.conditionals.has_key(txmember.name):
for po in self.conditionals[txmember.name]:
condtxmbr = self.addInstall(po)
@@ -157,6 +165,9 @@
return
for txmbr in self.pkgdict[pkgtup]:
txmbr.po.state = None
+ # Is this the right criteria?
+ if not isinstance(txmbr.po, (YumInstalledPackage, YumAvailablePackageSqlite)):
+ self.localSack.delPackage(txmbr.po)
del self.pkgdict[pkgtup]
self.changed = True
@@ -337,6 +348,61 @@
return txmbr
+ def setDatabases(self, rpmdb, pkgSack):
+ self.rpmdb = rpmdb
+ self.pkgSack = pkgSack
+
+ def getNewProvides(self, name, flag=None, version=None):
+ """return dict { packages -> list of matching provides }
+ searches in packages to be installed"""
+ result = { }
+ for pkg, hits in self.pkgSack.getProvides(name, flag, version).iteritems():
+ if self.getMembersWithState(pkg.pkgtup, TS_INSTALL_STATES):
+ result[pkg] = hits
+ result.update(self.localSack.getProvides(name, flag, version))
+ return result
+
+ def getOldProvides(self, name, flag=None, version=None):
+ """return dict { packages -> list of matching provides }
+ searches in packages already installed and not going to be removed"""
+ result = { }
+ for pkg, hits in self.rpmdb.getProvides(name, flag, version).iteritems():
+ if not self.getMembersWithState(pkg.pkgtup, TS_REMOVE_STATES):
+ result[pkg] = hits
+ return result
+
+ def getProvides(self, name, flag=None, version=None):
+ """return dict { packages -> list of matching provides }"""
+ result = self.getOldProvides(name, flag, version)
+ result.update(self.getNewProvides(name, flag, version))
+ return result
+
+ def getNewRequires(self, name, flag=None, version=None):
+ """return dict { packages -> list of matching provides }
+ searches in packages to be installed"""
+ result = { }
+ for pkg, hits in self.pkgSack.getRequires(name, flag, version).iteritems():
+ if self.getMembersWithState(pkg.pkgtup, TS_INSTALL_STATES):
+ result[pkg] = hits
+ result.update(self.localSack.getRequires(name, flag, version))
+ return result
+
+
+ def getOldRequires(self, name, flag=None, version=None):
+ """return dict { packages -> list of matching provides }
+ searches in packages already installed and not going to be removed"""
+ result = { }
+ for pkg, hits in self.rpmdb.getRequires(name, flag, version).iteritems():
+ if not self.getMembersWithState(pkg.pkgtup, TS_REMOVE_STATES):
+ result[pkg] = hits
+ return result
+
+ def getRequires(self, name, flag=None, version=None):
+ """return dict { packages -> list of matching provides }"""
+ result = self.getOldRequires(name, flag, version)
+ result.update(self.getNewRequires(name, flag, version))
+ return result
+
class ConditionalTransactionData(TransactionData):
"""A transaction data implementing conditional package addition"""
def __init__(self):
_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel