From e8b22690a0ba9231c16d1336b7d7dc9067ec4ccd Mon Sep 17 00:00:00 2001 From: Shaun Jackman Date: Tue, 27 Nov 2018 11:52:30 -0800 Subject: [PATCH] Fix Language::Java::java_home_env for Linux /usr/libexec/java_home is specific to macOS. Language::Java::java_home_cmd is not implemented on Linux and raises NotImplementedError. Add private Language::Java::java_home_shell and use it instead of java_home_cmd. Add public Language::Java::java_home for use by formulae. --- Library/Homebrew/extend/os/language/java.rb | 1 + .../Homebrew/extend/os/mac/language/java.rb | 18 +++++++++++++++ Library/Homebrew/extend/pathname.rb | 2 +- Library/Homebrew/language/java.rb | 23 +++++++++++++++---- .../Homebrew/requirements/java_requirement.rb | 2 ++ Library/Homebrew/test/language/java_spec.rb | 20 ++++++++++++---- Library/Homebrew/test/spec_helper.rb | 10 ++++++++ 7 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 Library/Homebrew/extend/os/language/java.rb create mode 100644 Library/Homebrew/extend/os/mac/language/java.rb diff --git a/Library/Homebrew/extend/os/language/java.rb b/Library/Homebrew/extend/os/language/java.rb new file mode 100644 index 0000000000..0394f41991 --- /dev/null +++ b/Library/Homebrew/extend/os/language/java.rb @@ -0,0 +1 @@ +require "extend/os/mac/language/java" if OS.mac? diff --git a/Library/Homebrew/extend/os/mac/language/java.rb b/Library/Homebrew/extend/os/mac/language/java.rb new file mode 100644 index 0000000000..ef5615353a --- /dev/null +++ b/Library/Homebrew/extend/os/mac/language/java.rb @@ -0,0 +1,18 @@ +module Language + module Java + def self.java_home_cmd(version = nil) + version_flag = " --version #{version}" if version + "/usr/libexec/java_home#{version_flag}" + end + + def self.java_home(version = nil) + cmd = Language::Java.java_home_cmd(version) + Pathname.new Utils.popen_read(cmd).chomp + end + + # @private + def self.java_home_shell(version = nil) + "$(#{java_home_cmd(version)})" + end + end +end diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb index c1bc4eb203..3a62488aa8 100644 --- a/Library/Homebrew/extend/pathname.rb +++ b/Library/Homebrew/extend/pathname.rb @@ -356,7 +356,7 @@ class Pathname def write_jar_script(target_jar, script_name, java_opts = "", java_version: nil) mkpath java_home = if java_version - "JAVA_HOME=\"$(#{Language::Java.java_home_cmd(java_version)})\" " + "JAVA_HOME=\"#{Language::Java.java_home_shell(java_version)}\" " end join(script_name).write <<~SH #!/bin/bash diff --git a/Library/Homebrew/language/java.rb b/Library/Homebrew/language/java.rb index 330b5208bd..3dc8d18d23 100644 --- a/Library/Homebrew/language/java.rb +++ b/Library/Homebrew/language/java.rb @@ -1,16 +1,29 @@ module Language module Java - def self.java_home_cmd(version = nil) - version_flag = " --version #{version}" if version - "/usr/libexec/java_home#{version_flag}" + def self.java_home_cmd(_ = nil) + # macOS provides /usr/libexec/java_home, but Linux does not. + raise NotImplementedError + end + + def self.java_home(version = nil) + req = JavaRequirement.new [*version] + raise UnsatisfiedRequirements, req.message unless req.satisfied? + req.java_home + end + + # @private + def self.java_home_shell(version = nil) + java_home(version).to_s end def self.java_home_env(version = nil) - { JAVA_HOME: "$(#{java_home_cmd(version)})" } + { JAVA_HOME: java_home_shell(version) } end def self.overridable_java_home_env(version = nil) - { JAVA_HOME: "${JAVA_HOME:-$(#{java_home_cmd(version)})}" } + { JAVA_HOME: "${JAVA_HOME:-#{java_home_shell(version)}}" } end end end + +require "extend/os/language/java" diff --git a/Library/Homebrew/requirements/java_requirement.rb b/Library/Homebrew/requirements/java_requirement.rb index e9ffbf52f9..e3c777cd83 100644 --- a/Library/Homebrew/requirements/java_requirement.rb +++ b/Library/Homebrew/requirements/java_requirement.rb @@ -1,6 +1,8 @@ require "language/java" class JavaRequirement < Requirement + attr_reader :java_home + fatal true download "https://www.oracle.com/technetwork/java/javase/downloads/index.html" diff --git a/Library/Homebrew/test/language/java_spec.rb b/Library/Homebrew/test/language/java_spec.rb index 7b132e9969..32b6de1b6c 100644 --- a/Library/Homebrew/test/language/java_spec.rb +++ b/Library/Homebrew/test/language/java_spec.rb @@ -1,25 +1,37 @@ require "language/java" describe Language::Java do + describe "::java_home" do + it "returns valid JAVA_HOME if version is specified", :needs_java do + java_home = described_class.java_home("1.8+") + expect(java_home/"bin/java").to be_an_executable + end + + it "returns valid JAVA_HOME if version is not specified", :needs_java do + java_home = described_class.java_home + expect(java_home/"bin/java").to be_an_executable + end + end + describe "::java_home_env" do - it "returns java_home path with version if version specified" do + it "returns java_home path with version if version specified", :needs_macos do java_home = described_class.java_home_env("blah") expect(java_home[:JAVA_HOME]).to include("--version blah") end - it "returns java_home path without version if version is not specified" do + it "returns java_home path without version if version is not specified", :needs_java do java_home = described_class.java_home_env expect(java_home[:JAVA_HOME]).not_to include("--version") end end describe "::overridable_java_home_env" do - it "returns java_home path with version if version specified" do + it "returns java_home path with version if version specified", :needs_macos do java_home = described_class.overridable_java_home_env("blah") expect(java_home[:JAVA_HOME]).to include("--version blah") end - it "returns java_home path without version if version is not specified" do + it "returns java_home path without version if version is not specified", :needs_java do java_home = described_class.overridable_java_home_env expect(java_home[:JAVA_HOME]).not_to include("--version") end diff --git a/Library/Homebrew/test/spec_helper.rb b/Library/Homebrew/test/spec_helper.rb index 9b49b15b7c..531f474e84 100644 --- a/Library/Homebrew/test/spec_helper.rb +++ b/Library/Homebrew/test/spec_helper.rb @@ -85,6 +85,16 @@ RSpec.configure do |config| skip "Not on macOS." unless OS.mac? end + config.before(:each, :needs_java) do + java_installed = if OS.mac? + Utils.popen_read("/usr/libexec/java_home", "--failfast") + $CHILD_STATUS.success? + else + which("java") + end + skip "Java not installed." unless java_installed + end + config.before(:each, :needs_python) do skip "Python not installed." unless which("python") end