r410 - in branches/rewrite: . src

Otavio Salvador partial-mirror-devel@lists.alioth.debian.org
Wed, 15 Dec 2004 12:27:48 -0700


Author: otavio
Date: Wed Dec 15 12:27:47 2004
New Revision: 410

Modified:
   branches/rewrite/   (props changed)
   branches/rewrite/src/PackageList.py
Log:
 r572@nurf:  otavio | 2004-12-15T19:26:02.273632Z
 Change resolveDepends to call _satisfyPackage function;
 Add _satisfyPackage based on 'sto' recursive function but reduze the needed list to only control loops;
 Add resolveSuggests and resolveRecommends methods;


Modified: branches/rewrite/src/PackageList.py
==============================================================================
--- branches/rewrite/src/PackageList.py	(original)
+++ branches/rewrite/src/PackageList.py	Wed Dec 15 12:27:47 2004
@@ -123,53 +123,62 @@
                 self._provides[p].remove(package)
 
 
-    def _resolveDepends(self, plist, pkglist):
-        newdeps = []
-        for p in plist:
-            for field in ('Depends', 'Pre-Depends'):
-                if p.has_key(field):
-                    for dependencies in p[field]:
-                        for pkg, ver, oper in dependencies:
-                            # We already have it included
-                            if pkg in self:
-                                break
-
-                            # We have it on full list
-                            # TODO: Add version cheking
-                            if pkg in pkglist:
-                                if pkg not in newdeps:
-                                    newdeps.append(pkglist[pkg])
-                                break
-
-                            # When a package is not found, we should look
-                            # if it's not a virtual package
-                            found = False
-                            if pkglist._provides.has_key(pkg):
-                                for vpkg in pkglist._provides[pkg]:
-                                    if vpkg['Package'] in self or vpkg['Package'] in newdeps:
-                                        found = True
-                                        break
-                                else:
-                                    if pkglist._provides[pkg][0] not in newdeps:
-                                        newdeps.append(pkglist._provides[pkg][0])
-                                    found = True
-                                    break
-                                if found:
-                                    break
+    def _satisfyPackage(self, package, field, pkglist, checkingTree = []):
+        if package.has_key(field):
+            # Handle ciclical depends
+            if package in checkingTree:
+                return True
+            checkingTree.append(package)
+
+            for dependencies in package[field]:
+                for pkgname, version, operation in dependencies:
+                    # We already have it included
+                    if pkgname in self:
+                        break
+
+                    # We have it on full list
+                    # TODO: Add version cheking
+                    if pkgname in pkglist and pkgname not in self:
+                        if self._satisfyPackage(pkglist[pkgname], field, pkglist, checkingTree):
+                            if pkgname not in self:
+                                self.add(pkglist[pkgname])
+                            return True
+
+                    # When a package is not found, we should look
+                    # if it's not a virtual package
+                    if pkglist._provides.has_key(pkgname):
+                        for virtual_pkg in pkglist._provides[pkgname]:
+                            if virtual_pkg['Package'] in self:
+                                return True
                         else:
-                            print pkg, "unavailable. Your mirror could be broken seriously."
-        return newdeps
+                            virtual_pkg = pkglist._provides[pkgname][0] 
+                            if self._satisfyPackage(virtual_pkg, field, pkglist, checkingTree):
+                                if virtual_pkg['Package'] not in self:
+                                    self.add(virtual_pkg)
+                                return True
+                else:
+                    print pkgname, "unavailable. Your mirror could be broken seriously."
+                    return False
+
+            # Remove referrer
+            checkingTree.remove(package)
+
+        return True
 
     def resolveDepends(self, pkglist):
-        deplist = self._resolveDepends(self.values(), pkglist)
-        while len(deplist) > 0:
-            for p in deplist:
-                try:
-                    self.add(p)
-                except PackageAlreadyExists:
-                    pass
-            deplist = self._resolveDepends(deplist, pkglist)
-    
+        for p in self.values():
+            for field in ('Depends', 'Pre-Depends'):
+                self._satisfyPackage(p, field, pkglist)
+            
+
+    def resolveSuggests(self, pkglist):
+        for p in self.values():
+            self._satisfyPackage(p, 'Suggests', pkglist)
+            
+    def resolveRecommends(self, pkglist):
+        for p in self.values():
+            self._satisfyPackage(p, 'Recommends', pkglist)
+            
     def filter(self, condition):
         packages = PackageList()