From 732d9cb0623c85a9c21a95594ca9b2408cebb5c7 Mon Sep 17 00:00:00 2001 From: Alistair Bush Date: Sun, 11 Oct 2009 07:10:45 +0000 Subject: Parse whole dep tree for #161622. svn path=/projects/java-config-2/trunk/; revision=7930 --- src/java_config_2/VersionManager.py | 72 ++++++++++++++++++++++++++++++++----- 1 file 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", -- cgit v1.2.3-65-gdbad