Skip to content

Commit 4746bf7

Browse files
committed
chore: always use service arrays
1 parent 23d6171 commit 4746bf7

File tree

14 files changed

+238
-81
lines changed

14 files changed

+238
-81
lines changed

.github/workflows/tests.yml

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ jobs:
6262
run: |
6363
brew services stop redis
6464
sleep 5
65+
brew services run redis
6566
brew services restart redis
6667
brew services list | grep redis
6768
sleep 5

cmd/services.rb

+15-13
Original file line numberDiff line numberDiff line change
@@ -65,33 +65,35 @@ def services
6565
custom_plist = args.file
6666
end
6767

68-
if ["list", "cleanup"].include?(subcommand)
68+
if [*Service::Commands::List::TRIGGERS, *Service::Commands::Cleanup::TRIGGERS].include?(subcommand)
6969
raise UsageError, "The `#{subcommand}` subcommand does not accept a formula argument!" if formula
7070
raise UsageError, "The `#{subcommand}` subcommand does not accept the --all argument!" if args.all?
7171
end
7272

73-
target = if args.all?
73+
targets = if args.all?
7474
Service::Formulae.available_services
7575
elsif formula
76-
Service::FormulaWrapper.new(Formulary.factory(formula))
76+
[Service::FormulaWrapper.new(Formulary.factory(formula))]
77+
else
78+
[]
7779
end
7880

7981
ENV["DBUS_SESSION_BUS_ADDRESS"] = ENV["HOMEBREW_DBUS_SESSION_BUS_ADDRESS"] if Service::System.systemctl?
8082

8183
# Dispatch commands and aliases.
8284
case subcommand.presence
83-
when nil, "list", "ls"
85+
when *Service::Commands::List::TRIGGERS
8486
Service::Commands::List.run
85-
when "cleanup", "clean", "cl", "rm"
87+
when *Service::Commands::Cleanup::TRIGGERS
8688
Service::Commands::Cleanup.run
87-
when "restart", "relaunch", "reload", "r"
88-
Service::Commands::Restart.run(target, custom_plist, verbose: args.verbose?)
89-
when "run"
90-
Service::Commands::Run.run(target, verbose: args.verbose?)
91-
when "start", "launch", "load", "s", "l"
92-
Service::Commands::Start.run(target, custom_plist, verbose: args.verbose?)
93-
when "stop", "unload", "terminate", "term", "t", "u"
94-
Service::Commands::Stop.run(target, verbose: args.verbose?)
89+
when *Service::Commands::Restart::TRIGGERS
90+
Service::Commands::Restart.run(targets, custom_plist, verbose: args.verbose?)
91+
when *Service::Commands::Run::TRIGGERS
92+
Service::Commands::Run.run(targets, verbose: args.verbose?)
93+
when *Service::Commands::Start::TRIGGERS
94+
Service::Commands::Start.run(targets, custom_plist, verbose: args.verbose?)
95+
when *Service::Commands::Stop::TRIGGERS
96+
Service::Commands::Stop.run(targets, verbose: args.verbose?)
9597
else
9698
raise UsageError, "unknown subcommand: `#{subcommand}`"
9799
end

lib/service/commands/cleanup.rb

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ module Commands
55
module Cleanup
66
module_function
77

8+
TRIGGERS = %w[cleanup clean cl rm].freeze
9+
810
def run
911
cleaned = []
1012

lib/service/commands/list.rb

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ module Commands
77
module List
88
module_function
99

10+
TRIGGERS = [nil, "list", "ls"].freeze
11+
1012
def run
1113
formulae = Formulae.services_list
1214
if formulae.empty?

lib/service/commands/restart.rb

+18-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,24 @@ module Commands
55
module Restart
66
module_function
77

8-
def run(target, custom_plist, verbose:)
9-
ServicesCli.check(target) &&
10-
ServicesCli.restart(target, custom_plist, verbose: verbose)
8+
TRIGGERS = %w[restart relaunch reload r].freeze
9+
10+
def run(targets, _custom_plist, verbose:)
11+
return unless ServicesCli.check(targets)
12+
13+
ran = []
14+
started = []
15+
targets.select(&:loaded?).each do |service|
16+
if service.service_file_present?
17+
started << service
18+
else
19+
ran << service
20+
end
21+
ServicesCli.stop([service]) if service.loaded?
22+
end
23+
24+
ServicesCli.run(ran) unless ran.empty?
25+
ServicesCli.start(started) unless started.empty?
1126
end
1227
end
1328
end

lib/service/commands/run.rb

+5-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ module Commands
55
module Run
66
module_function
77

8-
def run(target, verbose:)
9-
ServicesCli.check(target) &&
10-
ServicesCli.run(target, verbose: verbose)
8+
TRIGGERS = ["run"].freeze
9+
10+
def run(targets, verbose:)
11+
ServicesCli.check(targets) &&
12+
ServicesCli.run(targets, verbose: verbose)
1113
end
1214
end
1315
end

lib/service/commands/start.rb

+5-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ module Commands
55
module Start
66
module_function
77

8-
def run(target, custom_plist, verbose:)
9-
ServicesCli.check(target) &&
10-
ServicesCli.start(target, custom_plist, verbose: verbose)
8+
TRIGGERS = %w[start launch load s l].freeze
9+
10+
def run(targets, custom_plist, verbose:)
11+
ServicesCli.check(targets) &&
12+
ServicesCli.start(targets, custom_plist, verbose: verbose)
1113
end
1214
end
1315
end

lib/service/commands/stop.rb

+5-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ module Commands
55
module Stop
66
module_function
77

8-
def run(target, verbose:)
9-
ServicesCli.check(target) &&
10-
ServicesCli.stop(target, verbose: verbose)
8+
TRIGGERS = %w[stop unload terminate term t u].freeze
9+
10+
def run(targets, verbose:)
11+
ServicesCli.check(targets) &&
12+
ServicesCli.stop(targets, verbose: verbose)
1113
end
1214
end
1315
end

lib/service/formulae.rb

+1-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ def services_list
3535

3636
# If we have a file or a user defined, check if the service is running or errored.
3737
if formula[:user] && formula[:file]
38-
formula[:status] =
39-
Service::ServicesCli.service_get_operational_status(service)
38+
formula[:status] = Service::ServicesCli.service_get_operational_status(service)
4039
end
4140

4241
formula

lib/service/services_cli.rb

+33-50
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ def running
2828
end
2929

3030
# Check if formula has been found.
31-
def check(target)
32-
odie("Formula(e) missing, please provide a formula name or use --all") unless target
31+
def check(targets)
32+
raise UsageError, "Formula(e) missing, please provide a formula name or use --all" if targets.empty?
33+
3334
true
3435
end
3536

@@ -74,62 +75,43 @@ def remove_unused_service_files
7475
cleaned
7576
end
7677

77-
# Stop if loaded, then start or run again.
78-
def restart(target, service_file = nil, verbose: false)
79-
Array(target).each do |service|
80-
was_run = service.loaded? && !service.service_file_present?
81-
82-
stop(service) if service.loaded?
83-
84-
if was_run
85-
run(service)
86-
else
87-
start(service, service_file, verbose: verbose)
88-
end
89-
end
90-
end
91-
9278
# Run a service as defined in the formula. This does not clean the service file like `start` does.
93-
def run(target, verbose: false)
94-
if target.is_a?(Service)
95-
if target.pid?
96-
puts "Service `#{target.name}` already running, use `#{bin} restart #{target.name}` to restart."
97-
return
98-
elsif root?
99-
puts "Service `#{target.name}` cannot be run (but can be started) as root."
100-
return
79+
def run(targets, verbose: false)
80+
targets.each do |service|
81+
if service.pid?
82+
puts "Service `#{service.name}` already running, use `#{bin} restart #{service.name}` to restart."
83+
next
84+
elsif System.root?
85+
puts "Service `#{service.name}` cannot be run (but can be started) as root."
86+
next
10187
end
102-
end
10388

104-
Array(target).each do |service|
10589
service_load(service, enable: false)
10690
end
10791
end
10892

10993
# Start a service.
110-
def start(target, service_file = nil, verbose: false)
94+
def start(targets, service_file = nil, verbose: false)
11195
if service_file.present?
11296
file = Pathname.new service_file
11397
raise UsageError, "Provided service file does not exist" unless file.exist?
11498
end
11599

116-
if target.is_a?(Service)
117-
if target.pid?
118-
puts "Service `#{target.name}` already started, use `#{bin} restart #{target.name}` to restart."
119-
return
100+
targets.reject(&:pid?).each do |service|
101+
if service.pid?
102+
puts "Service `#{service.name}` already started, use `#{bin} restart #{service.name}` to restart."
103+
next
120104
end
121105

122-
odie "Formula `#{target.name}` is not installed." unless target.installed?
106+
odie "Formula `#{service.name}` is not installed." unless service.installed?
123107

124-
file ||= if target.service_file.exist? || System.systemctl? || target.formula.plist.blank?
108+
file ||= if service.service_file.exist? || System.systemctl? || service.formula.plist.blank?
125109
nil
126-
elsif target.formula.opt_prefix.exist? && (keg = Keg.for target.formula.opt_prefix) && keg.plist_installed?
127-
service_file = Dir["#{keg}/*#{target.service_file.extname}"].first
110+
elsif service.formula.opt_prefix.exist? && (keg = Keg.for service.formula.opt_prefix) && keg.plist_installed?
111+
service_file = Dir["#{keg}/*#{service.service_file.extname}"].first
128112
Pathname.new service_file if service_file.present?
129113
end
130-
end
131114

132-
Array(target).reject(&:pid?).each do |service|
133115
install_service_file(service, file)
134116

135117
if file.blank? && verbose
@@ -146,20 +128,21 @@ def start(target, service_file = nil, verbose: false)
146128
end
147129

148130
# Stop a service, or kill it if no service file is available.
149-
def stop(target, verbose: false)
150-
if target.is_a?(Service) && !target.loaded?
151-
rm target.dest if target.dest.exist? # get rid of installed service file anyway, dude
152-
if target.service_file_present?
153-
odie <<~EOS
154-
Service `#{target.name}` is started as `#{target.owner}`. Try:
155-
#{"sudo " unless ServicesCli.root?}#{bin} stop #{target.name}
156-
EOS
157-
else
158-
odie "Service `#{target.name}` is not started."
131+
def stop(targets, verbose: false)
132+
targets.each do |service|
133+
unless service.loaded?
134+
rm service.dest if service.dest.exist? # get rid of installed service file anyway, dude
135+
if service.service_file_present?
136+
odie <<~EOS
137+
Service `#{service.name}` is started as `#{service.owner}`. Try:
138+
#{"sudo " unless ServicesCli.root?}#{bin} stop #{service.name}
139+
EOS
140+
else
141+
opoo "Service `#{service.name}` is not started."
142+
end
143+
next
159144
end
160-
end
161145

162-
Array(target).select(&:loaded?).each do |service|
163146
puts "Stopping `#{service.name}`... (might take a while)"
164147
if System.systemctl?
165148
quiet_system System.systemctl, System.systemctl_scope, "stop", service.service_name

spec/homebrew/formula_wrapper_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@
205205
allow(Service::System).to receive(:systemctl?).and_return(false)
206206
expect do
207207
service.generate_plist(nil)
208-
end.to output("Could not read the plist for `mysql`!\n").to_stdout
208+
end.to raise_error TestExit, "Could not read the plist for `mysql`!"
209209
end
210210
end
211211
end

0 commit comments

Comments
 (0)