chiark / gitweb /
choose the most recent available version of Java
authorHans-Christoph Steiner <hans@eds.org>
Fri, 20 Oct 2017 09:35:48 +0000 (11:35 +0200)
committerHans-Christoph Steiner <hans@eds.org>
Wed, 25 Oct 2017 21:01:25 +0000 (23:01 +0200)
This came about testing on OSX, where there are often multiple versions of
the JDK installed.  This was choosing the oldest version.  It should
choose the most recent version.

.travis.yml
fdroidserver/common.py
tests/common.TestCase

index 27df250a2d75c8688fa2e64f15b9d85464664f62..8af3260630aca5228955aa45cde7f958ede7d3be 100644 (file)
@@ -75,6 +75,8 @@ install:
       sudo pip3 install --quiet --editable . ;
       sudo rm -rf fdroidserver.egg-info;
 
+      ls -l /System/Library/Java/JavaVirtualMachines || true;
+      ls -l /Library/Java/JavaVirtualMachines || true;
       echo $PATH;
       echo $JAVA_HOME;
       jenv versions;
index c6fbf0d205453bb06931be64e987ae6a34e4ff33..7e76513d84fb0a7a9df4dc0f9c92a4a82f5a0293 100644 (file)
@@ -132,6 +132,41 @@ def setup_global_opts(parser):
                         help=_("Restrict output to warnings and errors"))
 
 
+def _add_java_paths_to_config(pathlist, thisconfig):
+    def path_version_key(s):
+        versionlist = []
+        for u in re.split('[^0-9]+', s):
+            try:
+                versionlist.append(int(u))
+            except ValueError:
+                pass
+        return versionlist
+
+    for d in sorted(pathlist, key=path_version_key):
+        if os.path.islink(d):
+            continue
+        j = os.path.basename(d)
+        # the last one found will be the canonical one, so order appropriately
+        for regex in [
+                r'^1\.([6-9])\.0\.jdk$',  # OSX
+                r'^jdk1\.([6-9])\.0_[0-9]+.jdk$',  # OSX and Oracle tarball
+                r'^jdk1\.([6-9])\.0_[0-9]+$',  # Oracle Windows
+                r'^jdk([6-9])-openjdk$',  # Arch
+                r'^java-([6-9])-openjdk$',  # Arch
+                r'^java-([6-9])-jdk$',  # Arch (oracle)
+                r'^java-1\.([6-9])\.0-.*$',  # RedHat
+                r'^java-([6-9])-oracle$',  # Debian WebUpd8
+                r'^jdk-([6-9])-oracle-.*$',  # Debian make-jpkg
+                r'^java-([6-9])-openjdk-[^c][^o][^m].*$',  # Debian
+                ]:
+            m = re.match(regex, j)
+            if not m:
+                continue
+            for p in [d, os.path.join(d, 'Contents', 'Home')]:
+                if os.path.exists(os.path.join(p, 'bin', 'javac')):
+                    thisconfig['java_paths'][m.group(1)] = p
+
+
 def fill_config_defaults(thisconfig):
     for k, v in default_config.items():
         if k not in thisconfig:
@@ -167,29 +202,7 @@ def fill_config_defaults(thisconfig):
             pathlist.append(os.getenv('JAVA_HOME'))
         if os.getenv('PROGRAMFILES') is not None:
             pathlist += glob.glob(os.path.join(os.getenv('PROGRAMFILES'), 'Java', 'jdk1.[6-9].*'))
-        for d in sorted(pathlist):
-            if os.path.islink(d):
-                continue
-            j = os.path.basename(d)
-            # the last one found will be the canonical one, so order appropriately
-            for regex in [
-                    r'^1\.([6-9])\.0\.jdk$',  # OSX
-                    r'^jdk1\.([6-9])\.0_[0-9]+.jdk$',  # OSX and Oracle tarball
-                    r'^jdk1\.([6-9])\.0_[0-9]+$',  # Oracle Windows
-                    r'^jdk([6-9])-openjdk$',  # Arch
-                    r'^java-([6-9])-openjdk$',  # Arch
-                    r'^java-([6-9])-jdk$',  # Arch (oracle)
-                    r'^java-1\.([6-9])\.0-.*$',  # RedHat
-                    r'^java-([6-9])-oracle$',  # Debian WebUpd8
-                    r'^jdk-([6-9])-oracle-.*$',  # Debian make-jpkg
-                    r'^java-([6-9])-openjdk-[^c][^o][^m].*$',  # Debian
-                    ]:
-                m = re.match(regex, j)
-                if not m:
-                    continue
-                for p in [d, os.path.join(d, 'Contents', 'Home')]:
-                    if os.path.exists(os.path.join(p, 'bin', 'javac')):
-                        thisconfig['java_paths'][m.group(1)] = p
+        _add_java_paths_to_config(pathlist, thisconfig)
 
     for java_version in ('7', '8', '9'):
         if java_version not in thisconfig['java_paths']:
index 3a10b7bba03417ddf812cd5d30cd17c254f46db8..2c261267d3ab936c02c0dccc32e7f5a9d4214dee 100755 (executable)
@@ -92,6 +92,41 @@ class CommonTest(unittest.TestCase):
             else:
                 print('no build-tools found: ' + build_tools)
 
+    def test_find_java_root_path(self):
+        tmptestsdir = tempfile.mkdtemp(prefix='test_find_java_root_path', dir=self.tmpdir)
+        os.chdir(tmptestsdir)
+
+        all_pathlists = [
+            ([  # Debian
+                '/usr/lib/jvm/java-1.5.0-gcj-5-amd64',
+                '/usr/lib/jvm/java-8-openjdk-amd64',
+                '/usr/lib/jvm/java-1.8.0-openjdk-amd64',
+            ], '/usr/lib/jvm/java-8-openjdk-amd64'),
+            ([  # OSX
+                '/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk',
+                '/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk',
+                '/System/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk',
+            ], '/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk'),
+        ]
+
+        for pathlist, choice in all_pathlists:
+            # strip leading / to make relative paths to test without root
+            pathlist = [p[1:] for p in pathlist]
+
+            # create test file used in common._add_java_paths_to_config()
+            for p in pathlist:
+                if p.startswith('/System') or p.startswith('/Library'):
+                    basedir = os.path.join(p, 'Contents', 'Home', 'bin')
+                else:
+                    basedir = os.path.join(p, 'bin')
+                os.makedirs(basedir)
+                open(os.path.join(basedir, 'javac'), 'w').close()
+
+            config = dict()
+            config['java_paths'] = dict()
+            fdroidserver.common._add_java_paths_to_config(pathlist, config)
+            self.assertEqual(config['java_paths']['8'], choice[1:])
+
     def testIsApkDebuggable(self):
         config = dict()
         fdroidserver.common.fill_config_defaults(config)
@@ -177,7 +212,7 @@ class CommonTest(unittest.TestCase):
 
     def test_prepare_sources_refresh(self):
         packageName = 'org.fdroid.ci.test.app'
-        testdir = tempfile.mkdtemp(prefix='test_verify_apks', dir=self.tmpdir)
+        testdir = tempfile.mkdtemp(prefix='test_prepare_sources_refresh', dir=self.tmpdir)
         print('testdir', testdir)
         os.chdir(testdir)
         os.mkdir('build')
@@ -462,4 +497,4 @@ if __name__ == "__main__":
 
     newSuite = unittest.TestSuite()
     newSuite.addTest(unittest.makeSuite(CommonTest))
-    unittest.main()
+    unittest.main(failfast=False)