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()