[yum-git] yum/depsolve.py yum/transactioninfo.py

Florian Festi ffesti at linux.duke.edu
Thu Feb 14 17:16:55 UTC 2008


 yum/depsolve.py        |   25 +++++--------------------
 yum/transactioninfo.py |   45 ++++++++++++++++++++++-----------------------
 2 files changed, 27 insertions(+), 43 deletions(-)

New commits:
commit f3b6cca8c4a0f7edebc1409445efc895840d5eb7
Author: Florian Festi <ffesti at redhat.com>
Date:   Wed Nov 28 17:33:25 2007 +0100

    Add tsInfo.getUnresolvedMembers() and use if for depsolving
    Drop tsInfo.removedmembers and DepCheck.already_seen*

diff --git a/yum/depsolve.py b/yum/depsolve.py
index 76a50a8..735fddd 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -639,13 +639,9 @@ class Depsolve(object):
         # holder object for things from the check
         if not hasattr(self, '_dcobj'):
             self._dcobj = DepCheck()
-        else:
-            # reset what we've seen as things may have changed between calls
-            # to resolveDeps (rh#242368, rh#308321)
-            self._dcobj.reset()
         self.po_with_problems = set()
         self._working_po = None
-        self.tsInfo.removedmembers.clear()
+        self.tsInfo.resetResolved(hard=False)
 
         CheckDeps = True
         CheckRemoves = False
@@ -730,10 +726,7 @@ class Depsolve(object):
         CheckRemoves = False
         # we need to check the opposite of install and remove for regular
         # tsInfo members vs removed members
-        for (txmbr, inst, rem) in map(lambda x: (x, TS_INSTALL_STATES, TS_REMOVE_STATES), self.tsInfo.getMembers()) + map(lambda x: (x, TS_REMOVE_STATES, TS_INSTALL_STATES), self.tsInfo.getRemovedMembers()):
-            if (self._dcobj.already_seen_removed.has_key(txmbr) or
-                (txmbr.ts_state is not None and self._dcobj.already_seen.has_key(txmbr))):
-                continue
+        for txmbr in self.tsInfo.getUnresolvedMembers():
 
             if self.dsCallback and txmbr.ts_state:
                 self.dsCallback.pkgAdded(txmbr.pkgtup, txmbr.ts_state)
@@ -749,10 +742,10 @@ class Depsolve(object):
             else:
                 self._working_po = txmbr.po
            
-            if txmbr.output_state in inst:
+            if (txmbr.output_state in TS_INSTALL_STATES) == (txmbr.po.state != None):
                 thisneeds = self._checkInstall(txmbr)
                 CheckInstalls = True
-            elif txmbr.output_state in rem:
+            else:
                 thisneeds = self._checkRemove(txmbr)
                 CheckRemoves = True
 
@@ -764,10 +757,7 @@ class Depsolve(object):
                 missing_in_pkg |= missing
 
             if not missing_in_pkg:
-                if txmbr.ts_state is None:
-                    self._dcobj.already_seen_removed[txmbr] = 1
-                else:
-                    self._dcobj.already_seen[txmbr] = 1
+                self.tsInfo.markAsResolved(txmbr)
 
             any_missing |= missing_in_pkg
 
@@ -941,11 +931,6 @@ class DepCheck(object):
     def __init__(self):
         self.requires = []
         self.conflicts = []
-        self.reset()
-
-    def reset(self):
-        self.already_seen = {}
-        self.already_seen_removed = {}
 
     def addRequires(self, po, req_tuple_list):
         # fixme - do checking for duplicates or additions in here to zip things along
diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py
index c899abc..58a5e5e 100644
--- a/yum/transactioninfo.py
+++ b/yum/transactioninfo.py
@@ -41,7 +41,7 @@ class TransactionData:
         self.root = '/'
         self.pkgdict = {} # key = pkgtup, val = list of TransactionMember obj
         self._namedict = {} # name -> list of TransactionMember obj
-        self.removedmembers = {}
+        self._unresolvedMembers = set()
         self.debug = 0
         self.changed = False
         self.installonlypkgs = []
@@ -94,20 +94,18 @@ class TransactionData:
             returnlist.extend(self.pkgdict[pkgtup])
         return returnlist
             
-    def getRemovedMembers(self, pkgtup=None):
-        """takes an optional package tuple and returns all transaction members
-           matching, no pkgtup means it returns all transaction members"""
-
-        returnlist = []
+    def getUnresolvedMembers(self):
+        return list(self._unresolvedMembers)
 
-        if pkgtup is None:
-            for members in self.removedmembers.itervalues():
-                returnlist.extend(members)
-        elif self.removedmembers.has_key(pkgtup):
-            returnlist.extend(self.removedmembers[pkgtup])
-
-        return returnlist
+    def markAsResolved(self, txmbr):
+        self._unresolvedMembers.discard(txmbr)
 
+    def resetResolved(self, hard=False):
+        if hard or len(self) < len(self._unresolvedMembers):
+            self._unresolvedMembers.clear()
+            self._unresolvedMembers.update(self.getMembers())
+            return True
+        return False
 
     def getMode(self, name=None, arch=None, epoch=None, ver=None, rel=None):
         """returns the mode of the first match from the transaction set, 
@@ -198,7 +196,7 @@ class TransactionData:
             for po in self.conditionals[txmember.name]:
                 condtxmbr = self.addInstall(po)
                 condtxmbr.setAsDep(po=txmember.po)
-        
+        self._unresolvedMembers.add(txmember)
 
     def remove(self, pkgtup):
         """remove a package from the transaction"""
@@ -212,8 +210,8 @@ class TransactionData:
             elif isinstance(txmbr.po, YumAvailablePackageSqlite):
                 self.pkgSackPackages -= 1
             self._namedict[txmbr.name].remove(txmbr)
+            self._unresolvedMembers.add(txmbr)
         
-        self.removedmembers.setdefault(pkgtup, []).extend(self.pkgdict[pkgtup])
         del self.pkgdict[pkgtup]
         if not self._namedict[pkgtup[0]]:
             del self._namedict[pkgtup[0]]
@@ -552,15 +550,17 @@ class TransactionMember:
             self.depends_on.append(po)
 
     def __cmp__(self, other):
-        if self.name > other.name:
-            return 1
-        if self.name < other.name:
-            return -1
-        if self.name == other.name:
-            return 0
+        result = cmp(self.name, other.name)
+        if result == 0:
+            result = cmp(hash(self), hash(other))
+            if self is other:
+                return 0
+            if result == 0:
+                return 1
+        return result
 
     def __hash__(self):
-        return hash(self.po.pkgtup)
+        return object.__hash__(self)
             
     def __str__(self):
         return "%s.%s %s-%s-%s - %s" % (self.name, self.arch, self.epoch,
@@ -579,4 +579,3 @@ class TransactionMember:
     # current and output states are defined in constants
     # relationships are defined in constants
     # ts states are: u, i, e
-    



More information about the Yum-cvs-commits mailing list