require_relative './common'
require_relative './selector'
def escape_wildcard(s)
s.gsub('*', '\*')
end
class Option
attr_reader :pid, :run_id
def initialize(pid, run_id, msg)
@pid = pid
@run_id = run_id
@msg = msg
end
def to_s
"#{@pid} #{@msg}"
end
end
def wait_for_run_id(sourcing, wait_obj)
wait_id = wait_obj.map{ |obj| "--id #{obj.run_id}" }.join(' ')
cmd = "top --wait #{wait_id}"
if sourcing
commandline("#{HS_ENV.env_var(:cmd)} --no-alias #{cmd} && ")
else
warn "start waiting!"
HS_ENV.exec_hs(cmd, false)
end
end
self_run_id = HS_ENV.env_var(:run_id).to_i
top_msg = HS_ENV.do_hs("top #{escape_wildcard(ARGV.join(' '))}", false)
top_options = top_msg.lines.filter_map do |l|
arr = l.chop.split
pid = arr[0].to_i
run_id = arr[1].to_i
msg = arr[2..].join(' ')
if run_id == self_run_id
nil
else
Option.new(pid, run_id, msg)
end
end
selector = Selector.new
selector.load(top_options)
selector.register_keys(ENTER, lambda { |_, options|
}, msg: 'do nothing', recur: true)
selector.register_keys(%w[p P], lambda { |_, obj|
system("pstree -pT #{obj.pid}")
}, msg: 'print the ps tree')
wait_obj = []
sourcing = false
selector.register_keys_virtual(%w[w W], lambda { |_, _, options|
wait_obj = options
}, msg: 'wait for process to end')
selector.register_keys_virtual(%w[c C], lambda { |_, _, options|
wait_obj = options
sourcing = true
}, msg: 'wait for process to end, but in the next commandline')
begin
result = selector.run
unless wait_obj.nil?
wait_for_run_id(sourcing, wait_obj) unless wait_obj.empty?
end
rescue Selector::Empty
warn 'No existing process'
exit
rescue Selector::Quit
exit
end