diff options
author | Alistair Bush <ali_bush@gentoo.org> | 2009-10-11 04:47:35 +0000 |
---|---|---|
committer | Alistair Bush <ali_bush@gentoo.org> | 2009-10-11 04:47:35 +0000 |
commit | 12901d8838cf3044872da07e7456e3ff40c54bb7 (patch) | |
tree | 4080c5ef93b60301c7a65877f85d64f61f3d9fa4 | |
parent | bug fixes (diff) | |
download | java-config-12901d8838cf3044872da07e7456e3ff40c54bb7.tar.gz java-config-12901d8838cf3044872da07e7456e3ff40c54bb7.tar.bz2 java-config-12901d8838cf3044872da07e7456e3ff40c54bb7.zip |
Possible fix for #161622. Doesn't inspect complete tree yet, only immediate dependencies.
svn path=/projects/java-config-2/trunk/; revision=7929
-rw-r--r-- | src/java_config_2/VersionManager.py | 48 | ||||
-rw-r--r-- | src/testsuite/EnvironmentManager.py | 2 | ||||
-rw-r--r-- | src/testsuite/VersionManager.py | 18 | ||||
-rw-r--r-- | src/testsuite/packages/ant-cores5/package.env | 10 | ||||
-rw-r--r-- | src/testsuite/packages/test-package/package.env | 10 |
5 files changed, 83 insertions, 5 deletions
diff --git a/src/java_config_2/VersionManager.py b/src/java_config_2/VersionManager.py index 89ef48c..8657c17 100644 --- a/src/java_config_2/VersionManager.py +++ b/src/java_config_2/VersionManager.py @@ -25,6 +25,7 @@ class VersionManager: """ atom_parser = re.compile(r"([<>=]*)virtual/(jre|jdk)[-:]([0-9\.*]+)") virtuals_parser = re.compile(r"([<>=~]+)?java-virtuals/([\w\-\.:]+)") + package_parser = re.compile(r"([\w\-]+)/([\w\-]+)(?:\:(\d+))?") pref_files = ['/etc/java-config-2/build/jdk.conf', '/usr/share/java-config-2/config/jdk-defaults.conf'] _prefs = None @@ -43,20 +44,40 @@ 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)) 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]}) matched_atoms.sort() matched_atoms.reverse() return matched_atoms + + def parse_depend_packages(self, atoms): + """ Parse atoms for possible packages. This excludes virtual/[jdk|jre] but includes java-virtuals""" + + matched_atoms = [] + atoms = self.filter_depend(atoms) + matches = self.package_parser.findall(atoms) + + if len(matches) > 0: + for match in matches: + if not (match[0] == 'virtual' and (match[1] == 'jdk-1' or match[1] == 'jre-1' or match[1] == 'jdk' or match[1] == 'jre' )): + matched_atoms.append({'equality':'=', 'cat':match[0], 'pkg':match[1], 'slot':match[2]}) + return matched_atoms + def filter_depend( self, atoms ): """Filter the dependency string for useful information""" @@ -137,6 +158,27 @@ class VersionManager: else: 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. """ + from java_config_2.EnvironmentManager import EnvironmentManager + manager = EnvironmentManager() + highest = None + + for match in matches: + pkg_name = match['pkg'] + if match['slot'] and match['slot'] != '0': + pkg_name += '-' + match['slot'] + try: + pkg = manager.get_package(pkg_name) + target = pkg.target() + if not highest: + highest = target + if self.version_cmp(highest, target) < 0: + highest = atom + except Exception, e: + pass + return highest def get_vm(self, atoms, allow_build_only = False): from java_config_2.EnvironmentManager import EnvironmentManager @@ -144,14 +186,14 @@ class VersionManager: matched_atoms = self.parse_depend(atoms) matched_virtuals = self.parse_depend_virtuals(atoms) need_virtual = None - if len(matched_atoms) == 0: - return None + if not len(matched_virtuals) == 0: need_virtual = matched_virtuals prefs = self.get_prefs() # first try to find vm based on preferences low = self.get_lowest(atoms) # Lowest vm version we can use + for atom in matched_atoms: for pref in prefs: if pref[0] == low or pref[0] == "*": # We have a configured preference for this version diff --git a/src/testsuite/EnvironmentManager.py b/src/testsuite/EnvironmentManager.py index 85f0ebc..1c71c2c 100644 --- a/src/testsuite/EnvironmentManager.py +++ b/src/testsuite/EnvironmentManager.py @@ -9,7 +9,7 @@ class TestEnvironmentManager(unittest.TestCase): def test_load_packages(self): em.packages = {} em.load_packages() - self.assertEquals(len(em.packages), 7) + self.assertEquals(len(em.packages), 9) def test_get_package(self): em.get_package('ant-cores') diff --git a/src/testsuite/VersionManager.py b/src/testsuite/VersionManager.py index 99d9630..8c4cb87 100644 --- a/src/testsuite/VersionManager.py +++ b/src/testsuite/VersionManager.py @@ -31,6 +31,8 @@ class TestVersionManager(unittest.TestCase): vm = self.verman.get_vm('virtual/jdk:1.4', True) self.assertTrue(vm.name(), 'blackdown-jdk-1.4.2') + self.assertRaises(Exception, self.verman.get_vm, 'virtual/jdk:1.4 dev-java/test-package:0') + def test_filter_depend_vanilla(self): os.environ["USE"] = "" self.assertEquals(self.verman.filter_depend(self.example_dep_vanilla), self.example_dep_vanilla) @@ -71,7 +73,21 @@ class TestVersionManager(unittest.TestCase): #def test_get_lowest_atom(self): - #def test_get_lowest(self): + def test_get_lowest(self): + target = self.verman.get_lowest(">=virtual/jdk-1.4") + self.assertEquals(target, '1.4') + + target = self.verman.get_lowest(self.example_dep_vanilla) + self.assertEquals(target, '1.5') + + target = self.verman.get_lowest(self.example_dep_or) + self.assertEquals(target, '1.4') + + def test_get_lowest_with_package_dep(self): + # 1.4 dep but ant-cores5 has a 1.8 target. + self.assertRaises(Exception, self.verman.get_lowest, 'virtual/jdk:1.4 dev-java/test-package:0') + # 1.4 but has a 1.5 target package. + self.assertRaises(Exception, self.verman.get_lowest, '>=virtual/jdk-1.4 dev-java/ant-cores5:0') #def test_find_vm(self): diff --git a/src/testsuite/packages/ant-cores5/package.env b/src/testsuite/packages/ant-cores5/package.env new file mode 100644 index 0000000..9b378a9 --- /dev/null +++ b/src/testsuite/packages/ant-cores5/package.env @@ -0,0 +1,10 @@ +DESCRIPTION="Description: ant-cores5" +GENERATION="2" +SLOT="0" +CLASSPATH="/usr/share/ant-core/lib/ant.jar:/usr/share/ant-core/lib/ant-bootstrap.jar:/usr/share/ant-core/lib/ant-launcher.jar" +VM=">=virtual/jdk-1.5" +TARGET="1.5" +SOURCE="1.5" +JAVADOC_PATH="/usr/share/doc/ant-core-1.7.1-r2/html/api" +JAVA_SOURCES="/usr/share/ant-core/sources//ant-core-src.zip" +MERGE_VM="sun-jdk-1.7" diff --git a/src/testsuite/packages/test-package/package.env b/src/testsuite/packages/test-package/package.env new file mode 100644 index 0000000..193c715 --- /dev/null +++ b/src/testsuite/packages/test-package/package.env @@ -0,0 +1,10 @@ +DESCRIPTION="Description: Test Package" +GENERATION="2" +SLOT="0" +CLASSPATH="/usr/share/ant-core/lib/ant.jar:/usr/share/ant-core/lib/ant-bootstrap.jar:/usr/share/ant-core/lib/ant-launcher.jar" +VM=">=virtual/jdk-1.8" +TARGET="1.8" +SOURCE="1.8" +JAVADOC_PATH="/usr/share/doc/ant-core-1.7.1-r2/html/api" +JAVA_SOURCES="/usr/share/ant-core/sources//ant-core-src.zip" +MERGE_VM="sun-jdk-1.8" |