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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 10f2a86eb2689dd8fa57d4f90c5dbb4cad8cdfff2607a0b382eb26a941a31775
4
- data.tar.gz: ac6de045418d116c85f336c2926bd8c959b6b52cd9d6493f30c29bcea59a90d8
3
+ metadata.gz: 98bf6f648f72277fb219044bd6f5a5e0c1320c21d122e8478cc4e6d6f7000a4b
4
+ data.tar.gz: 6308aa3432b0cf8e9f2fc3ca4fc66fb9075902fb3c421fad4d2dbd03f2105418
5
5
  SHA512:
6
- metadata.gz: eaf5e0269292073af2e4b2ea9015ed9ebb13376aa2756513d6a1eb14a84ea9706bf600159bbd38d72436f29ebcbdfb2b51e0994457949e3a7a921c704459e109
7
- data.tar.gz: 757f05788e7fa28a6a998a218cfaa8e672461a296e646f4919611138fc1d20054171eed3e054ae1bb5693ffb0e65f2b000be3c5f9523ad555f195fe1767f61f0
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
- members.each do |member|
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
- start(member_name, tmux_info: tmux_info, task_info: task_info, skip_env: true)
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
- pane_id = tmux_info[:pane] || ENV['TMUX_PANE']
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
- if base_dir
176
- system('tmux', 'send-keys', '-t', pane_id, "cd #{base_dir} && #{start_cmd}", 'Enter')
177
- else
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} && #{start_cmd} &")
234
+ system("cd #{base_dir} && #{combined_cmd} &")
183
235
  else
184
- system("#{start_cmd} &")
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
@@ -1,3 +1,3 @@
1
1
  class Hiiro
2
- VERSION = "0.1.150"
2
+ VERSION = "0.1.151"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hiiro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.150
4
+ version: 0.1.151
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Toyota