def self.running_load(code, filename, action = nil)
errors = ""
loaded_watches = []
unloaded_watches = []
jobs = []
begin
LOG.start_capture
Gem.clear_paths
eval(code, root_binding, filename)
self.pending_watches.each do |w|
if previous_state = self.pending_watch_states[w.name]
w.monitor unless previous_state == :unmonitored
else
w.monitor if w.autostart?
end
end
loaded_watches = self.pending_watches.map { |w| w.name }
self.pending_watches.clear
self.pending_watch_states.clear
self.watches.each do |name, watch|
next if loaded_watches.include?(name)
case action
when 'stop'
jobs << Thread.new(watch) { |w| w.action(:stop); self.unwatch(w) }
unloaded_watches << name
when 'remove'
jobs << Thread.new(watch) { |w| self.unwatch(w) }
unloaded_watches << name
when 'leave', '', nil
else
raise InvalidCommandError, "Unknown action: #{action}"
end
end
LOG.finish_capture
rescue Exception => e
errors << LOG.finish_capture
unless e.instance_of?(SystemExit)
errors << e.message << "\n"
errors << e.backtrace.join("\n")
end
end
jobs.each { |t| t.join }
[loaded_watches, errors, unloaded_watches]
end