class Launchy::Detect::Runner
Public Class Methods
Source
# File lib/launchy/detect/runner.rb, line 23 def self.detect host_os_family = Launchy::Detect::HostOsFamily.detect ruby_engine = Launchy::Detect::RubyEngine.detect return Windows.new if host_os_family.windows? if ruby_engine.jruby? then return Jruby.new end return Forkable.new end
Detect
the current command runner
This will return an instance of the Runner
to be used to do the application launching.
If a runner cannot be detected then raise Runner::NotFoundError
The runner rules are, in order:
1) If you are on windows, you use the Windows
Runner
no matter what 2) If you are using the jruby engine, use the Jruby
Runner
. Unless rule (1) took effect 3) Use Forkable
(barring rules (1) and (2))
Public Instance Methods
Source
# File lib/launchy/detect/runner.rb, line 46 def commandline_normalize( cmdline ) c = cmdline.flatten! c = c.find_all { |a| (not a.nil?) and ( a.size > 0 ) } Launchy.log "commandline_normalized => #{c.join(' ')}" return c end
Source
# File lib/launchy/detect/runner.rb, line 53 def dry_run( cmd, *args ) shell_commands(cmd, args).join(" ") end
Source
# File lib/launchy/detect/runner.rb, line 57 def run( cmd, *args ) raise Launchy::CommandNotFoundError, "No command found to run with args '#{args.join(' ')}'. If this is unexpected, #{Launchy.bug_report_message}" unless cmd if Launchy.dry_run? then $stdout.puts dry_run( cmd, *args ) else wet_run( cmd, *args ) end end
Source
# File lib/launchy/detect/runner.rb, line 40 def shell_commands( cmd, args ) cmdline = [ cmd.to_s.shellsplit ] cmdline << args.flatten.collect{ |a| a.to_s } return commandline_normalize( cmdline ) end
cut it down to just the shell commands that will be passed to exec or posix_spawn. The cmd argument is split according to shell rules and the args are not escaped because they whole set is passed to system as *args and in that case system shell escaping rules are not done.