hiiro 0.1.150 → 0.1.151
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/hiiro/service_manager.rb +92 -18
- data/lib/hiiro/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 98bf6f648f72277fb219044bd6f5a5e0c1320c21d122e8478cc4e6d6f7000a4b
|
|
4
|
+
data.tar.gz: 6308aa3432b0cf8e9f2fc3ca4fc66fb9075902fb3c421fad4d2dbd03f2105418
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 268febf76230f6cb10ac9b492bc7c37fb34d48764b43d912dc430ae66f9b29cae1190c58109fa93d2935b4145a1e75685f6a8a1f4345e0ff53a40e70326301bc
|
|
7
|
+
data.tar.gz: dbf74be661003f9b67e878c9284d2b4a6ef4d20712226e6021023b5e2e7d8352bb671c8a86e184367fb0bad38301a4c589a6254c8d2ba2660d972a178d715feb
|
|
@@ -109,13 +109,50 @@ class Hiiro
|
|
|
109
109
|
return false
|
|
110
110
|
end
|
|
111
111
|
|
|
112
|
+
session = tmux_info[:session] || current_tmux_session
|
|
113
|
+
unless session
|
|
114
|
+
puts "tmux is required to start a service group"
|
|
115
|
+
return false
|
|
116
|
+
end
|
|
117
|
+
|
|
112
118
|
puts "Starting group '#{group[:name]}'..."
|
|
113
|
-
|
|
119
|
+
|
|
120
|
+
# Create one window for the group, split panes for each service
|
|
121
|
+
first_member = members.first
|
|
122
|
+
first_name = first_member['name'] || first_member[:name]
|
|
123
|
+
first_svc = find_service(first_name)
|
|
124
|
+
first_base_dir = first_svc&.[](:base_dir) || Dir.pwd
|
|
125
|
+
|
|
126
|
+
# Create a new window for the group
|
|
127
|
+
window_target = create_tmux_window(session, group[:name], first_base_dir)
|
|
128
|
+
first_pane_id = capture_pane_id(window_target)
|
|
129
|
+
|
|
130
|
+
members.each_with_index do |member, idx|
|
|
114
131
|
member_name = member['name'] || member[:name]
|
|
115
132
|
use_overrides = member['use'] || member[:use] || {}
|
|
116
133
|
|
|
117
134
|
prepare_env(member_name, variation_overrides: use_overrides)
|
|
118
|
-
|
|
135
|
+
|
|
136
|
+
svc = find_service(member_name)
|
|
137
|
+
next unless svc
|
|
138
|
+
|
|
139
|
+
base_dir = svc[:base_dir] || Dir.pwd
|
|
140
|
+
|
|
141
|
+
if idx == 0
|
|
142
|
+
# First service uses the initial pane
|
|
143
|
+
pane_id = first_pane_id
|
|
144
|
+
else
|
|
145
|
+
# Subsequent services get split panes
|
|
146
|
+
pane_id = split_tmux_pane(window_target, base_dir)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
member_tmux_info = tmux_info.merge(
|
|
150
|
+
session: session,
|
|
151
|
+
window: window_target,
|
|
152
|
+
pane: pane_id,
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
start(member_name, tmux_info: member_tmux_info, task_info: task_info, skip_env: true, skip_window_creation: true)
|
|
119
156
|
end
|
|
120
157
|
true
|
|
121
158
|
end
|
|
@@ -129,7 +166,7 @@ class Hiiro
|
|
|
129
166
|
load_state
|
|
130
167
|
end
|
|
131
168
|
|
|
132
|
-
def start(name, tmux_info: {}, task_info: {}, variation_overrides: {}, skip_env: false)
|
|
169
|
+
def start(name, tmux_info: {}, task_info: {}, variation_overrides: {}, skip_env: false, skip_window_creation: false)
|
|
133
170
|
svc = find_service(name)
|
|
134
171
|
unless svc
|
|
135
172
|
puts "Service '#{name}' not found"
|
|
@@ -168,20 +205,35 @@ class Hiiro
|
|
|
168
205
|
return false
|
|
169
206
|
end
|
|
170
207
|
|
|
208
|
+
# Coerce start command to array
|
|
209
|
+
start_cmds = Array(start_cmd)
|
|
210
|
+
|
|
171
211
|
base_dir = svc[:base_dir]
|
|
172
|
-
|
|
212
|
+
session = tmux_info[:session] || current_tmux_session
|
|
213
|
+
|
|
214
|
+
if session && !skip_window_creation
|
|
215
|
+
# Create a new tmux window for this service
|
|
216
|
+
window_target = create_tmux_window(session, svc_name, base_dir || Dir.pwd)
|
|
217
|
+
pane_id = capture_pane_id(window_target)
|
|
218
|
+
elsif session && skip_window_creation
|
|
219
|
+
# Pane already created by start_group
|
|
220
|
+
pane_id = tmux_info[:pane]
|
|
221
|
+
window_target = tmux_info[:window]
|
|
222
|
+
else
|
|
223
|
+
pane_id = nil
|
|
224
|
+
window_target = nil
|
|
225
|
+
end
|
|
173
226
|
|
|
174
227
|
if pane_id
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
system('tmux', 'send-keys', '-t', pane_id, start_cmd, 'Enter')
|
|
179
|
-
end
|
|
228
|
+
# Send each start command to the pane
|
|
229
|
+
combined_cmd = start_cmds.join(' && ')
|
|
230
|
+
system('tmux', 'send-keys', '-t', pane_id, combined_cmd, 'Enter')
|
|
180
231
|
else
|
|
232
|
+
combined_cmd = start_cmds.join(' && ')
|
|
181
233
|
if base_dir
|
|
182
|
-
system("cd #{base_dir} && #{
|
|
234
|
+
system("cd #{base_dir} && #{combined_cmd} &")
|
|
183
235
|
else
|
|
184
|
-
system("#{
|
|
236
|
+
system("#{combined_cmd} &")
|
|
185
237
|
end
|
|
186
238
|
end
|
|
187
239
|
|
|
@@ -189,8 +241,8 @@ class Hiiro
|
|
|
189
241
|
state = load_state
|
|
190
242
|
state[svc_name] = {
|
|
191
243
|
'pid' => nil,
|
|
192
|
-
'tmux_session' => tmux_info[:session],
|
|
193
|
-
'tmux_window' => tmux_info[:window],
|
|
244
|
+
'tmux_session' => session || tmux_info[:session],
|
|
245
|
+
'tmux_window' => window_target || tmux_info[:window],
|
|
194
246
|
'tmux_pane' => pane_id,
|
|
195
247
|
'task' => task_info[:task_name],
|
|
196
248
|
'tree' => task_info[:tree],
|
|
@@ -220,7 +272,7 @@ class Hiiro
|
|
|
220
272
|
info = running_services[svc_name]
|
|
221
273
|
pane_id = info['tmux_pane']
|
|
222
274
|
|
|
223
|
-
if svc[:stop]
|
|
275
|
+
if svc[:stop] && !svc[:stop].to_s.strip.empty?
|
|
224
276
|
stop_cmd = svc[:stop]
|
|
225
277
|
if info['pid']
|
|
226
278
|
stop_cmd = stop_cmd.gsub('$PID', info['pid'].to_s)
|
|
@@ -260,11 +312,16 @@ class Hiiro
|
|
|
260
312
|
info = running_services[svc_name]
|
|
261
313
|
pane_id = info['tmux_pane']
|
|
262
314
|
session = info['tmux_session']
|
|
315
|
+
window = info['tmux_window']
|
|
263
316
|
|
|
264
317
|
if session
|
|
265
318
|
system('tmux', 'switch-client', '-t', session)
|
|
266
319
|
end
|
|
267
320
|
|
|
321
|
+
if window
|
|
322
|
+
system('tmux', 'select-window', '-t', window)
|
|
323
|
+
end
|
|
324
|
+
|
|
268
325
|
if pane_id
|
|
269
326
|
system('tmux', 'select-pane', '-t', pane_id)
|
|
270
327
|
end
|
|
@@ -398,8 +455,6 @@ class Hiiro
|
|
|
398
455
|
|
|
399
456
|
tmux_info = {
|
|
400
457
|
session: ENV['TMUX'] ? `tmux display-message -p '#S'`.chomp : nil,
|
|
401
|
-
window: ENV['TMUX'] ? `tmux display-message -p '#I'`.chomp : nil,
|
|
402
|
-
pane: ENV['TMUX_PANE'],
|
|
403
458
|
}
|
|
404
459
|
|
|
405
460
|
task_info = {}
|
|
@@ -499,8 +554,7 @@ class Hiiro
|
|
|
499
554
|
'host' => 'localhost',
|
|
500
555
|
'port' => '',
|
|
501
556
|
'init' => [],
|
|
502
|
-
'start' => '',
|
|
503
|
-
'stop' => '',
|
|
557
|
+
'start' => [''],
|
|
504
558
|
'cleanup' => [],
|
|
505
559
|
}
|
|
506
560
|
|
|
@@ -606,6 +660,26 @@ class Hiiro
|
|
|
606
660
|
|
|
607
661
|
private
|
|
608
662
|
|
|
663
|
+
def current_tmux_session
|
|
664
|
+
return nil unless ENV['TMUX']
|
|
665
|
+
`tmux display-message -p '#S'`.chomp
|
|
666
|
+
end
|
|
667
|
+
|
|
668
|
+
def create_tmux_window(session, name, start_dir)
|
|
669
|
+
system('tmux', 'new-window', '-d', '-t', session, '-n', name, '-c', start_dir)
|
|
670
|
+
"#{session}:#{name}"
|
|
671
|
+
end
|
|
672
|
+
|
|
673
|
+
def capture_pane_id(window_target)
|
|
674
|
+
`tmux list-panes -t #{window_target} -F '\#{pane_id}'`.chomp.split("\n").last
|
|
675
|
+
end
|
|
676
|
+
|
|
677
|
+
def split_tmux_pane(window_target, start_dir)
|
|
678
|
+
system('tmux', 'split-window', '-d', '-t', window_target, '-c', start_dir)
|
|
679
|
+
system('tmux', 'select-layout', '-t', window_target, 'even-vertical')
|
|
680
|
+
`tmux list-panes -t #{window_target} -F '\#{pane_id}'`.chomp.split("\n").last
|
|
681
|
+
end
|
|
682
|
+
|
|
609
683
|
def load_config
|
|
610
684
|
return {} unless File.exist?(config_file)
|
|
611
685
|
YAML.safe_load_file(config_file, permitted_classes: [Symbol]) || {}
|
data/lib/hiiro/version.rb
CHANGED