[yum-cvs] yum/yum transactioninfo.py,1.28,1.29

Paul Nasrat pnasrat at linux.duke.edu
Tue Jan 31 22:55:28 UTC 2006


Update of /home/groups/yum/cvs/yum/yum
In directory login1.linux.duke.edu:/tmp/cvs-serv11531

Modified Files:
	transactioninfo.py 
Log Message:
Add sortable transaction class

Index: transactioninfo.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/transactioninfo.py,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- transactioninfo.py	26 Jan 2006 23:03:51 -0000	1.28
+++ transactioninfo.py	31 Jan 2006 22:55:26 -0000	1.29
@@ -289,6 +289,58 @@
         self.add(txmbr)
         return txmbr
 
+class SortableTransactionData(TransactionData):
+    """A transaction data implementing topological sort on it's members"""
+    def __init__(self):
+        # Cache of sort
+        self._sorted = []
+        # Current dependency path
+        self.path = []
+        # List of loops
+        self.loops = []
+        # Only resort if transaction data changed
+        self.changed = True
+        TransactionData.__init__(self)
+
+    def _visit(self, txmbr):
+        self.path.append(txmbr.name)
+        txmbr.sortColour = TX_GREY
+        for po in txmbr.depends_on:
+            vertex = self.getMembers(pkgtup=po.pkgtup)[0]
+            if vertex.sortColour == TX_GREY:
+                self._doLoop(vertex.name)
+            if vertex.sortColour == TX_WHITE:
+                self._visit(vertex)
+        txmbr.sortColour = TX_BLACK
+        self._sorted.insert(0, txmbr.pkgtup)
+
+    def _doLoop(self, name):
+        self.path.append(name)
+        loop = self.path[self.path.index(self.path[-1]):]
+        if len(loop) > 2:
+            self.loops.append(loop)
+
+    def add(self, txmember):
+        txmember.sortColour = TX_WHITE
+        TransactionData.add(self, txmember)
+        self.changed = True
+
+    def remove(self, pkgtup):
+        TransactionData.remove(self, pkgtup)
+        self.changed = True
+
+    def sort(self):
+        if self._sorted and not self.changed:
+            return self._sorted
+        self._sorted = []
+        self.changed = False
+        # loop over all members
+        for txmbr in self.getMembers():
+            if txmbr.sortColour == TX_WHITE:
+                self.path = [ ]
+                self._visit(txmbr)
+        self._sorted.reverse()
+        return self._sorted
 
 class TransactionMember:
     """Class to describe a Transaction Member (a pkg to be installed/




More information about the Yum-cvs-commits mailing list