aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlistair Bush <ali_bush@gentoo.org>2009-10-11 04:47:35 +0000
committerAlistair Bush <ali_bush@gentoo.org>2009-10-11 04:47:35 +0000
commit12901d8838cf3044872da07e7456e3ff40c54bb7 (patch)
tree4080c5ef93b60301c7a65877f85d64f61f3d9fa4
parentbug fixes (diff)
downloadjava-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.py48
-rw-r--r--src/testsuite/EnvironmentManager.py2
-rw-r--r--src/testsuite/VersionManager.py18
-rw-r--r--src/testsuite/packages/ant-cores5/package.env10
-rw-r--r--src/testsuite/packages/test-package/package.env10
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"