[Yum-devel] [PATCH 5/9] Add tsInfo.futureRpmDBVersion, so we can do better quality rpmdb caching

James Antill james at and.org
Sun Nov 8 20:26:39 UTC 2009


---
 yum/transactioninfo.py |   39 ++++++++++++++++++++++++++++++++++++++-
 1 files changed, 38 insertions(+), 1 deletions(-)

diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py
index c2fc804..c7d5b8c 100644
--- a/yum/transactioninfo.py
+++ b/yum/transactioninfo.py
@@ -26,7 +26,7 @@ to rpm.
 """
 
 from constants import *
-from packageSack import PackageSack
+from packageSack import PackageSack, PackageSackVersion
 from packages import YumInstalledPackage
 from sqlitesack import YumAvailablePackageSqlite
 import Errors
@@ -558,6 +558,42 @@ class TransactionData:
         result.update(self.getNewRequires(name, flag, version))
         return result
 
+    def futureRpmDBVersion(self):
+        """ Return a simple version for the future rpmdb. Works like
+            rpmdb.simpleVersion(main_only=True)[0], but for the state the rpmdb
+            will be in after the transaction. """
+        pkgs = self.rpmdb.returnPackages()
+        _reinstalled_pkgtups = {}
+        for txmbr in self.getMembersWithState(None, TS_INSTALL_STATES):
+            # reinstalls have to use their "new" checksum data, in case it's
+            # different.
+            if hasattr(txmbr, 'reinstall') and txmbr.reinstall:
+                _reinstalled_pkgtups[txmbr.po.pkgtup] = txmbr.po
+            pkgs.append(txmbr.po)
+
+        main = PackageSackVersion()
+        for pkg in sorted(pkgs):
+            if pkg.repoid != 'installed':
+                # Paste from PackageSackBase.simpleVersion()
+                csum = pkg.returnIdSum()
+                main.update(pkg, csum)
+                continue
+
+            # Installed pkg, see if it's about to die
+            if self.getMembersWithState(pkg.pkgtup, TS_REMOVE_STATES):
+                continue
+            # ...or die and be risen again (Zombie!)
+            if pkg.pkgtup in _reinstalled_pkgtups:
+                continue
+
+            # Paste from rpmdb.simpleVersion()
+            ydbi = pkg.yumdb_info
+            csum = None
+            if 'checksum_type' in ydbi and 'checksum_data' in ydbi:
+                csum = (ydbi.checksum_type, ydbi.checksum_data)
+            main.update(pkg, csum)
+        return main
+
 class ConditionalTransactionData(TransactionData):
     """A transaction data implementing conditional package addition"""
     def __init__(self):
@@ -615,6 +651,7 @@ class SortableTransactionData(TransactionData):
         self._sorted.reverse()
         return self._sorted
 
+
 class TransactionMember:
     """Class to describe a Transaction Member (a pkg to be installed/
        updated/erased)."""
-- 
1.6.2.5



More information about the Yum-devel mailing list