diff --git a/Library/Homebrew/caveats.rb b/Library/Homebrew/caveats.rb index 607e1463df..397ba9bb06 100644 --- a/Library/Homebrew/caveats.rb +++ b/Library/Homebrew/caveats.rb @@ -155,7 +155,7 @@ class Caveats return if !f.plist_manual && !f.service? command = if f.service? - f.service.command.join(" ") + f.service.manual_command else f.plist_manual end diff --git a/Library/Homebrew/service.rb b/Library/Homebrew/service.rb index 297705f103..11673f76e6 100644 --- a/Library/Homebrew/service.rb +++ b/Library/Homebrew/service.rb @@ -172,6 +172,16 @@ module Homebrew @run.map(&:to_s) end + sig { returns(String) } + def manual_command + instance_eval(&@service_block) + vars = @environment_variables.except(:PATH) + .map { |k, v| "#{k}=\"#{v}\"" } + + out = vars + command + out.join(" ") + end + # Returns a `String` plist. # @return [String] sig { returns(String) } @@ -216,10 +226,7 @@ module Homebrew options << "StandardInput=file:#{@input_path}" if @input_path.present? options << "StandardOutput=append:#{@log_path}" if @log_path.present? options << "StandardError=append:#{@error_log_path}" if @error_log_path.present? - if @environment_variables.present? - list = @environment_variables.map { |k, v| "#{k}=#{v}" }.join("&") - options << "Environment=\"#{list}\"" - end + options += @environment_variables.map { |k, v| "Environment=\"#{k}=#{v}\"" } if @environment_variables.present? unit + options.join("\n") end diff --git a/Library/Homebrew/test/service_spec.rb b/Library/Homebrew/test/service_spec.rb index 09eacbf2eb..44b0869cc0 100644 --- a/Library/Homebrew/test/service_spec.rb +++ b/Library/Homebrew/test/service_spec.rb @@ -32,12 +32,44 @@ describe Homebrew::Service do end end + describe "#manual_command" do + it "returns valid manual_command" do + f.class.service do + run "#{HOMEBREW_PREFIX}/bin/beanstalkd" + run_type :immediate + environment_variables PATH: std_service_path_env, ETC_DIR: etc/"beanstalkd" + error_log_path var/"log/beanstalkd.error.log" + log_path var/"log/beanstalkd.log" + working_dir var + keep_alive true + end + + path = f.service.manual_command + expect(path).to eq("ETC_DIR=\"#{HOMEBREW_PREFIX}/etc/beanstalkd\" #{HOMEBREW_PREFIX}/bin/beanstalkd") + end + + it "returns valid manual_command without variables" do + f.class.service do + run opt_bin/"beanstalkd" + run_type :immediate + environment_variables PATH: std_service_path_env + error_log_path var/"log/beanstalkd.error.log" + log_path var/"log/beanstalkd.log" + working_dir var + keep_alive true + end + + path = f.service.manual_command + expect(path).to eq("#{HOMEBREW_PREFIX}/opt/formula_name/bin/beanstalkd") + end + end + describe "#to_plist" do it "returns valid plist" do f.class.service do run [opt_bin/"beanstalkd", "test"] run_type :immediate - environment_variables PATH: std_service_path_env + environment_variables PATH: std_service_path_env, FOO: "BAR" error_log_path var/"log/beanstalkd.error.log" log_path var/"log/beanstalkd.log" input_path var/"in/beanstalkd" @@ -56,6 +88,8 @@ describe Homebrew::Service do \tEnvironmentVariables \t + \t\tFOO + \t\tBAR \t\tPATH \t\t#{HOMEBREW_PREFIX}/bin:#{HOMEBREW_PREFIX}/sbin:/usr/bin:/bin:/usr/sbin:/sbin \t @@ -122,7 +156,7 @@ describe Homebrew::Service do f.class.service do run [opt_bin/"beanstalkd", "test"] run_type :immediate - environment_variables PATH: std_service_path_env + environment_variables PATH: std_service_path_env, FOO: "BAR" error_log_path var/"log/beanstalkd.error.log" log_path var/"log/beanstalkd.log" input_path var/"in/beanstalkd" @@ -150,6 +184,7 @@ describe Homebrew::Service do StandardOutput=append:#{HOMEBREW_PREFIX}/var/log/beanstalkd.log StandardError=append:#{HOMEBREW_PREFIX}/var/log/beanstalkd.error.log Environment=\"PATH=#{std_path}\" + Environment=\"FOO=BAR\" EOS expect(unit).to eq(unit_expect.strip) end