[Yum-devel] [PATCH 1/2] Change tsInfo.setDatabases() so we don't have to setup the pkgSack.

James Antill james at and.org
Tue Feb 21 18:43:21 UTC 2012


---
 yum/__init__.py        |    4 ++--
 yum/depsolve.py        |    7 +++++--
 yum/transactioninfo.py |   24 ++++++++++++++++++++----
 3 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/yum/__init__.py b/yum/__init__.py
index 9e18874..f03d65a 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1126,7 +1126,7 @@ class YumBase(depsolve.Depsolve):
             # If transaction was changed by postresolve plugins then we should run skipbroken again
             (rescode, restring) = self._doSkipBroken(rescode, restring, clear_skipped=False )
 
-        if self.tsInfo.pkgSack is not None: # rm Transactions don't have pkgSack
+        if self.tsInfo._pkgSack is not None: # Transactions have pkgSack?
             self.tsInfo.pkgSack.dropCachedData()
 
         # FIXME: This is horrible, see below and yummain. Maybe create a real
@@ -5952,7 +5952,7 @@ class YumBase(depsolve.Depsolve):
         
         msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0]
         msg += "%s\n" % self.ts.getTsFlags()
-        if self.tsInfo.pkgSack is None: # rm Transactions don't have pkgSack
+        if self.tsInfo._pkgSack is None: # Transactions have pkgSack?
             msg += "0\n"
         else:
             msg += "%s\n" % len(self.repos.listEnabled())
diff --git a/yum/depsolve.py b/yum/depsolve.py
index a8f9acb..d74e22b 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -110,9 +110,12 @@ class Depsolve(object):
             self._tsInfo = self._transactionDataFactory()
             if remove_only:
                 pkgSack = None
+                pkgSackCtor = None
             else:
-                pkgSack = self.pkgSack
-            self._tsInfo.setDatabases(self.rpmdb, pkgSack)
+                # Don't instant setup, or things like localinstall are screwed.
+                pkgSack = None
+                pkgSackCtor = self._getSacks
+            self._tsInfo.setDatabases(self.rpmdb, pkgSack, pkgSackCtor)
             self._tsInfo.installonlypkgs = self.conf.installonlypkgs # this kinda sucks
             # this REALLY sucks, sadly (needed for group conditionals)
             self._tsInfo.install_method = self.install
diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py
index 4d89d83..97de8f0 100644
--- a/yum/transactioninfo.py
+++ b/yum/transactioninfo.py
@@ -87,7 +87,8 @@ class TransactionData:
         self.conditionals = {} # key = pkgname, val = list of pos to add
 
         self.rpmdb = None
-        self.pkgSack = None
+        self._pkgSack = None
+        self._pkgSackCtor = None
         self.pkgSackPackages = 0
         self.localSack = PackageSack()
         self._inSack = GetProvReqOnlyPackageSack()
@@ -115,6 +116,18 @@ class TransactionData:
         else:
             return iter(self.getMembers())
 
+    def _getPkgSack(self):
+        if self._pkgSack is not None:
+            return self._pkgSack
+        if self._pkgSackCtor is not None:
+            self._pkgSack = self._pkgSackCtor()
+        return self._pkgSack
+
+    pkgSack = property(fget=lambda self: self._getPkgSack(),
+                       fset=lambda self, value: setattr(self, "_pkgSack",value),
+                       fdel=lambda self: setattr(self, "_pkgSack", None),
+                       doc="Package sack object")
+
     def debugprint(self, msg):
         if self.debug:
             print msg
@@ -208,7 +221,9 @@ class TransactionData:
                 txmbrs = self.matchNaevr(na[0], na[1])
 
         if not txmbrs:
-            if self.pkgSack is None:
+            if self._inSack is not None:
+                pkgs = self._inSack.returnPackages(patterns=[pattern])
+            elif self.pkgSack is None:
                 pkgs = []
             else:
                 pkgs = self.pkgSack.returnPackages(patterns=[pattern])
@@ -547,9 +562,10 @@ class TransactionData:
         return txmbr
 
 
-    def setDatabases(self, rpmdb, pkgSack):
+    def setDatabases(self, rpmdb, pkgSack, pkgSackCtor=None):
         self.rpmdb = rpmdb
-        self.pkgSack = pkgSack
+        self._pkgSack     = pkgSack
+        self._pkgSackCtor = pkgSackCtor
 
     def getNewProvides(self, name, flag=None, version=(None, None, None)):
         """return dict { packages -> list of matching provides }
-- 
1.7.6.5



More information about the Yum-devel mailing list