From d4197835bbd5197c71b59d8372d559504a3f6fa2 Mon Sep 17 00:00:00 2001 From: Sean Molenaar Date: Thu, 29 Apr 2021 09:43:39 +0200 Subject: [PATCH] services: fix array being flattened --- Library/Homebrew/service.rb | 11 +-- Library/Homebrew/test/service_spec.rb | 122 ++++++++++++++++---------- 2 files changed, 79 insertions(+), 54 deletions(-) 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