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

Reply via email to