aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlistair Bush <ali_bush@gentoo.org>2009-10-11 07:10:45 +0000
committerAlistair Bush <ali_bush@gentoo.org>2009-10-11 07:10:45 +0000
commit732d9cb0623c85a9c21a95594ca9b2408cebb5c7 (patch)
tree7233a3475ab9f8aeab840cd6fdcb1191ebac02b1
parentPossible fix for #161622. Doesn't inspect complete tree yet, only immediate d... (diff)
downloadjava-config-732d9cb0623c85a9c21a95594ca9b2408cebb5c7.tar.gz
java-config-732d9cb0623c85a9c21a95594ca9b2408cebb5c7.tar.bz2
java-config-732d9cb0623c85a9c21a95594ca9b2408cebb5c7.zip
Parse whole dep tree for #161622.
svn path=/projects/java-config-2/trunk/; revision=7930
-rw-r--r--src/java_config_2/VersionManager.py72
1 files changed, 63 insertions, 9 deletions
diff --git a/src/java_config_2/VersionManager.py b/src/java_config_2/VersionManager.py
index 8657c17..77c6f47 100644
--- a/src/java_config_2/VersionManager.py
+++ b/src/java_config_2/VersionManager.py
@@ -45,20 +45,20 @@ class VersionManager:
def parse_depend(self, atoms):
"""Filter the dependency string for useful information"""
- highest_pkg_target = self.get_target_from_pkg_deps(self.parse_depend_packages(atoms))
+ pkg_name, highest_pkg_target = self.get_target_from_pkg_deps(self.parse_depend_packages(atoms))
matched_atoms = []
atoms = self.filter_depend(atoms)
matches = self.atom_parser.findall(atoms)
-
+
if len(matches) > 0:
for match in matches:
- #if highest_pkg_target:
- # print self.version_cmp(match[2], highest_pkg_target)
-
if highest_pkg_target and self.version_cmp(match[2], highest_pkg_target) < 0:
continue
matched_atoms.append({'equality':match[0], 'type':match[1], 'version':match[2]})
+ if len(matched_atoms) == 0 and pkg_name and highest_pkg_target:
+ raise Exception("Couldn't find a suitable VM due to dependency %s having a required target of %s" % pkg_name, highest_pkg_target)
+
matched_atoms.sort()
matched_atoms.reverse()
@@ -159,11 +159,13 @@ class VersionManager:
raise Exception("Couldn't find a VM dep")
def get_target_from_pkg_deps(self, matches):
- """ Get the lowest virtual machine version from a packages dependencies.
- Currently doesn't walk the tree, just looks at immediate children. """
+ """ Get the lowest virtual machine version from a packages dependencies."""
from java_config_2.EnvironmentManager import EnvironmentManager
manager = EnvironmentManager()
highest = None
+ pkg_name = None
+
+ pkgs=[]
for match in matches:
pkg_name = match['pkg']
@@ -171,14 +173,26 @@ class VersionManager:
pkg_name += '-' + match['slot']
try:
pkg = manager.get_package(pkg_name)
+ pkgs.append(pkg)
+ except Exception, e:
+ pass
+
+ deep_pkgs = get_needed_packages(*pkgs)
+
+ for pkg in deep_pkgs:
+ try:
target = pkg.target()
if not highest:
highest = target
+ pkg_name = pkg.name()
+ continue
if self.version_cmp(highest, target) < 0:
highest = atom
- except Exception, e:
+ pkg_name = pkg.name()
+ except:
pass
- return highest
+
+ return pkg_name, highest
def get_vm(self, atoms, allow_build_only = False):
from java_config_2.EnvironmentManager import EnvironmentManager
@@ -270,6 +284,46 @@ class VersionManager:
return ret
return 0
+
+def get_needed_packages(*packages):
+ from java_config_2.EnvironmentManager import EnvironmentManager
+
+ manager = EnvironmentManager()
+
+ unresolved = set()
+ for package in packages:
+ unresolved.add(package)
+
+ resolved = set()
+
+ while len(unresolved) > 0:
+ pkg = unresolved.pop()
+ resolved.add(pkg)
+ # dep is in the form of (jar, pkg)
+ for dep in manager.get_pkg_deps(pkg):
+ dep_pkg = dep[-1]
+ p = manager.get_package(dep_pkg)
+ if p is None:
+ if ',' in dep_pkg:
+ msg = """
+Package %s has a broken DEPEND entry in package.env. Please reinstall it.
+If this does not fix it, please report this to http://bugs.gentoo.org
+"""
+ msg = msg % pkg
+ else:
+ msg = """
+Package %s not found in the system. This package is listed as a
+dependency of %s. Please run emerge -1Da %s and if it does not bring in the
+needed dependency, report this to http://bugs.gentoo.org.
+"""
+ msg = msg % (dep_pkg,pkg,pkg)
+ abort(msg)
+
+ if p not in resolved:
+ unresolved.add(p)
+
+ return resolved
+
#vator=VersionManager()
#for i in [
# ">=virtual/jdk-1.3",