<pre style='margin:0'>
Landon Fuller (landonf) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/0a16172a98aa72bfd806a82c63b7dd82cce3dd90">https://github.com/macports/macports-ports/commit/0a16172a98aa72bfd806a82c63b7dd82cce3dd90</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 0a16172a98aa72bfd806a82c63b7dd82cce3dd90
</span>Author: Janosch Peters <janosch1@mailbox.org>
AuthorDate: Thu Sep 23 11:07:24 2021 +0200

<span style='display:block; white-space:pre;color:#404040;'>    Move utility functions to 'java' namespace
</span>---
 _resources/port1.0/group/java-1.0.tcl | 342 +++++++++++++++++-----------------
 1 file changed, 172 insertions(+), 170 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/_resources/port1.0/group/java-1.0.tcl b/_resources/port1.0/group/java-1.0.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 67d028f396f..b54fd88b3a9 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/_resources/port1.0/group/java-1.0.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/_resources/port1.0/group/java-1.0.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -31,206 +31,208 @@ set java_version_not_found no
</span> pre-fetch {
     if { ${java_version_not_found} } {
         # Check again, incase java became available, .e.g openjdk installed as a dependency
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        java_set_env
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        java::java_set_env
</span>         # If still not present, error out
         if { ${java_version_not_found} } {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_error "${name} requires Java ${java.version} but no such installation could be found."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return -code error "missing required Java version"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "${name} requires Java ${java.version} but no such installation could be found."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return -code error "missing required Java version"
</span>         }
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Search for a good value for JAVA_HOME
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc find_java_home {} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set home_value ""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Default setting to found, until proved otherwise below
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global java_version_not_found
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set java_version_not_found no
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global java.version java.fallback
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if { ${java.version} ne "" } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_debug "java-portgroup: Trying to find JVM version: ${java.version}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # If on arm automatically adjust to the *-zulu fallback versions
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # as required, as currently these are the only ones supporting arm.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # To be reviewed as support for arm comes for the other versions.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Following regex matches openjdk<version> only.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if { [option configure.build_arch] eq "arm64" &&
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [regexp {openjdk(\d{1,2}$)} ${java.fallback}] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set newjdk ${java.fallback}-zulu
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_debug "Redefining java fallback ${java.fallback} to ${newjdk} for arm compatibility"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            java.fallback ${newjdk}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+port::register_callback java::java_set_env
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+namespace eval java {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Search for a good value for JAVA_HOME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc find_java_home {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set home_value ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Default setting to found, until proved otherwise below
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        global java_version_not_found
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set java_version_not_found no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        global java.version java.fallback
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if { ${java.version} ne "" } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_debug "java-portgroup: Trying to find JVM version: ${java.version}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # If on arm automatically adjust to the *-zulu fallback versions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # as required, as currently these are the only ones supporting arm.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # To be reviewed as support for arm comes for the other versions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Following regex matches openjdk<version> only.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if { [option configure.build_arch] eq "arm64" &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 [regexp {openjdk(\d{1,2}$)} ${java.fallback}] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set newjdk ${java.fallback}-zulu
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_debug "Redefining java fallback ${java.fallback} to ${newjdk} for arm compatibility"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                java.fallback ${newjdk}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # For macOS >= Big Sur, the JDK discovery was re-implemented because
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # the previous approach relied on '/usr/libexec/java_home -v' whose
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # behaviour changed with Big Sur. The new implementation can
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # handle wildcards on the major version, but not on the minor version:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # 1.8+, 9* works, 1.7.35+ won't.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # See https://trac.macports.org/ticket/61445
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            global os.platform os.major
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set big_sur_workaround [expr {${os.platform} eq "darwin" && ${os.major} >= 20}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if { ${big_sur_workaround} && [catch {set val [get_jvm_bigsur ${java.version}] } ]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            || !${big_sur_workaround} && [catch {set val [exec "/usr/libexec/java_home" "-f" "-v" ${java.version}] } ] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # Don't return an error because that would prevent the port from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # even being indexed when the required Java is missing. Instead, set
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # a flag to be checked at pre-fetch.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set java_version_not_found yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set home_value $val
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_debug "java-portgroup: Discovered matching JAVA_HOME: $home_value"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span>         }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        # For macOS >= Big Sur, the JDK discovery was re-implemented because
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # the previous approach relied on '/usr/libexec/java_home -v' whose
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # behaviour changed with Big Sur. The new implementation can
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # handle wildcards on the major version, but not on the minor version:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # 1.8+, 9* works, 1.7.35+ won't.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        #
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # See https://trac.macports.org/ticket/61445
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        global os.platform os.major
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set big_sur_workaround [expr {${os.platform} eq "darwin" && ${os.major} >= 20}]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if { ${big_sur_workaround} && [catch {set val [get_jvm_bigsur ${java.version}] } ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        || !${big_sur_workaround} && [catch {set val [exec "/usr/libexec/java_home" "-f" "-v" ${java.version}] } ] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # Don't return an error because that would prevent the port from
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # even being indexed when the required Java is missing. Instead, set
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # a flag to be checked at pre-fetch.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set java_version_not_found yes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set home_value $val
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_debug "java-portgroup: Discovered matching JAVA_HOME: $home_value"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Default to any valid value that made it through the environment
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if { ![file isdirectory $home_value] && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 [info exists ::env(JAVA_HOME)] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set val $::env(JAVA_HOME)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if { [file isdirectory $val] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set home_value $val
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_debug "Discovered JAVA_HOME via env: $home_value"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span>         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Default to any valid value that made it through the environment
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if { ![file isdirectory $home_value] && \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [info exists ::env(JAVA_HOME)] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set val $::env(JAVA_HOME)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if { [file isdirectory $val] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # First, ask the system where java home is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if { ![file isdirectory $home_value] && ![catch {set val [exec "/usr/libexec/java_home"]}] } {
</span>             set home_value $val
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_debug "Discovered JAVA_HOME via env: $home_value"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_debug "Discovered JAVA_HOME via /usr/libexec/java_home: $home_value"
</span>         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # First, ask the system where java home is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if { ![file isdirectory $home_value] && ![catch {set val [exec "/usr/libexec/java_home"]}] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set home_value $val
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_debug "Discovered JAVA_HOME via /usr/libexec/java_home: $home_value"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Fall back to more conventional way to find java home
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if { ![file isdirectory $home_value] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        foreach loc { "/System/Library/Frameworks/JavaVM.framework/Home" } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if { [file isdirectory $loc] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set home_value $loc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_debug "Discovered JAVA_HOME via search path: $home_value"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Fall back to more conventional way to find java home
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if { ![file isdirectory $home_value] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach loc { "/System/Library/Frameworks/JavaVM.framework/Home" } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if { [file isdirectory $loc] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set home_value $loc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ui_debug "Discovered JAVA_HOME via search path: $home_value"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span>             }
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Warn user if we couldn't find a likely JAVA_HOME
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if { ![file isdirectory $home_value]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_debug "No value for java JAVA_HOME was automatically discovered"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Warn user if we couldn't find a likely JAVA_HOME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if { ![file isdirectory $home_value]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_debug "No value for java JAVA_HOME was automatically discovered"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Add dependency if required
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if { ${java_version_not_found} && ${java.fallback} ne "" } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_debug "Adding dependency on JDK fallback ${java.fallback}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depends_lib-append port:${java.fallback}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Add dependency if required
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if { ${java_version_not_found} && ${java.fallback} ne "" } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_debug "Adding dependency on JDK fallback ${java.fallback}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_lib-append port:${java.fallback}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    return $home_value
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $home_value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc java_set_env {} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Set the best value we can find for JAVA_HOME
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set java_home [find_java_home]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    configure.env-append   JAVA_HOME=${java_home}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    build.env-append       JAVA_HOME=${java_home}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    destroot.env-append    JAVA_HOME=${java_home}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    java.home ${java_home}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc java_set_env {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Set the best value we can find for JAVA_HOME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set java_home [find_java_home]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.env-append   JAVA_HOME=${java_home}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        build.env-append       JAVA_HOME=${java_home}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        destroot.env-append    JAVA_HOME=${java_home}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        java.home ${java_home}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-port::register_callback java_set_env
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc get_jvm_bigsur { version_requested } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Normalize version numbers 1.x -> x
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set version_requested [regsub {^1\.} $version_requested ""]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Sort the JVMs we found on the system descending
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set versions_found [sort_dict [find_jvm_versions]]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ui_debug "java-portgroup: Detected JVMs: $versions_found"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Match the systems JVMs with the one requested by MacPorts
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Higher JVM Versions win
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return [match_jvm_version $version_requested $versions_found]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc get_jvm_bigsur { version_requested } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Normalize version numbers 1.x -> x
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set version_requested [regsub {^1\.} $version_requested ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Sort the JVMs we found on the system descending
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set versions_found [sort_dict [find_jvm_versions]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_debug "java-portgroup: Detected JVMs: $versions_found"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Match the systems JVMs with the one requested by MacPorts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Higher JVM Versions win
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return [match_jvm_version $version_requested $versions_found]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Find JVM versions by using /usr/libexec/java_home -V (not -v!)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Returns a dict with unique major versions as key and the corresponding
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# java_home as value:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#  dict[major_version]=java_home
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc find_jvm_versions {} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[catch {exec /usr/libexec/java_home -V} result options]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Extract JVM versions and corresponding JAVA_HOMEs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set vm_versions [regexp -all -inline -- { +(\d+(?:\.\d+)+)[^/]+(\/[^\0\n]+)} $result]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # %3=0 -> Regex match, ignored.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # %3=1 -> Version
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # %3=2 -> JAVA_HOME.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        for {set idx 0} {$idx < [llength $vm_versions]} {incr idx 3} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set vers [lindex $vm_versions $idx+1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # Normalize version 1.x -> x
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set vers [regsub {^1\.} $vers ""]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # Extract major version
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set vers [regsub {(\.\d+)+} $vers ""]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set path [lindex $vm_versions $idx+2]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            dict append version_path_dict $vers $path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Find JVM versions by using /usr/libexec/java_home -V (not -v!)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Returns a dict with unique major versions as key and the corresponding
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # java_home as value:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    #  dict[major_version]=java_home
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc find_jvm_versions {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {exec /usr/libexec/java_home -V} result options]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Extract JVM versions and corresponding JAVA_HOMEs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set vm_versions [regexp -all -inline -- { +(\d+(?:\.\d+)+)[^/]+(\/[^\0\n]+)} $result]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # %3=0 -> Regex match, ignored.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # %3=1 -> Version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # %3=2 -> JAVA_HOME.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            for {set idx 0} {$idx < [llength $vm_versions]} {incr idx 3} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set vers [lindex $vm_versions $idx+1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # Normalize version 1.x -> x
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set vers [regsub {^1\.} $vers ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # Extract major version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set vers [regsub {(\.\d+)+} $vers ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set path [lindex $vm_versions $idx+2]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict append version_path_dict $vers $path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set details [dict get $options -errorcode]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_debug "Error executing /usr/libexec/java_home -V"
</span>         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set details [dict get $options -errorcode]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_debug "Error executing /usr/libexec/java_home -V"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set version_path_dict
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set version_path_dict
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Match a normalized major version string like 7, 8*, 9+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc match_jvm_version { version_requested versions_found } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[string first "+" $version_requested] != -1} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set version_requested [regsub {\+} $version_requested ""]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        match_less_equal $version_requested $versions_found
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set version_requested [regsub {\*} $version_requested ""]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        match_equal $version_requested $versions_found
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Match a normalized major version string like 7, 8*, 9+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc match_jvm_version { version_requested versions_found } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[string first "+" $version_requested] != -1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set version_requested [regsub {\+} $version_requested ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            match_less_equal $version_requested $versions_found
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set version_requested [regsub {\*} $version_requested ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            match_equal $version_requested $versions_found
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Returns the value of the first dictionary entry
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# whose key is equal to search_key.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param search_key The key that is to be found in the dictionary
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param target_dict The dictionary which should be searched for search_key
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @return The value of the first entry that matched.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Returns an error, if no such entry is found.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc match_equal { search_key target_dict } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach td_key [dict keys $target_dict] {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {$search_key == $td_key} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set ret_value [dict get $target_dict $td_key]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return $ret_value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Returns the value of the first dictionary entry
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # whose key is equal to search_key.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # @param search_key The key that is to be found in the dictionary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # @param target_dict The dictionary which should be searched for search_key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # @return The value of the first entry that matched.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Returns an error, if no such entry is found.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc match_equal { search_key target_dict } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach td_key [dict keys $target_dict] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$search_key == $td_key} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set ret_value [dict get $target_dict $td_key]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                return $ret_value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span>         }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        return -code error
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    return -code error
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Returns the value of the first dictionary entry
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# whose key is less or equal to search_key.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param search_key The key that is to be found in the dictionary
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param target_dict The dictionary which should be searched for search_key
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @return The value of the first entry that matched.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Returns an error, if no such entry is found.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc match_less_equal { search_key target_dict } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach td_key [dict keys $target_dict] {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {$search_key <= $td_key} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set ret_value [dict get $target_dict $td_key]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return $ret_value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Returns the value of the first dictionary entry
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # whose key is less or equal to search_key.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # @param search_key The key that is to be found in the dictionary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # @param target_dict The dictionary which should be searched for search_key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # @return The value of the first entry that matched.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Returns an error, if no such entry is found.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc match_less_equal { search_key target_dict } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach td_key [dict keys $target_dict] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$search_key <= $td_key} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set ret_value [dict get $target_dict $td_key]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                return $ret_value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span>         }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        return -code error
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    return -code error
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Sorts a dictionary decreasing by its keys
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param The dictionary that is to be sorted decreasing by its keys
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @return A sorted dictionary
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc sort_dict { unsorted_dict } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set keys_unsorted [dict keys $unsorted_dict]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set keys_sorted [lsort -decreasing $keys_unsorted]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach key $keys_sorted {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set value [dict get $unsorted_dict $key]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        dict append sorted_dict $key $value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Sorts a dictionary decreasing by its keys
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # @param The dictionary that is to be sorted decreasing by its keys
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # @return A sorted dictionary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc sort_dict { unsorted_dict } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set keys_unsorted [dict keys $unsorted_dict]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set keys_sorted [lsort -decreasing $keys_unsorted]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach key $keys_sorted {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set value [dict get $unsorted_dict $key]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict append sorted_dict $key $value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $sorted_dict
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    return $sorted_dict
</span> }
</pre><pre style='margin:0'>

</pre>