diff --git a/Library/Homebrew/service.rb b/Library/Homebrew/service.rb
index 37b3216178..38cf0c64f4 100644
--- a/Library/Homebrew/service.rb
+++ b/Library/Homebrew/service.rb
@@ -121,20 +121,17 @@ module Homebrew
sig { returns(T::Array[String]) }
def command
instance_eval(&@service_block)
- @run.select { |i| i.is_a?(Pathname) }
- .map(&:to_s)
+ @run.map(&:to_s)
end
# Returns a `String` plist.
# @return [String]
sig { returns(String) }
def to_plist
- instance_eval(&@service_block)
-
base = {
Label: @formula.plist_name,
RunAtLoad: @run_type == RUN_TYPE_IMMEDIATE,
- ProgramArguments: command.join,
+ ProgramArguments: command,
}
base[:KeepAlive] = @keep_alive if @keep_alive == true
@@ -150,15 +147,13 @@ module Homebrew
# @return [String]
sig { returns(String) }
def to_systemd_unit
- instance_eval(&@service_block)
-
unit = <<~EOS
[Unit]
Description=Homebrew generated unit for #{@formula.name}
[Service]
Type=simple
- ExecStart=#{command.join}
+ ExecStart=#{command.join(" ")}
EOS
options = []
diff --git a/Library/Homebrew/test/service_spec.rb b/Library/Homebrew/test/service_spec.rb
index 39c0e7031f..2c7bd94428 100644
--- a/Library/Homebrew/test/service_spec.rb
+++ b/Library/Homebrew/test/service_spec.rb
@@ -35,7 +35,7 @@ describe Homebrew::Service do
describe "#to_plist" do
it "returns valid plist" do
f.class.service do
- run opt_bin/"beanstalkd"
+ run [opt_bin/"beanstalkd", "test"]
run_type :immediate
environment_variables PATH: std_service_path_env
error_log_path var/"log/beanstalkd.error.log"
@@ -45,46 +45,70 @@ describe Homebrew::Service do
end
plist = f.service.to_plist
- expect(plist).to include("Label")
- expect(plist).to include("homebrew.mxcl.#{name}")
- expect(plist).to include("KeepAlive")
- expect(plist).to include("RunAtLoad")
- expect(plist).to include("ProgramArguments")
- expect(plist).to include("#{HOMEBREW_PREFIX}/opt/#{name}/bin/beanstalkd")
- expect(plist).to include("WorkingDirectory")
- expect(plist).to include("#{HOMEBREW_PREFIX}/var")
- expect(plist).to include("StandardOutPath")
- expect(plist).to include("#{HOMEBREW_PREFIX}/var/log/beanstalkd.log")
- expect(plist).to include("StandardErrorPath")
- expect(plist).to include("#{HOMEBREW_PREFIX}/var/log/beanstalkd.error.log")
- expect(plist).to include("EnvironmentVariables")
- expect(plist).to include("PATH")
- expect(plist).to include("#{HOMEBREW_PREFIX}/bin:#{HOMEBREW_PREFIX}/sbin:/usr/bin:/bin:")
+ plist_expect = <<~EOS
+
+
+
+
+ \tEnvironmentVariables
+ \t
+ \t\tPATH
+ \t\t#{HOMEBREW_PREFIX}/bin:#{HOMEBREW_PREFIX}/sbin:/usr/bin:/bin:/usr/sbin:/sbin
+ \t
+ \tKeepAlive
+ \t
+ \tLabel
+ \thomebrew.mxcl.formula_name
+ \tProgramArguments
+ \t
+ \t\t#{HOMEBREW_PREFIX}/opt/formula_name/bin/beanstalkd
+ \t\ttest
+ \t
+ \tRunAtLoad
+ \t
+ \tStandardErrorPath
+ \t#{HOMEBREW_PREFIX}/var/log/beanstalkd.error.log
+ \tStandardOutPath
+ \t#{HOMEBREW_PREFIX}/var/log/beanstalkd.log
+ \tWorkingDirectory
+ \t#{HOMEBREW_PREFIX}/var
+
+
+ EOS
+ expect(plist).to eq(plist_expect)
end
it "returns valid partial plist" do
f.class.service do
- run bin/"beanstalkd"
+ run opt_bin/"beanstalkd"
run_type :immediate
end
plist = f.service.to_plist
- expect(plist).to include("homebrew.mxcl.#{name}")
- expect(plist).to include("Label")
- expect(plist).not_to include("KeepAlive")
- expect(plist).to include("RunAtLoad")
- expect(plist).to include("ProgramArguments")
- expect(plist).not_to include("WorkingDirectory")
- expect(plist).not_to include("StandardOutPath")
- expect(plist).not_to include("StandardErrorPath")
- expect(plist).not_to include("EnvironmentVariables")
+ plist_expect = <<~EOS
+
+
+
+
+ \tLabel
+ \thomebrew.mxcl.formula_name
+ \tProgramArguments
+ \t
+ \t\t#{HOMEBREW_PREFIX}/opt/formula_name/bin/beanstalkd
+ \t
+ \tRunAtLoad
+ \t
+
+
+ EOS
+ expect(plist).to eq(plist_expect)
end
end
describe "#to_systemd_unit" do
it "returns valid unit" do
f.class.service do
- run opt_bin/"beanstalkd"
+ run [opt_bin/"beanstalkd", "test"]
run_type :immediate
environment_variables PATH: std_service_path_env
error_log_path var/"log/beanstalkd.error.log"
@@ -94,15 +118,21 @@ describe Homebrew::Service do
end
unit = f.service.to_systemd_unit
- expect(unit).to include("Description=Homebrew generated unit for formula_name")
- expect(unit).to include("Type=simple")
- expect(unit).to include("ExecStart=#{HOMEBREW_PREFIX}/opt/#{name}/bin/beanstalkd")
- expect(unit).to include("Restart=always")
- expect(unit).to include("WorkingDirectory=#{HOMEBREW_PREFIX}/var")
- expect(unit).to include("StandardOutput=append:#{HOMEBREW_PREFIX}/var/log/beanstalkd.log")
- expect(unit).to include("StandardError=append:#{HOMEBREW_PREFIX}/var/log/beanstalkd.error.log")
std_path = "#{HOMEBREW_PREFIX}/bin:#{HOMEBREW_PREFIX}/sbin:/usr/bin:/bin:/usr/sbin:/sbin"
- expect(unit).to include("Environment=\"PATH=#{std_path}\"")
+ unit_expect = <<~EOS
+ [Unit]
+ Description=Homebrew generated unit for formula_name
+
+ [Service]
+ Type=simple
+ ExecStart=#{HOMEBREW_PREFIX}/opt/#{name}/bin/beanstalkd test
+ Restart=always
+ WorkingDirectory=#{HOMEBREW_PREFIX}/var
+ StandardOutput=append:#{HOMEBREW_PREFIX}/var/log/beanstalkd.log
+ StandardError=append:#{HOMEBREW_PREFIX}/var/log/beanstalkd.error.log
+ Environment=\"PATH=#{std_path}\"
+ EOS
+ expect(unit).to eq(unit_expect.strip)
end
it "returns valid partial unit" do
@@ -112,27 +142,27 @@ describe Homebrew::Service do
end
unit = f.service.to_systemd_unit
- expect(unit).to include("Description=Homebrew generated unit for formula_name")
- expect(unit).to include("Type=simple")
- expect(unit).to include("ExecStart=#{HOMEBREW_PREFIX}/opt/#{name}/bin/beanstalkd")
- expect(unit).not_to include("Restart=always")
- expect(unit).not_to include("WorkingDirectory=#{HOMEBREW_PREFIX}/var")
- expect(unit).not_to include("StandardOutput=append:#{HOMEBREW_PREFIX}/var/log/beanstalkd.log")
- expect(unit).not_to include("StandardError=append:#{HOMEBREW_PREFIX}/var/log/beanstalkd.error.log")
- std_path = "#{HOMEBREW_PREFIX}/bin:#{HOMEBREW_PREFIX}/sbin:/usr/bin:/bin:/usr/sbin:/sbin"
- expect(unit).not_to include("Environment=\"PATH=#{std_path}\"")
+ unit_expect = <<~EOS
+ [Unit]
+ Description=Homebrew generated unit for formula_name
+
+ [Service]
+ Type=simple
+ ExecStart=#{HOMEBREW_PREFIX}/opt/#{name}/bin/beanstalkd
+ EOS
+ expect(unit).to eq(unit_expect)
end
end
describe "#command" do
it "returns @run data" do
f.class.service do
- run opt_bin/"beanstalkd"
+ run [opt_bin/"beanstalkd", "test"]
run_type :immediate
end
command = f.service.command
- expect(command).to eq(["#{HOMEBREW_PREFIX}/opt/#{name}/bin/beanstalkd"])
+ expect(command).to eq(["#{HOMEBREW_PREFIX}/opt/#{name}/bin/beanstalkd", "test"])
end
end
end